1 上传漏洞危害介绍
上传是Web中最常见的功能,如果上传功能存在设计、编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题,攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可以连接和操作对应的数据库,还可以通过操作系统漏洞、配置缺陷、信息泄露进行提权,获取操作系统提权,因此上传功能是Web安全测试中重点关注的高风险模块。
2 上传漏洞原因分析
上传漏洞形成的原因,主要由以下几种情况:
2.1 无安全防护措施,可以直接上传脚本
漏洞原因:上传功能未考虑安全问题,可以任意上传*.asp、*.aspx、*.php、*.jsp等可执行的脚本文件,不需要任意的绕过就可以直接获取Web权限。
原因分析:上传功能一定要考虑上传的安全性,需要理解上传漏洞的危害和风险。
2.2 采用黑名单扩展名,导致过滤不严格
漏洞原因:上传文件判断文件扩展名时,采用了黑名单机制,只是禁止*.asp、*.aspx、*.php、*.jsp这种已知的可执行文件扩展名,但没有限制*.cer、*.asa、*.PHP、*.JSP这类扩展名,从而导致过滤不严格,形成上传漏洞。
原因分析:上传文件判断扩展名时,应该采用名单机制,例如业务需要上传用户头像照片,那么我们可以写一个数组,只允许.jpg、.gif、.png、.bmp这些文件,当攻击者上传不在白名单中的文件扩展名时,应禁止上传并提示扩展名不正确。
2.3 仅通过客户端判断,存在绕过限制的漏洞
漏洞原因:上传文件判断文件类型时,通过客户端语言JavsScrip判断文件大小、类型和扩展名,上传白名单仅在JS中实现,而客户端过滤很容易通过工具绕过限制,达到攻击的目的。
原因分析:可以通过JS来判断文件大小、类型和扩展名,这样可以提高效率和应用性,但还需要在服务器端进行判断,服务器端判断是指通过php、jsp脚本代码来判断。
2.4 上传设计未考虑解析器的安全,导致发生解析漏洞
漏洞原因:上传设计时使用了白名单机制,但允许用户控制上传文件的文件名和保存文件时上级文件夹的名称。
原因分析:尽量避免用户可以操控上传到服务器的文件名称、上级文件夹名称,如果用户可以控制上级文件夹名称,那么需要对文件夹名称进行过滤,禁止上传携带特殊符号的文件目录,防止攻击者生成畸形的文件名而导致解析漏洞。例如:在IIS 6.0中,会将/hack.asp/test.jpg当成asp解析,因此必须要对test.jpg上级所有目录进行过滤(如果用户可以新建文件夹等场景,表示用户可以控制hack.asp这个值),避免解析漏洞。
2.5 Web容器配置漏洞,使用不安全HTTP方法实现上传攻击
漏洞原因:Web容器支撑PUT、MOVE、COPY等不安全的HTTP方法,但权限配置存在问题,导致攻击者可以通过PUT、COPY、MOVE上传脚本文件。
原因分析:尽量避免使用不安全的HTTP方法,如果是业务需要(例如REST接口),尽量使用原生态的类和方法,避免二次开发、扩展过程中出现上传漏洞,严格上讲这类不安全的HTTP方法,属于配置漏洞,因此不在本次讨论范围内。
2.6 第三方编辑器漏洞,例如FCK、eWebeditor
漏洞原因:很多产品使用了FCK、eWebeditor编辑器,方便富文件上传和管理,而这些编辑器版本较多,很多低版本本身就存在上传漏洞,因此也是上传漏洞的重灾区。
作者:jz