文件上传漏洞绕过总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、客户端校验
一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
绕过方法
1.绕过前台脚本检测扩展名,就是将所要上传文件的扩展名更改为符合脚本检测规则的扩展名,通过BurpSuite工具,截取数据包,并将数据包中文件扩展名更改回原来的,达到绕过的目的。
2.如果是JS脚本检测,在本地浏览器客户端禁用JS即可。
可使用火狐浏览器的NoScript 插件、IE中禁用掉JS等方式实现。
二、服务端校验
1.Content-type字段校验
以PHP代码为例,模拟web服务器端的校验代码
1.<?php
2.if($_FILES['userfile']['type'] != "image/gif") #这里对上传的文件类型进行
判断,如果不是image/gif类型便返回错误。
3. {
4. echo "Sorry, we only allow uploading GIF images";
5. exit;
6. }
7. $uploaddir = 'uploads/';
8. $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
9.if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
10. {
11. echo "File is valid, and was successfully uploaded.\n";
12. } else {
13. echo "File uploading failed.\n";
14. }
15. ?>
绕过方法
可以通过抓包,将content-type为合法类型。
text/plain(纯文本)
text/html(HTML文档)
text/javascript(js代码)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(二进制数据)
application/pdf(PDF文档)
application/(编程语言) 该种语言的代码
application/msword(Microsoft Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(POST方法提交的表单)
multipart/form-data(POST提交时伴随文件上传的表单)
2.文件头绕过
服务端对上传文件头部或标志位进行检测。
绕过方法
给上传脚本加上响应的文件头字节欺骗服务端的文件头检测
1.GIF89a<?php @eval($_POST['666']);?>
3.文件后缀名绕过
1. 找黑名单扩展名的漏网之鱼-比如asa 和cer 之类
2. 可能存在大小写绕过漏洞-比如aSp 和pHp 之类
绕过方法:
1.老版本的IIS6中的目录解析漏洞,如果网站目录中有一个/.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析
2.老版本的IIS6中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,可以在上传的时候给后面加入分号内容来避免黑名单过滤,如a.asp;jpg
3.nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字节漏洞xxx.jpg%00.php 这样的文件名会被解析为php代码运行(fastcgi会把这个文件当php看,不受空字节影响,但是检查文件后缀的那个功能会把空字节后面的东西抛弃,所以识别为jpg)
4.apache1.x,2.x的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而
达到了注入php代码的目的。
4.其他绕过方法
1. 上传不符合windows文件命名规则的文件名
test.asp.
test.asp(空格)
test.php:1.jpg
test.php::$DATA
shell.php::$DATA......
会被windows系统自动去掉不符合规则符号后面的内容。
2.linux下后缀名大小写
3.0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
test.php(0x00).jpg
test.php%00.jgp
三、W AF绕过
1.垃圾数据
有些主机WAF软件为了不影响web服务器的性能,会对校验的用户数据设置大小上限,比如1M。
此种情况可以构造一个大文件,前面1M的内容为垃圾内容,后面才是真正的木马内容,便可以绕过WAF对文件内容的校验;
2.filename
针对早期版本安全狗,可以多加一个filename
3.POST/GET
有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。
此种情况可以上传一个POST型的数据包,抓包将POST改为GET。