Upload-Labs wp

mind-map.png

一个上传漏洞总结的很全的靶场

因为最近效率比较低(难听点就是懒) 所以国光哥说

可以一天搞完这些东西然后写篇博客 逼自己一下

本来是应该一天搞完的结果学校停电了没网

QQ图片20190426163558.jpg

真的不是在找借口哈

不过也真的学到了很多新姿势呀。

Pass-01

猜测第一关应该比较简单前端验证

创建后缀为jpg的文件

Xnip2019-04-24_11-53-42.jpg

上传 抓包改后缀即可绕过

Xnip2019-04-24_11-56-29.jpg

Pass-02

第二题 也是比较常见的

猜测是验证content-type

于是修改content-type为jpg的类型 即可绕过。

Xnip2019-04-24_11-59-28.jpg

Pass-03

QQ截图20190426114844.png

上传一个php文件发现 黑名单上传 立即想到的就是大小写混合绕过

试了一下不可以 查看源码发现都被转换成了小写GG了

把后缀改为php3上传成功解析

QQ截图20190426120230.png

貌似是apache里面的设置 会把php3当作php去解析

第一次在mac下搭建环境却一直不能成功

还有另一种姿势 上传.htaccess

Pass-04

这就用到了前面说的.htaccess了

因为还是黑名单验证 我们可以上传一个.htaccess上去

内容为

1
2
3
<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>

把.jpg的文件当作php去解析

QQ截图20190426120144.png

Pass-05

还是黑名单验证 不过呢这里也过滤.htaccess

但是反过来观察一下 这里却没有进行大小写的转换 PhP直接上传

美滋滋

QQ截图20190426121657.png

Pass-06

还是黑名单验证

回头看看思维导图

黑名单验证里的空格绕过 这时候源码里并没有过滤空格 所以在.php后添加空格即可绕过

Pass-07

黑名单验证

这题最开始有点蒙 看了源码也没想到。。太菜了

偷偷看了网上的wp

忽略了本题没有对后缀进行去.的处理

利用windows的特性会自动去掉后面的.

上传07.php.即可绕过

QQ截图20190426124530.png

Pass-08

黑名单验证

这次发现了重点 没有去除字符串::$DATA

这种方法实战没用到过 ctf也没用到过

仔细查了一下涨姿势了

必须是windows, 必须是php
php在window的时候如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持”::$DATA”之前的文件名
他的目的就是不检查后缀名….

上传xx.php::$DATA发现无法找到此文件

windows会去掉::$DATA 直接访问xx.php即可

QQ截图20190426125751.png

Pass-09

到这里又没了思路。。

思维导图是个好东西。

最常用的陌生后缀解析漏洞都给忘了

我上传一个09.php.xxx

apache的特性从右往左依次解析 不认识的后缀会一直往左解析

无法解析xxx就解析成了php。上传成功

QQ截图20190426130942.png

Pass-10

到了10题以后源码上就没了注释了

这里我自己写一下注释也为了巩固一下php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");//黑名单

$file_name = trim($_FILES['upload_file']['name']);
//移除字符串两侧的空白字符。也就是这里为什么不能空格绕黑名单的原因喽
$file_name = str_ireplace($deny_ext,"", $file_name);//将问题后缀名替换为空
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}

读懂了源码

发现这才是重点

1
$file_name = str_ireplace($deny_ext,"", $file_name);//将问题后缀名替换为空

替换为空所以我们双写绕过

QQ截图20190426140902.png

QQ截图20190426140955.png

Pass-11

白名单验证

1
2
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file'
['name'],".")+1);

先介绍一下函数

1
substr(string,start,length)//返回stringstart开始的length长度
1
strrpos($_FILES['upload_file'['name'],".")//查找.在文件里最后一次出现的位置

回过头来看题 查找文件名中最后一个点后面的后缀 也就是说这行代码就防止了我们 双后缀名绕过

那么该怎么做呢

博客前面写过类似的方法

在路径上11.php后面进行截断后端则会认为11.php 是文件名 真实文件名被截断了所以改成11.jpg进行绕过即可

get会对%00进行自解码所以不用解码

QQ截图20190426144229.png

截断条件:
php版本小于5.3.4 详情关注CVE-2006-7243
php的magic_quotes_gpc为OFF状态

Pass-12

与上面题目类似

只不过这题save_path是通过post传输的

QQ截图20190426154635.png

post不会像get对%00进行自动解码 所以%00解码

Pass-13

QQ截图20190426154813.png

13题与前面都不同 上传图片马 然后利用文件包含漏洞 包含phpinfo

dos下命令制作图片马

1
2
3
4
5
6
copy 1.jpg /b + 1.php /a 13.jpg
参数/b指定以二进制格式复制、合并文件; 用于图像类/声音类文件
参数/a指定以ASCII格式复制、合并文件。用于txt等文档类文件
copy 1.jpg /b + 1.php /a 13.jpg
//意思是将1.jpg以二进制与1.php合并成13.jpg
那么2.jpg就是图片木马了。

QQ截图20190426155736.png

生成出来这时候利用文件包含漏洞 包含该文件即可

QQ截图20190426160102.png

jpg gif是一个道理的。

Pass-14

Pass-13是一样的突破方法

唯一不同的是getimagesize获取文件类型

我们直接上传的本来就是图片类型。所以姿势是一样的。

Pass-15

多了个php_exif模块来判断文件类型

突破方法与Pass-13一致

Pass-16

突破方法与Pass-13一致

QQ图片20190426163558.jpg

本来以为还是和前面方法一致但是文件包含的时候却不行

查看源代码发现考察的是二次渲染 姿势盲区了 故查了下资料(百度太垃圾什么也没有用google哦)

普通的图片马上传以后

经过imagecreatefromjpeg

函数二次渲染,图片尾部的php一句话被删除

看了一篇类似的文章 可以通过对比上传前后的图片内容

找到上传前没有改变的部分将一句话写道没有改变的这部分尝试一下

由于我这里没有16进制编辑器 就不尝试了 不过应该没有问题。。

google看到的copy过来 对渲染了解的少 需要多了解了解。

将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的。

Pass-17

考察条件竞争

如果你要问条件竞争是什么,可以看一下这篇文章

CTF中的条件竞争漏洞

关于条件竞争不怎么明白 Google了半天发现无法突破本关

于是厚着脸皮让国光哥来远程。。。涨姿势了

总结出来一句话利用burp批量发包 让程序措手不及

上传1.php抓包

1556373645543.png
1556373629324.png
1556373601185.png

线程设置高一点 开始不断发包 在我和国光哥的10分钟不断刷新下果然成功了。。。

产生原因将文件上传,然后判断后缀是否是图片,如果不是图片文件则将其删除。

Pass-18

条件竞争

利用Pass-17方法一样可以利用

但是我这边一直没有成功呢。。。姿势问题

Pass-19

到了这里发现越来越简单

move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过

1.png

感觉这题和12题有点类似