文件上传漏洞所需的条件
一是文件可上传(感觉这一句是废话)。
二是上传文件路径可知,如果路径不可知就没法访问,亦无法配合诸如文件包含漏洞进行文件执行。
三是上传文件可以被访问。
四是上传文件可以被执行,当然这一步也不是必需的,比如配合文件包含漏洞。
绕过姿势
文件上传校验姿势
- 客户端javascript校验(一般只校验后缀名)
- 服务端校验
- 文件头content-type字段校验(image/gif)
- 文件内容头校验(GIF89a)
- 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
- WAF设备校验(根据不同的WAF产品而定)
0X00:前端js检查后缀名
(1)、禁用浏览器端的js功能
直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码。
(2)、Firebug修改源码
直接更改文件上传JS代码中允许上传的文件扩展名你想要上传的文件扩展名。
(3)、Burpsuite抓包修改后缀名
(4)、本地表单提交
0X01:服务端MIME类型检测 contentType
Burpsuite抓包修改contentType的值
0X02:目录路径检测
(1)、用0x00进行截断(php5.3.4以下+magic_qoute_gpc为off时,魔术符号会将 ’、”、null(%00)加反斜杠转义 )
(2)、在路径中设置一个.asp的文件,利用解析漏洞(IIS6.0+ASP解析漏洞)
将path变量的值改为x.asp
当文件夹名为XX.asp时,文件夹中的文件都会以asp的格式来解析,这是利用了IIS的解析漏洞
0X03:服务端扩展名检测
(1)、基于黑名单的检测
A、文件名大小写绕过
B、名单列表绕过 asp格式的,黑名单里面没有asa cer的
C、特殊文件名绕过
x.asp_ 下划线为一个空格(需要在burp里面改以绕过验证),windows会自动去掉后面的点和空格
D、0x00截断绕过
asp 程序有此漏洞 x.asp_.jpg(下划线为00截断符) 检测时gettype()从后往前,判定为jpg,保存时一00截断符为界,将asp最为后缀名存入。
E、htaccess文件重写
重写过滤规则,允许asp格式的
(2)、基于白名单的
A、0x00截断绕过
B、解析调用/漏洞绕过
5、服务端文件内容检测
0X03:文件内容检测
(1)、文件幻数检测(文件头)
JPG :FF D8
GIF:47 49 46
PNG:89 50 4E
在幻数后面加上自己的一句话就可
(2)、文件相关信息检测
图像文件 getimagesize() 只需要伪造好文件头就可 在文件首部加入GIF89a
(3)、文件加载检测
代码注入绕过:找一个空白区进行代码的填充
解决方案
1、文件上传的目录设置为不可执行
2、判断文件类型:强烈推荐白名单方式。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径:一个是上传后无法访问;再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名:由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。