公司项目重构-Web安全-文件上传漏洞

目录

  • 1、背景介绍
  • 2、攻击原理
  • 3、防范手段
    • 1)、做好文件类型检查(重要)
    • 2)、最好对图片进行压缩或resize
    • 3)、使用随机数改写文件名和文件路径(根据公司需求)
    • 4)、设置单独文件服务器和域名(重要)
    • 5)、检查病毒木马、色情、反政府等文件

如时间有限,可直接阅读防范手段一节。

1、背景介绍

今年开始公司准备对项目做部分重构,其中安全性问题首当其冲,除了已知的问题外,还需要发散思维,尽可能找出更多的潜在问题。期间发现一本非常好的书《白帽子讲Web安全》,感谢吴翰清大佬,读完本书让我对web安全有了更深刻的理解,强烈推荐大家阅读。

我打算记录下整个安全性重构的过程,相关知识点大部分会摘抄自《白帽子讲Web安全》,因为总结的很到位了,最后记录下公司内采用的防范手段(敏感信息不会书写)。

2、攻击原理

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获取了执行服务器命令的能力(webshell)。
主要看文件上传后,服务器怎么处理、解析文件,如果处理逻辑不安全,则可能会带来问题。

常见的安全问题如下:
1、上传的文件是web脚本语言,服务器的web容器解析并执行了用户上传的脚本,导致代码执行
2、上传文件是Flash的策略文件crossdomain.xml(或其他修改策略文件的情况)
3、上传文件是病毒、木马,诱骗用户或管理员下载执行
4、上传文件是钓鱼图片或包含了脚本的图片,在某些低版本浏览器下会被作为脚本执行,被利用钓鱼或欺诈

多数情况下,以上漏洞都指”上传web脚本能够被服务器解析“的问题,那需要具备以下几个条件:
1、上传文件能够被web容器解释执行,所以上传文件所在目录必须是web容器所覆盖的目录
2、用户能访问上传的文件,不然没办法访问更无法执行了
3、上传的文件不能被格式化、图片压缩等处理而改变内容

本书还讲了可以绕过文件上传检查的手段
1、对于判断后缀名验证文件的网站,可以修改上传过程的POST包,在文件名后添加%00字节,比如:xxx.php[\0].JPG([\0]是十六进制的0x00字符),可能会绕过应用的类型判断(修改post包),但在c或php等语言中0x00被认为是终止符,最终被截断当成php文件解析。
2、对于通过上传文件的文件头来验证的,浏览器的MIME Sniff功能就是通过读取文件前256个字节来判断文件类型的,攻击者可能伪造一个合法的文件,将真实的PHP等脚本代码附在合法的文件头之后,但容器需要当做php文件来解析,在特定环境下可能会奏效。
3、利用web容器的功能攻击的
4、利用上传文件钓鱼,比如构造假的图片http://…/item.jpg,但实际上内容确实js脚本:

png

第一行的png是伪造的文件头,绕过上传时的文件类型检查。
这个方法在低版本的ie6、ie7和ie8的兼容模式,浏览器会缺陷的将文件当成html执行,后来微软才在ie8中增强的MIME Sniff。

3、防范手段

1)、做好文件类型检查(重要)

可以结合MIME Type、后缀检查等方式判断文件类型。
如果要限制上传的文件类型,建议采用白名单的方式配置允许的类型,因为黑名单可能会漏掉或后期不及时更新。建议公司封装公共的上传组件(前端+后端)代码,避免让技术人员单独实现。

2)、最好对图片进行压缩或resize

对图片进行压缩,以破坏图片中可能包含的HTML代码。如果不需要保存原图的话,可以对图片进行压缩减少大小。

3)、使用随机数改写文件名和文件路径(根据公司需求)

可以增加攻击成本,比如使上传策略文件的攻击失效(如flash的crossdomain.xml文件)。但会导致文件名展示不友好,有些场景是需要显示原文件名的,可将用户上传的文件名保存到数据库中,我们的做法是将上传的所有文件信息由单独的数据表保存(原文件名、访问url、上传时间、上传人等字段)。

4)、设置单独文件服务器和域名(重要)

应该将文件保存在专门的文件服务器上,做静态文件处理,一方面方便利用缓存加速,另一方杜绝脚本执行的可能。并为文件服务器配置单独域名可利用浏览器同源策略的关系,让部分攻击失效。

5)、检查病毒木马、色情、反政府等文件

自己实现比较难,我们是购买的云服务。

暂时就写到这里,如有变化,会及时更新的。如有错误,请大家及时提出。
再次感谢吴翰清大佬!

你可能感兴趣的:(web安全)