Web安全之文件上传漏洞
2016-08-26 本文已影响981人
zksmile
文件上传#
1.原因:
由于文件上传功能实现代码没有严格限制用户上传的文件类型,导致攻击者通过各种手段绕过文件验证,上传非法文件
2.文件上传过程
PC主机(javascript检测) ---- http POST请求---- 服务器(MIME、目录路径、文件扩展名、文件内容等检测)
3.文件上传详细信息及绕过方法
3.1文件以http协议上传,将以 POST 请求发送至 web 服务器
3.2web 服务器接收到请求后并同意后,用户与 web 服务器将建立连接,并传输数据
3.3上传文件,检验文件类型
3.3.1通过客户端端验证(javascript 扩展名检测)
- 用反向代理工具(如burp 之类)修改文件扩展名或禁用 js 绕过客户端端验证
3.3.2服务端验证Content-type (Mime type) (http request 包检测)
- 用反向代理工具(如burp 之类)进行 Content-type 伪造
3.3.3服务端验证绕过(扩展名检测)
3.3.3.1黑名单检测
- 找黑名单扩展名的漏网之鱼 - 比如上面就漏掉了 asa 和 cer 之类
- 可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
- 特别文件名构造 - 比如发送的 http 包里把文件名改成 help.asp. 或 help.asp_(下划线为空格)
- IIS 或 nginx 文件名解析漏洞 - 比如 help.asp;.jpg 或 help.jpg/2.php
- 0x00 截断绕过 - 这个是基于一个组合逻辑漏洞造成的
- 双扩展名解析绕过攻击(1) - 基于 web 服务的解析逻辑
- 双扩展名解析绕过攻击(2) - 基于 web 服务的解析方式
- 危险解析绕过攻击 - 基于 web 服务的解析方式
3.3.3.2白名单检测
- 特别文件名构造 (同黑名单攻击第 3 条)
- IIS 或 nginx 文件名解析漏洞 (同黑名单攻击第 4 条)
- 0x00 截断绕过 (同黑名单攻击第 5 条)
3.3.3.3htaccess 文件攻击
- 在 PHP 安全没配置好的情况下,用自己的.htaccess 覆盖服务上原文件
3.3.4服务端验证绕过(文件完整性检测)
- 文件头检测
只校验了文件头和文件完整性
- 图像分辨率检测
在文件开始伪装图像大小数据
- 文件加载检测
用工具对文件空白数据区或注释区进行代码注入绕过
(图像仅能绕过渲染测试,而不能绕过二次渲染)
用恶意文件去攻击加载器本身
3.3.57.二次上传漏洞
最新的上传漏洞方法,主要是利用逻辑漏洞。程序代码只对第一次上传的文件进行验证,这样情况下第一次上传正常文件,第二次上传webshell,利用这个漏洞需要上传组件支持一次多文件上传。
3.3.6相互关系与组合情况
首先客户端端验证和服务端验证是相互独立的,所以分开绕过就行了
主要难点是在服务端验证的组合上
文件完整性检测已经包含文件头检测和图像大小及相关信息检测, 但不包含文件扩展名检测
它是以加载来作为检测的方式,比如用图像渲染函数去渲染一张图片
文件扩展名检测和文件头检测都是同级的,相互独立
所以如果是文件扩展名+文件头检测可以同时分开绕过
4.文件上传漏洞防御
4.1系统开发阶段的防御
代码中在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查,阻挡一些基本的试探。
服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过。
对截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。
4.2系统运行阶段的防御
使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。
定时查看系统日志,web服务器日志以发现入侵痕迹
定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。
总结:
对攻击者来说,文件上传漏洞一直都是获取服务器shell的重要途径。对系统维护人员来说,文件上传漏洞的巨大危害也无须赘述,积极学习,深入了解漏洞的相关知识可以更从容的面对这类攻击。