文件上传处理姿势
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
上传文件操作本身是没有问题的,关键在于文件上传到服务器后,服务器会如何处理和解释此文件。
-
1、JS检查绕过
网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
绕过方法:
(1)直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可
(2)先将文件重命名为js允许的后缀名,在用burp发送数据包时候改成我们想要的后缀。 -
2、黑名单处理绕过
如:不允许上传.asp,.aspx,.php,.jsp后缀文件
绕过方法:
(1)如果检测的时候不忽略大小写,可以通过大小写字符绕过 如.php->.PhP .htaccess->.HTACCESS
(2)blacklist中如果忽略了某些后缀,可通过解析特殊后缀进行绕过。
//如:jsp jspx jspf
asp asa cer aspx
php php php3 php4 pht
- 3、上传.htaccess
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
//当许多特殊后缀等都被列入黑名单时,但是没有限制.htaccess
$blacklist = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".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
这样所有的文件都会解析为php,接下来上传图片马即可
-
4、点绕过
windows会对文件中的点进行自动去除,所以可以在文件末尾加点绕过 -
5、::$DATA绕过
同windows特性,可在后缀名中加” ::$DATA”绕过 -
6、双写绕过
$blacklist = 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($blacklist,"", $file_name);
可以看到将文件名替换为空,我们可以采用双写绕过:例如:11.phphpp
- 7、MIME检查绕过
//这里检查Content-type,只允许通过image/jpeg、image/png、image/gif类型
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
可以通过burp抓包修改为该白名单内类型即可绕过
- 8、后缀白名单检测绕过:
常见的绕过方法有%00截断,服务器的解析漏洞
(1)%00截断漏洞:如果存在这类漏洞,那么后缀名的检测都可以绕过,此时我们可以如下命名一个上传文件
如:
test.php%00.jpg
路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
(2)服务器的解析漏洞
详情可以参考链接:https://www.secpulse.com/archives/95987.html
- 9、文件内容检查
(1)文件幻数(文件头)检测绕过
在木马内容的前面插入对应的文件头内容,例如:GIF89a ,更保险的方法是在可上传的文件中插入木马代码,然后修改后缀
比如图片类型的文件幻数如下,
要绕过jpg 文件幻数检测就要在文件开头写上下图的值:
Value = FF D8 FF E0 00 10 4A 46 49 46
要绕过gif 文件幻数检测就要在文件开头写上下图的值:
Value = 47 49 46 38 39 61
要绕过png 文件幻数检测就要在文件开头写上下面的值:
Value = 89 50 4E 47
然后在文件幻数后面加上自己的一句话木马代码就行了
(2)文件相关信息检测
图像文件相关信息检测常用的就是getimagesize()函数
只需要把文件头部分伪造好就ok 了,就是在幻数的基础上还加了一些文件信息
有点像下面的结构
GIF89a
(...some binary data for image...)
(... skipping the rest of binary data ...)
本次环境中的文件头检测,getimagesize,php_exif都可以用图片马绕过:
copy normal.jpg /b + shell.php /a webshell.jpg