靶场搭建
对php和apache版本有严格要求,建议使用phpstudy2018 并且使用设置php版本为5.2.17,这个靶场比较老了,如果要复现的话,必要严格按照要求来使用,博主使用最新版的phpstudy在某些靶场上未能成功复现,所以浪费了很多时间。。。。。
Upload-Labs 环境要求
操作系统:windows、Linux
php版本:推荐5.2.17(其它版本可能会导致部分Pass无法突破)
php组件:php_gd2,php_exif(部分Pass需要开启这两个扩展)
apache:以moudel方式连接
项目地址:https://github.com/c0ny1/upload-labs
强烈建议使用phpstudy2018 ,php版本为5.2.17来搭建靶场:
Pass-01 前端js绕过
前端js检测,需要上传白名单后缀文件
方法一:
先修改webshell文件为可上传的白名单,再抓包修改后缀
将文件后缀修改为php:
上传成功:
访问文件地址:
方法二:
在浏览器设置中禁用js即可
Pass-02 MIME绕过
上传一句话木马,提示文件类型不正确
根据源代码我们可以发现,这一关是常见验证中的文件类型验证,也就是验证MIME信息
修改Content-Type字段的值:
成功上传访问:
Pass-03 ::$DATA绕过
上传一个php文件提示,不允许上传某些后缀文件,可知这关是黑名单绕过:
方法一:
可以尝试上传可解析的不同后缀的php文件,例如php2 php3 php4 php5 phtml
注意:如果想要解析这类php文件,在配置文件中设置一些内容,存在一定限制,不然可能上传过去,服务器并不能解析,这与php版本和apache版本也有一定关系
需要配置,例如:
方法二:双写 ::$DATA
在window的时候如果文件名+"::$DATA
"会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,他的目的就是不检查后缀名
例如:"phpinfo.php::$DATA
"Windows会自动去掉末尾的::$DATA
变成"phpinfo.php
"
::$D::$DATAATA 双写
冰蝎连接:
Pass-04 .htaccess文件绕过
未对.htaccess文件进行限制
.htaccess 文件(或者“分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法。它里面可以存放Apache服务器配置相关的指令。
先上传.htaccess文件,内容如下:
.htaccess
<FilesMatch "as.png">
setHandler application/x-httpd-php
</FilesMatch>
再上传一个as.png文件,文件内容就填phpinfo即可,上传之后成功解析访问:
Pass-05 构造后缀
查看源码:
这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .
说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php.
由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功。如下图:
构造后缀.php. .中间是一个空格,即达到了绕过黑名单,又经过检查使得脚本木马可以解析
注意:例如这种5.php.
文件,后面有一个点,系统会自动去掉这个点,所以文件上传过去就变成了5.php
,在验证过程中恰好因为最后的点而绕过。
Pass-06 大写后缀绕过
查看源码:发现没有强制将大写转换为小写
再根据提示,不要构造出现黑名单中的后缀名,可以构造文件:6.PHP
成功上传:
访问:
Pass-07 构造后缀
查看源码提示:相比于之前没有对首位去空
构造文件名:phpinfo.php
,注意在最后有一个空格
访问如下:
Pass-08 后缀加点绕过
查看源码,发现没有删除文件末尾的点
构造文件名:8.php.
成功上传访问:
Pass-09 ::$DATA绕过
根据源码,发现没有对::$DATA
过滤
构造文件名为:phpinfo.php::$DATA
,成功上传:
访问:
Pass-10 与第五关一样
第十关和第五关一样,第五关怎么玩,第十关就怎么玩。
Pass-11 双写后缀
有些网站代码中,会将文件后缀符合黑名单列表的字符串替换为空。比如上传“index.php”变为“index”。
查看源码:
第十一关也是黑名单的绕过,他的意思是如果你上传了上面规定的文件,他就会把你的后缀名去掉,比如你上传了11.php,那么他就会把你的php过滤掉。文件没有了后缀名,自然也就无法解析了。但是他是一次过滤,也就是说我们写两个php就可以了
抓包双写后缀绕过
11.pphphp
上传成功,成功访问:
黑名单绕过总结
这些全部为黑名单绕过,而且只是验证一次,所以这些关卡全部可以用一个思路解出来,那就是.php. .
都是可以这样的,但是这就违背了创建靶场者的心思,靶场也就失去了意义,发挥不出靶场真正的作用。大家知道有这么一回事就可以了。所以大家还是按照本篇老老实实打一遍,通关不是目的,让知识得到巩固才是目的。
Pass-12 %00截断
第十二关我们看代码,可以得知是一个白名单,只允许上传'jpg','png','gif'
格式的文件。但是上传路径是可以控制的,可以使用%00
进行截断。%00
只能用于php版本低于5.3
的。这里我们需要把phpstudy切换一下版本,把magic_quotes_gpc
关闭,以phpstudy为例。其他选项菜单---php扩展及设置---参数开关设置---把magic_quotes_gpc
关闭。
成功上传:
访问文件地址:
注意:为什么修改path才可以?
因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。那么,攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/20190818.jpg
移动文件的时候会将文件保存为:uploads/aaa.php从而达到Getshell效果。
Pass-13 00截断
第十三关和第十二关是差不多的,只不过是接受值变成了post,她两的差别呢就是get会自行解码,post不会自行解码,我们需要对%00进行编码,选中%00右键,按下图操作来
方法一:
抓包后在test13.php
后加一个空格
16进制查看修改,将空格20
改为00
(70后边)
已经成功上传了
访问如下:
方法二:
已经成功上传了,%00因为编码而显示不出
访问如下:
Pass-14 图片马
第十四关是用图片+php代码,组成一个图片码进行上传,当然要想解析出来这个图片,还得有这个包含漏洞。我们看到,他已经说了,网站存在包含漏洞
点击访问:可知这里有一个文件包含漏洞
首先制作一个图片码,可以直接用Notepad直接打开图片后面加一个php代码,但是需要16进制,要不然图片可能出错。
可以cmd进行生成,命令语句:copy aaa.jpg/b + test.php/a shell.jpg 如图所示,我们在上传这个生成后的图片。
上传之后访问:
http://192.168.98.134/upload-labs-master/include.php?file=./upload/2420240711225048.jpg
Pass-15 图片马
第十五关我们要了解一个函数
我们来看这个 getimagesize函数,这个函数的意思是:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的
所以这关还是用和14关一样的方法,生成带有php代码的图片上传,配合包含漏洞拿下此关。
使用16进制编辑器打开一个图片,在图片后面插入WebShell 或者cmd下执行(必须在当前目录):
copy aaa.jpg/b + test.php/a shell.jpg
访问:
Pass-16 伪造图片头
这一关需要开启php_exif ,不开这个的话,这关做不了
看源码
这里使用exif_imagetype
函数来检查是否是图片,这里说一下exif_imagetype
,它是读取一个图像的第一个字节并检查其签名。所以也是可以通过伪造图片头来进行绕过的。这里同样伪造gif的图片头,来进行上传,如下
访问:
Pass-17 二次渲染
第十七关主要是把二次渲染绕过
imagecreatefromjpeg()
函数
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
进行通关
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了。
我们把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。
使用HxD Hex Editor进行比较
下载地址:https://mh-nexus.de/en/hxd
然后比较:
将上传之后的图片下载与源图片比较:
找到未修改的部分,插入webshell代码:
成功上传访问:
Pass-18 条件竞争
看源码
这里的代码逻辑是先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除。这样就存在一个安全问题,那就是我同时上传多个相同文件,在它删除之前访问就可以了。也就是条件竞争问题。可以借助burp的暴力破解模块。
Pass-19 条件竞争
这关是检查了后缀名,然后上传,然后在进行二次渲染。这时我们只能上传图片马,而且得配合解析漏洞进行通关
操作和18关的一样,就是访问地址是加上包含漏洞的。
Pass-20 %00
截断
20关是两种通关方法
第一种
move_uploaded_file()
函数中的img_path
是由post
参数save_name
控制的,可以在save_name
利用%00
截断(注意php版本低于5.3)。如图:
注意%00
已经编码之后没有显示出去,其实那里是有的:
第二种
move_uploaded_file()
有这么一个特性,会忽略掉文件末尾的 /.
所以我们把他修改为如图所示
成功访问:
Pass-21 数组绕过
查看源码:
根据代码逐步分析,
- 首先第五行,使用mime验证,可以通过抓包修改
- 第10行是一个3元表达式,如果save_name的值为空,就取
$_FILES['upload_file']['name']
的值,否则就是自身 -
end()
函数将 array的内部指针移动到最后一个单元并返回其值 -
reset()
函数将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值 -
count
函数返回数组$file
中的元素数量
所以我们构造数组save_name
来绕过,如下图:
save_name[0]=21.php
, save_name[2]=jpg
,$ext=jpg
过白名单,reset($file)=21.php
$file[1]=null
,这样就成功上传pass21.php.
(windows多个点不影响)
抓包测试。上传成功。
访问:
标签:文件,后缀,题解,upload,labs,Pass,绕过,php,上传 From: https://www.cnblogs.com/itchen-2002/p/18297809/uploadlabs-shooting-range-full-question-sol