🐳博客主页:举杯同庆 – 生命不息,折腾不止
🌐订阅专栏:『Web安全』
📰如觉得博主文章写的不错,或对你有所帮助的话,请多多支持呀! 👉关注✨、点赞👍、收藏📂、评论。
话题讨论
中国经济周刊-2022-07-08 新闻 万豪国际集团证实了近期一起数据泄露事件,一个月前黑客进入了马里兰州一家万豪酒店的服务器,在获得约20GB数据后试图敲诈万豪,但万豪拒绝付款。被泄漏的数据包括客人的信用卡信息及客人和员工的机密信息
对此,网友们怎么看?可以留言讨论。
索引
一 概述
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。
需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
这种攻击方式是最为直接和有效的,如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
二 文件上传后导致的常见安全问题
- 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
- 上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为 (其他通过类似方式控制策略文件的情况类似);
- 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
要完成这个攻击,要满足以下几个条件:
- 首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
- 其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
- 最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
三 举两个例子
前面说过web安全攻防的测试靶场很多都是基于php服务器的,所以举例也是依.php文件为例,这个漏洞与开发语言无关。
- nginx解析漏洞
漏洞原理:
Nginx默认是以CGI(服务器运行php文件的接口协议common gateway interface)的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/info.jpg/test.php这个URL时,$fastcgi_script_name会被设置为“info.jpg/test.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,最终PHP会将info.jpg作为PHP文件解析,为什么呢?
这就要说到fix_pathinfo这个选项了,这是php配置文件中的一个关键选项,默认是开启的, 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是info.jpg,而test.php是PATH_INFO,所以就会将info.jpg作为PHP文件来解析了
PHP官方给出的建议是将fix_pathinfo参数设置为0,对此bug态度消极。
漏洞文件形如:
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
另外一种手法:上传一个名字为test.jpg,然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
- apache解析漏洞
漏洞原理
Apache2.x以前版本 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断,直到遇见一个Apache认识的文件类型为止。比如test.php.rar,这里”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.rar解析成php,然后认为这是一个.php类型的文件。至于Apache都能识别哪些文件呢?这些文件类型定义在apache的mime.types配置文件中找到。
漏洞文件名形如 www.xxxx.xxx.com/test.php.php123
Apache的这个特性,很多工程师在写应用时并不知道,写出的安全检查就可能存在缺陷,比如.rar文件是一个合法的上传请求,在应用里值判断文件的后缀是否.rar,而用户上传的文件是xxxx.php.rar.rar,从而导致脚本执行。
- 攻击测试步骤
这个场景非常巧妙,首先假设有个一句话木马文件,上传的时候可能会被和谐掉,所以要把此木马文件转换为图片马(比如cmd命令生成、二进制文本打开后加上木马命令等好几种方式都很简单),图片马是图片格式所以很容易上传成功。另外,需要攻击的服务器包含文件上传漏洞,这里用中国菜刀或者蚁剑(webshell管理工具)测试即可。
四 常见防御方法
1.文件上传目录设置为不可执行
只要web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。在实际应用中,很多大型网站或系统文件上传后会放在一个独立的存储服务器,做静态文件处理,一方面方便使用缓存加速,降低性能损耗,另一个方面也杜绝了脚本执行的可能。对于一些小应用,文件上传问题还是需要多加关注。
2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。通过javascript来校验上传文件的后缀是否合法,在浏览加载文件,但还未点击上传按钮时便弹出对话框,推荐采用白名单方法,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件。
注意:校验文件后缀时黑名单方法不是一种好的设计方法,容易被跳过。
此外
此外,对于图片的处理,可以使用压缩函数或者resize函数破坏图片中可能包含的HTML代码。
3.使用随机数改写文件名
文件上传如果要执行代码,则需要用户能够访问到这个文件。如果应用中使用随机数改写了文件名和路径,将极大的增加攻击的成本。同时,向上面的xxxx.php.rar.rar这种文件将会因文件名被改写而无法成功实施攻击。
4.单独设置文件服务器的域名
由于浏览器的同源策略,一系列客户端攻击将失效,比如上传包含JavaScript的XSS利用等问题将得到解决,但是能否单独设置域名,还要看具体的业务环境。
五 小结
文件上传往往与代码执行联系在一起,因此对于业务中用到的上传功能,都应该由安全工程师进行严格的检查。
文件上传问题看似简单,但是要实现一个安全的上传功能要考虑很多问题,不断的发现问题,结合业务需求改进,才能设计出最合理的上传功能。
版权归原作者 拒绝冗余 所有, 如有侵权,请联系我们删除。