0x00 漏洞概述
任意文件上传漏洞主要是由于程序员在开发文件上传功能时,没有考虑对文件格式后缀的合法性进行校验或只考虑在应用前端(Web 浏览器端)通过 javascript 进行后缀校验,攻击者可上传一个包含恶意代码的动态脚本(如 jsp、asp、php、aspx 文件后缀)到服务器上,攻击者访问该脚本时服务器将对包含恶意代码的动态脚本解析,最终执行相应的恶意代码。该漏洞最终将可能直接影响应用系统的服务器安全,攻击者可通过所上传的脚本完全控制服务器。
0x01测试方法
对文件上传页面进行测试,有多种上传测试方式判断是否存在任意文件上传漏洞。
方式一:直接上传
在上传过程中,直接选择动态脚本后缀的文件,如 asp、php、jsp、aspx 等文件格式,观察是否上传成功。
方式二:绕过JS上传
当上传页面在前端采用 javascript 进行文件后缀限制时,可通过 HTTP 抓包工具进行改包上传,如上传 jpg 后缀,通过HTTP 抓包工具捕捉到以下请求数据包,将数据包的 filename 参数值从 oneword_pass.jpg 修改为 oneword_pass.php 并重新进行上传提交即可绕过javascript 验证。
方式三:截断后缀上传
部分上传功能在对后缀名进行验证时存在缺陷,导致在文件写入过程中产生错误,导致可通过十六进制截断符(%00)对后缀进行截断。如下图,上传处理时将对检测到%00 并对.jpg 字符串进行截断删除,最终文件名为 oneword_pass.php 导致可成功上传动态脚本到服务器上。
方式四:绕过 Content-Type 检查上传
部分上传页面只对文件类型进行验证,导致可通过改包的方式上传动态脚本到服务器上。如下图,通过修改 Content-Type 的参数值为 image/jpg,程序将认为本次提交的为图片格式类型,并不进行后缀验证,最终成功绕过 Content-Type 检查上传动态脚本到服务器上。
0x02防护思路
1、前端,加强文件检查过滤,相关强度可以参考DVWA等级源码。
2、过程中,针对上传文件进一步做处理,如图片的价水印、缩略图,无异常后才保存到后台;针对文件命名做限制,须由系统生成,不允许用户自定义。
3、后台,限制上传文件目录无法直接访问,设置该目录不解析jsp等脚本语言。