一、漏洞概述
文件上传漏洞是指用户可以上传可执行脚本文件到服务器,并通过该文件执行服务器端命令。这种漏洞的产生主要是因为开发人员在上传点对文件名和文件内容未做严格过滤,导致攻击者可以上传恶意文件。
二、漏洞危害
1. 代码执行:上传的文件如果是Web脚本语言(如PHP、ASP、JSP),服务器的Web容器会解释并执行该脚本,导致攻击者可以在服务器上远程执行任意代码。
2. 病毒或木马传播:上传病毒或木马文件,用于诱骗用户或管理员下载执行,或者直接自动运行。
3. 控制策略文件:上传如Flash的策略文件crossdomain.xml等,黑客可借此控制Flash在该域下的行为。
4. 钓鱼欺诈:上传钓鱼图片或包含脚本的图片,在某些浏览器版本中会被作为脚本执行,用于钓鱼和欺诈。
5. 其他利用方式:如将上传文件作为入口,溢出服务器的后台处理程序,或者通过本地文件包含漏洞执行脚本等。
三、漏洞产生条件
1. 可执行路径:上传的文件能够被Web容器解释执行,且文件上传后所在的目录是Web容器所覆盖到的路径。
2. 可访问性:用户能够从Web上访问这个文件。
3. 内容完整性:上传的文件未被安全检查、格式化、图片压缩等功能改变内容,否则可能导致攻击不成功。
四、漏洞产生原因
1. 服务器配置不当:如允许上传的文件类型限制不严格,或者文件上传目录权限设置错误。
2. 开源编辑器漏洞:一些常用的Web编辑器可能存在未修复的上传漏洞。
3. 本地文件上传限制绕过:攻击者通过技术手段绕过本地文件上传的限制。
4. 过滤机制不完善:对上传文件的后缀、类型等过滤不严或被绕过。
5. 文件解析漏洞:利用服务器的文件解析漏洞使上传的文件被执行。
6. 文件路径截断:通过特定技术截断文件路径,使上传的文件位于可执行目录。
五、漏洞原理
大部分网站和应用系统都有上传功能,若实现代码没有严格限制用户上传的文件后缀及类型,攻击者可上传任意PHP等脚本文件到可通过Web访问的目录,并让这些文件被PHP解释器执行,从而在远程服务器上执行任意PHP脚本。攻击者还可上传病毒、木马、WebShell等恶意文件,为后续攻击提供便利。
六、上传文件检测流程
文件以HTTP协议上传时,通常会经过以下检测步骤:
1. 客户端JavaScript校验:一般只校验文件扩展名,判断方式是在浏览加载文件但还未点击上传按钮时弹出对话框提示允许的后缀名。
2. 服务端校验:对文件进行更全面的验证,包括文件头content-type字段校验(如image/gif)、文件内容头校验(如GIF89a)、目录路径检测、文件扩展名检测、后缀名黑名单或白名单校验、自定义正则校验等。
3. WAF设备校验:根据不同的WAF产品规则对上传文件进行检测。
七、漏洞绕过方法
(一)客户端绕过
1. 禁用JavaScript:通过火狐插件NOscript或禁用IE中JS脚本。
2. 修改代码:利用firbug插件元素审核修改代码,如删除校验事件或在javascript脚本中添加上传文件类型。
### (二)服务端绕过
1. 黑名单扩展名绕过
- 找漏网之鱼:如IIS6.0中的asa和cer。
- 大小写绕过:如在IIS6.0中上传aSp,在小于PHP5.3.29的Linux中上传pHp。
- 其他可解析扩展名:利用Web容器可解析的其他扩展名,如jsp、jspx、asp、cer等。
2. 黑名单特殊后缀名绕过:将文件名改为如php4等,前提是服务器配置允许。
3. 配合操作系统文件命名规则绕过
- Windows系统:利用文件名以“.”或空格结尾会被自动删除的特性,如上传test.asp.或test.asp(空格)。
- Linux系统:利用后缀名大小写敏感性,上传pHp后缀文件(前提是PHP版本小于等于5.3.29)。
4. 单双重后缀名绕过:如将文件名改为backlion.pphphph,使过滤后的字符串重新组合成php。
5. 服务端MIME文件类型(Content-Type)绕过:通过Burp Suite修改文件的Content-Type为允许的类型,如image/gif。
6. 配合文件包含漏洞绕过
- 运行上传文件包含脚本木马和一句话内容马:先上传txt后缀的木马文件,再上传包含该txt文件路径的php文件。
- 利用本地文件包含漏洞:上传符合条件格式的文档,内容为一句话木马,再利用文件包含漏洞包含该文件。
7. 修改URL参数绕过:观察URL中的参数,尝试修改数据进行绕过。
8. 双重文件上传绕过:构造特定的HTML表单,同时上传多个文件进行绕过。
(三)白名单绕过
1. 配合Web容器的解析漏洞:如IIS中的目录解析漏洞和分号解析漏洞,将文件名改为backlion.php.abc等。
2. %00截断上传绕过:将文件名改为bk.asp%00.jpg,使文件系统在读取时截断,达到攻击目的。
(四)突破文件路径绕过
利用程序对目录的判断和建立机制,修改表单中的目录参数值,将文件写入可执行目录。
(五).htaccess文件重写绕过
上传自定义的.htaccess和一句话图片木马,通过设置使特定文件名的文件被当作php执行。
(六)文件头内容检测绕过
使用一句话图片木马生成工具,在木马内容基础上添加合法的文件头信息,使文件通过检测。
(七)条件竞争上传绕过
利用多线程并发访问上传的文件,在上传文件到删除文件的时间段内尝试访问,以成功写入shell。
(八)CMS、编辑器漏洞绕过
针对不同CMS或编辑器存在的上传漏洞进行绕过。
(九)对渲染/加载测试攻击内容检查绕过
向图片中加入代码注入,使用一句话图片木马,使图片正常显示的同时包含恶意代码。
(十)带WAF的文件上传绕过
1. 填充垃圾数据绕过:构造大文件,前面为垃圾内容,后面为木马内容,绕过WAF对文件内容的校验。
2. filename绕过:添加额外的filename参数,调换filename的位置,或在filename后添加空格等。
3. POST/GET的更改方法绕过:将POST请求改为GET请求。
4. 删除实体里面的Content-Type字段绕过:删除Content-Type字段或修改其值。
5. 删除Content-Disposition字段里的空格绕过。
6. 增加一个空格绕过安全狗。
7. 修改Content-Disposition字段值的大小写绕过。
8. Boundary边界不一致绕过。
9. 文件扩展名出回车绕过。
10. 多个Content-Disposition绕过。
11. 利用NTFS ADS特性绕过。
12. 文件重命名绕过。
13. 特殊的长文件名绕过。
14. 反删除绕过。
15. Windows特殊字符绕过。
16. exee扩展名绕过。
17. 去掉引号绕过。
18. 删除Content-Disposition值的form-data绕过。
19. 多个分号绕过。
20. 在boundary前添加任意字符绕过。
21. name和filename添加任意字符串绕过。
22. head头的content-type:tab绕过。
23. head头的content-type: multipart/form-data改成大写绕过。
24. head头的Content-Type: multipart/form-data;\n绕过。
25. content-disposition:\n绕过。
26. 特殊扩展名绕过。
27. ASCII > 127的字符绕过。
28. 程序与服务器之间的差异绕过。
29. 利用协议解析不一致绕过。
八、漏洞修复措施
1. 服务器配置不当:重新配置服务器,修复HTTP请求方法(PUT)等相关配置。
2. 开源编辑器上传漏洞:更新到已修复漏洞的编辑器版本。
3. 本地文件上传限制被绕过:在服务器后端对上传的文件进行严格过滤。
4. 文件解析漏洞导致文件执行:参考文件上传的相关安全配置修复文件解析漏洞。
5. 设置文件上传的目录设置为不可执行:确保上传目录下的文件无法被Web容器解析执行。
6. 判断文件类型:结合使用MIME Type、后缀检查等白名单方式判断文件类型,对图片等文件进行压缩或resize处理,破坏可能包含的恶意代码。
7. 使用随机数改写文件名和文件路径:增加攻击者访问上传文件的难度,防止特定命名的恶意文件被执行。
8. 单独设置文件服务器的域名:利用浏览器同源策略,防止一系列客户端攻击,如XSS等。
总结
文件上传漏洞是Web应用中常见且危害较大的漏洞之一。开发人员在实现文件上传功能时,必须对文件名、文件类型、文件内容等进行严格的验证和过滤。同时,服务器的配置和安全措施也至关重要。通过综合运用多种安全策略,如严格限制上传文件的类型、大小,对文件内容进行杀毒扫描,设置合理的文件存储路径和权限,监控上传日志等,可以有效降低文件上传漏洞的风险,保障Web应用的安全性。此外,定期对系统进行更新和维护,及时修复已知的安全漏洞,也是防止文件上传攻击的重要手段。