点击提示:
提示我们该文件类型不允许上传,应该是前端对文件类型进行了验证。
对于前端验证,我们有多种方法可进行绕过:但burp抓包方便快速。
这里直接修改文件后缀名为白名单中的后缀名,然后抓包进行修改
直接将文件名改为1.php,然后进行上传
如图,表示上传成功。
提示表示:本pass在服务端对数据包的MIME进行检查!
MIME是HTTP头文件中的Content-Type类型,如果上传的是PHP文件的话,对应的Content-Type就是text/html,而如果是合法上传的jpg文件的话,Content-Type就是image/jpg。
服务器在接收到请求时,会对Content-Type进行判断,合法则进行后续流程,不合法则终止上传。
对于MIME检测,我们可以使用burpsuite进行抓包修改,可以修改文件类型,然后抓包修改为php,也可以修改Content-Type为合法的Content-Type。
这里我们选择了修改文件后缀名,然后上传,抓包,修改后缀名,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlXRKmlS-1647923609101)(文件上传漏洞靶场–upload-labs通关过程.assets/image-20220124205816323-16430290977861.png)]
可以看到upload路径已经有了2.php,表明上传成功。
提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件
**注意:php语言除了可以解析以php为后缀的文件,还可以解析php2,php3、php4、php5这些后缀的文件。**如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过。这里我们直接上传一个.php5文件
结果如图
提示:本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf后缀文件!
.htaccess文件内容
SetHandler application/x-httpd-php
AddType application/x-httpd-php .jpg #将.jpg后缀的文件作为PHP文件解析
上传一个.user.ini文件, php.ini是php默认的配置文件,其中包括了很多php的配置,而.user.ini实际上就是一个可以由用户“自定义”的php.ini,内容为:
auto_prepend_file=5.png
.user.ini配置参考的PHP 通过.user.ini 绕过黑名单限制,在.user.ini设置auto_prepend_file属性
下方的配置的意思是在.user.ini相同的目录下,所有的php文件都包含5.png这个文件
所以之后我们就可以利用到readme.php包含一个我们上传的木马文件,再连接readme.php文件达到连接一句话木马的目的
查看源码:
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
发现没有检测大小写(下面这个函数)
$file_ext = strtolower($file_ext); //转换为小写
去除对文件后缀名的转为小写设定,于是直接选择后缀名为.Php
等非黑名单中存在的格式上传。
去除了对文件后缀名的空格过滤,选择后缀为.php
的一句话上传,抓包后在后面增加空格,成功绕过
去除了对文件后缀名的点号过滤,选择选择后缀为.php的一句话上传,抓包后在后面增加点,成功绕
去除了对字符串:: D A T A 的 过 滤 , 选 择 选 择 后 缀 为 ‘ . p h p ‘ 的 一 句 话 上 传 , 抓 包 后 在 后 面 增 加 ‘ : : DATA的过滤,选择选择后缀为`.php`的一句话上传,抓包后在后面增加`:: DATA的过滤,选择选择后缀为‘.php‘的一句话上传,抓包后在后面增加‘::DATA`,上传成功。
查看源码后,发现其路径拼接的是$file_name
而不是$file_ext
,而$file_name
只处理了文件名末尾的点
查看源码后,发现其对存在黑名单中的字符进行替换,但str_ireplace()
函数只替换一次,因此修改文件名为11.pphphp
后成功绕过。
查看源码和提示,上传路径可控,并且是最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。原理是:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
与Pass-12的区别是这里使用POST传地址,POST不会对里面的数据自动解码,需要在Hex中修改。
上传图片马,查看源码后,意思是:读取上传文件的前两个字节内容,unpack
解码后,使用intval
转换为10进制,默认为10进制,根据转换后的结果判断图片类型。
copy 1.png /b + shell.php /a webshell.jpg