有关文件上传漏洞概述

有关文件上传漏洞概述

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,有时候几乎没有什么技术门槛。在互联网中,我们经常用到文件上传功能,比如上传一张自定义的图片;分享一段视频或者照片;论坛发帖时附带一个附件;在发送邮件时附带附件,等等。

文件上传功能本身是一个正常业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。所以“文件上传”本身没有问题,但有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。文件上传后导致的常见安全问题一般有:

上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;上传文件是Flash的策略文件crossdo-main.xml,黑客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。

除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过“本地文件包含漏洞(Local File Include)”执行此脚本。

在大多数情况下,文件上传漏洞一般都是指“上传Web脚本能够被服务器解析”的问题,也就是通常所说的webshell的问题。要完成这个攻击,要满足如下几个条件:首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。

其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法使得Web容器解释这个脚本,那么也不能称之为漏洞。最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。

绕过文件上传检查功能在针对上传文件的检查中,很多应用都是通过判断文件名后缀的方法来验证文件的安全性的。但是在某些时候,如果攻击者手动修改了上传过程的POST包,在文件名后添加一个%00字节,则可以截断某些函数对文件名的判断。因为在许多语言的函数中,比如在C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符。受此影响的环境有Web应用和一些服务器。比如应用原本只允许上传JPG图片,那么可以构造文件名(需要修改POST包)为xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的上传文件类型判断;但对于服务器端来说,此文件因为0字节截断的关系,最终却会变成xxx.php。%00字符截断的问题不只在上传文件漏洞中有所利用,因为这是一个被广泛用于字符串处理函数的保留字符,因此在各种不同的业务逻辑中都可能出现问题,需要引起重视。除了常见的检查文件名后缀的方法外,有的应用,还会通过判断上传文件的文件头来验证文件的类型。比如一个JPG文件,其文件头是:在这里插入图片描述
JPG文件的文件头在正常情况下,通过判断前10个字节,基本上就能判断出一个文件的真实类型。浏览器的MIME Sniff功能实际上也是通过读取文件的前256个字节,来判断文件的类型的。因此,为了绕过应用中类似MIME Sniff的功能,常见的攻击技巧是伪造一个合法的文件头,而将真实的PHP等脚本代码附在合法的文件头之后,比如:在这里插入图片描述
隐藏在JPG文件中的PHP代码但此时,仍需要通过PHP来解释此图片文件才行。如下情况,因为Web Server将此文件名当做PHP文件来解析,因此PHP代码会执行;若上传文件后缀是.JPG,则Web Server很有可能会将此文件当做静态文件解析,而不会调用PHP解释器,攻击的条件无法满足。
在这里插入图片描述
phpinfo()页面在某些特定环境下,这个伪造文件头的技巧可以收到奇效。

实际上,文件上传功能本身并没错,只是在一些条件下会被攻击者利用,从而成为漏洞。
要实现一个安全的上传功能,我觉得要注意以下几点:
1.文件上传的目录设置为不可执行(只要Web容器无法解析该目录下的文件即可);
2.结合后缀检查,白名单等判断文件类型;
3.使用随机数改写文件名和文件路径(这将极大地增加攻击的成本);
4.单独设置文件服务器的域名(同源策略);

                 -----------参考自《白帽子讲Web安全》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值