文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。文件上传功能本身是一个正常的业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。所以文件上传本身没有问题,但又问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做得不够安全,则会导致严重的后果。----摘自《白帽子讲WEB安全》
一、漏洞成立的条件
1、上传的文件能够被WEB容器解释执行。
2、用户能够从web上访问这个文件。如果文件上传了,但用户无法通过web访问,或者无法使得web容器解释这个脚本,那么也不能称之为漏洞。
二、常见防御措施及软肋
1、在前端验证文件扩展名
通过这种方式的验证,绕过方式有二:
(1)客户端禁用JS脚本
禁用JS脚本,这就使得验证文件的功能失效,用户可上传任意的文件。
(2)通过抓包改包方式
假如前端限制了只允许上传png格式的文件。我们首先将一句话木马文件后缀名更改为png后上传。此时会绕过前端js的验证,绕过验证后,通过抓包,修改报文中文件名的后缀,使其还原。显然,一句话木马上传成功。
2、在服务端验证文件类型
在服务端验证文件类型,一般是校验Content-type字段的值。同样,通过抓包改包可成功绕过其验证。
3、在服务端验证文件后缀名
(1)黑名单校验
黑名单校验方式极不靠谱,我们总会找到一些漏网之鱼,也有可能存在一些大小写绕过的方式。比如 aSp 和 pHp 之类的。
(2)白名单校验
白名单校验,其防御能力相对于黑名单校验,要更安全,增加了攻击者的攻击难度。但是白名单也有其软肋之处:如果服务器存在解析漏洞或截断,则会成功触发漏洞。如:
A:0x00 截断绕过
用像test.asp%00.jpg的方式进行截断,属于白名单文件。由于存在0x00,服务器会认为是asp文件。
B:解析/包含漏洞绕过
这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析,包含漏洞。
4、在服务端验证文件内容
验证文件内容,加大了攻击者的攻击难度。但在一定条件下,也有绕过的可能。其绕过方式有二:
(1)制作图片马
(2)文件幻术头绕过
三、总结
以上这些防御措施,如果在一定的限制条件下,是“安全的”。如果超过了安全边界,则会变得那么不安全。对于文件上传漏洞,我们只要知道它成立的条件,则可在一定程度上进行防御。其总结如下:
1、上传后的文件最好不可执行。
2、更改上传后的文件名,不与上传之前的文件名相同。
3、如非必要,不要暴漏文件的访问路径。