v2-d721b3957efea11b1606718b24765c45.jpg

简介
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获取了执行服务器端命令的能力。
文件上传功能本身是一个正常业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。所以“文件上传”本身没有问题,但是问题是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传后导致的常见安全问题一般有:
上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;
上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用户钓鱼和欺诈。
文件上传漏洞一般都是指“上传Web脚本能够被服务器解析”的问题,要完成这个攻击,要满足如下条件:
1)上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
2)用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法使得Web容器解释这个脚本,那么也不能称为漏洞。
3)用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。

上传漏洞攻击原理
绕过上传漏洞
客户端验证
很多程序员仅仅通过使用javascript来拒绝非法文件上传,这样的验证可以防止普通用户的误传,但是攻击者可以通过很多方法来突破客户端验证。
1)使用FireBug
FireBug可以让Web开发者轻松地调试HTML、js、ajax、css等前端脚本代码。攻击者可以在上传操作页面删掉验证上传类型的脚本,从而绕过客户端验证。
2)中间人攻击
中间人攻击这种方式与FireBug完全不同,FireBug是删除客户端的js验证,而使用Burp Suite则是按照正常的流程通过Javascript验证,然后在传输中的HTTP层做手脚。
首先把木马文件扩展名改为一张正常图片的扩展名,比如JPG扩展,再上传时使用Burp Suite拦截上传数据,再将其中的扩展名JPG改为JSP,就可以绕过客户端验证。
服务器端检测
服务器端检测主要为白名单与黑名单扩展名过滤操作。黑名单是一种不安全的过滤方式,开发人员通常会过滤掉一些不安全的扩展名,如:jsp、asp、php、asa、aspx、php5等。但实际上,攻击者可以通过很多方法绕过黑名单检测。
a.攻击者可以从黑名单中找出Web开发人员忽略的扩展名,如:cer。
b.攻击者可以对上传的文件后缀进行大小写转化。
c.在windows系统下,如果文件名以“.”或者空格作为结尾,系统会自动去除“.”与空格,利用此特性也可以绕过黑名单验证。如:上传“jsp.”或者“jsp ”扩展名程序,服务器端接收文件名后在写文件操作时,windows将会自动去除小数点和空格。
白名单则是定义了允许上传的扩展名,如根据业务允许上传JPG,PNG,GIF等扩展名文件,可以有效的防御方上传漏洞。

解析漏洞
攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。所以我们再来了解一下解析漏洞。
常见的Web容器有IIS、Nginx、Apache、Tomcat等,下面以IIS、Apache容器为例讲解。
IIS解析漏洞
IIS在解析文件时存在以下两个解析漏洞。
a.当建立.asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当做asp文件来解析。
例如:建立文件夹aa.asp,在该文件夹内新建一个文本文档text.txt,其内容为<%=NOW()%>,然后在浏览器访问ip:port/aa.asp/text.txt,会发现txt文件中的内容被解析了。
b.当文件名为*.asp;1.jpg时,IIS同样会以ASP脚本来执行。
例如:新建文件test.asp;1.jpg,内容为<%=NOW()%>,该文件会被解析。
由于微软并不认为这是个漏洞,也没有推出IIS的补丁,因此这两个“漏洞”至今仍存在。
Apache解析漏洞
在Apache 1.x和2.x中存在解析漏洞:当碰到不认识的扩展名是,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。比如:a.php.aa.xa.bb,Apache首先会解析bb扩展名,如果不认识,将会解析xa扩展名,直到遍历到认识的扩展名为止,然后再将其进行解析。
PHP CGI解析漏洞
容器Nginx、IIS7.0、IIS7.5等Web容器经常出现一个漏洞,即访问http://www.test.com/a.jpg/b.php时,当b.php不存在时,a.jpg将会按照php脚本进行解析。
此时,攻击者可以上传一个合法的“图片”文件a.jpg,之后访问上述连接,则会使容器解析该jpg文件,从而获取网站的WebShell。

防御
文件上传的目录设置为不可执行
只要Web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。在实际应用中,很多大型网站的上传应用,文件上传后会放到独立的存储上,做静态文件处理。
判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,推荐使用白名单的方式。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用使用随机数改写了文件名和路径,将极大地增加攻击的成本。与此同时,像a.jsp;b.jpg或者a.php.aa.bb这种文件,都将会因为文件名被改写而无法进行攻击。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code