upload-labs是专门针对文件上传的靶场。总共21关,现在搬起小板凳,让我们一起来学习吧!
靶场环境安装
这里为了方便,我们直接在Windows下用phpstudy来搭建。(Linux环境或php版本过高,可能导致某些关卡不能顺利通过。)
Pass-01
我们直接在kali中生成一个php shell。
<?php
eval($_GET['a']);
?>
我们直接尝试上传php。提示不是图片格式!
审查元素,发现有js对上传做了限制,换句话来说就是进行了前端限制。我们将相应的js语句删掉,或者将js禁用。便可直接上传。
Pass-02
我们首先在源码中发现,在上传过程中,将信息头的 Content-Type
字段限制在了 image/jpeg
,我们需要用burp进行抓包,修改信息头就行了。
即,将Content-Type: application/x-php
修改为Content-Type: image/jpeg
Pass-03
通过查看源码,我们可以看到,将文件的后缀名进行了限制
$deny_ext = array('.asp','.aspx','.php','.jsp');
但是,在php中,.php3、.php4、.php5、.pht、.phtml、.phps 的文件都会被解析为 php 文件。
因此,我们需要将原来的kali.php
改为kali.phtml
即可。当然这种方法也只有低版本的php中才能复现。
Pass-04
通过查看源码,我们发现能把禁用的后缀都禁用了。
这时,我们要使用 .htaccess
文件实现攻击。
# 将后缀名为 h-t-m 的文件解析为 php 脚本执行
AddType application/x-httpd-php .h-t-m
# 将后缀名为 h-t-m 的文件用 php处理器 来处理,效果同上
AddHandler php5-script .h-t-m
# 将所有文件解析为 php 脚本执行
SetHandler application/x-httpd-php
将文件直接修改后缀名为 .h-t-m
,配置文件内输入上述指令且保证文件名为 .htaccess
即可。
Pass-05
仔细观察黑名单,会发现后面几关的黑名单都比这一关多了一个 .ini
。php.ini
是 php 的配置文件,.user.ini
中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。
准备文件:创建 .user.ini
文件,内容为:
auto_prepend_file=520.h-t-m
修改文件的文件名为 kali.h-t-m
和上关一样。上传即可!
Pass-06
仔细观察黑名单,发现漏掉了大写的PHP
修改后缀名为kali.PHP
上传即可。
Pass-07
在 Burp Suite 中打开靶机,直接上传备好的木马文件,抓包并在上传的文件名末尾加上一个空格。
Pass-08
通过阅读代码,我们发现了这句
$file_name = deldot($file_name);//删除文件名末尾的点
值得注意的是由于后续语句都基于最后一个点所提取出来的后缀名做的操作,而该语句的删除也导致后缀名提取为空,即 .php. 中最后一个点后面所接的后缀名为空。因此,我们需要在在 BurpSuite 中上传文件抓包修改文件名,只需要在最后加上一个点即可.
Pass-09
通过观察源码,少了
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
关于 ::$DATA 的作用,在 Windows 系统中只会以 ::$DATA 前的数据当作文件名。因此,如果文件名为 h-t-m.php::$DATA 则后缀名不会与黑名单匹配,但是系统也依然会正确执行!
在 BurpSuite 中打开靶机,上传文件抓包修改文件名,只需要在最后加上 ::$DATA 即可:
Pass-10
在Windows中, .php.
执行时却因为自动忽略而变成 .php
。因此将文件的后缀名修改为 .php. .
Pass-11
直接查看源码,重点在这句:
$file_name = str_ireplace($deny_ext,"", $file_name);
那就直接将文件后缀名改成 .pphphp
上传即可。
Pass-12
当我们上传一个 jpg 文件,并且指定的路径 save_path 为 ../kali.php%00
,连之后就会变成 ../kali.php%00/[随机数].jpg
. 而这段字符串在 %00
就已经被截断了,因此原本将文件上传至 jpg 文件的语句就变成的将文件上传至 kali.php 文件中。
Pass-13
打开 BurpSuite 上传上一关相同的文件(以 .jpg 后缀作为伪装的 php 文件),我们可以在 Raw 模式下编辑好路径,最后留下一个字符便于我们修改,这里预留一个 / 字符:在二进制(Hex)中找到对应字符,将其修改为 00 即可:
Pass-14
制作图片🐎就行了。
copy [图片文件名] /b + [shell文件名] /a [合成后的文件名]
Pass-15
利用Pass-14 的方法,将文件上传靶机,成功。
Pass-16
这关需要开启对应的php模块,才能成功。在 phpstudy 中自带的 php 版本中直接勾选 php_exif
模块即可,也可能叫 exif
上传图片🐎后,利用include.php?file=图片路劲
加载即可。
Pass-17
重渲染用到的 imagecreatefrom*
函数需要 GD
库的支持,在 phpstudy 中只需将 php_gd2
勾选即可
Pass-18
在 Burp Suite 中打开靶机,直接上传文件抓包,右键 send to Intruder
.在 Intruder 下的 Positions 页面就可以看到我们上传文件抓到的包了,现在我们只需一直发送这个包即可。首先在 Positions 页面点击 clear §
其中 §
用于包裹有效荷载,由于我们不需要修改,因此删除 §
.之后转到 Payloads 页面修改 Payload type 同样因为我们不需要修改有效荷载,因此选择 Null payloads.
之后该页面就会多一个条目 Payload Option [Null payloads],这里选择 Continue indefinitely,
后点击右上角橙色按钮 Start attack 即开始运作,从而实现上传。
Pass-19
构造一个 .ppt 文件,在原文件后直接添加后缀 .ppt 即可,在 Burp Suite 中打开靶机,上传文件,抓包后发送至 Intruder,具体步骤与 Pass-18 中相同,这里稍加概括,Clear $ 后设置 Payloads 为 Null payloads,并选择 Continue indefinitely 以无限重发,最后在 Resource Pool 中设置适当的最大并发请求数 Maximum concurrent requests 即可 Start attack .
Pass-20
直接在文件名末尾加上 /.
Pass-21
Burp Suite 抓包!由于有 MIME 检查,因此原文件名应伪装为合法图片文件。
在 save_name 变量名后加上 [0] 即可,其中 0 表示数组第一个元素,同样后续元素定义则使用 save_name[x] 其中 x 为对应索引。
总结
由于笔者环境问题,部分关卡在实验时没有成功。在文中仅提供了思路供参考。当然方法应该比较多,大家可以自行查阅资料。本文仅供参考!
One comment
感谢分享