文件上传漏洞的原理、危害及防御
1.什么是文件上传漏洞
Web应用程序通常会有文件上传的功能,例如在BBS发布图片,在个人网站发布ZIP压缩包,在办公平台发布DOC文件等,只要Web应用程序允许上传文件,就有可能存在文件上传漏洞.
什么样的网站会有文件上传漏洞?
nginx和apache区别大部分文件上传漏洞的产生是因为Web应用程序没有对上传文件的格式进行严格过滤,还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护,后面我们会讲到一些常见的解析漏洞,最后还有一些不常见的其他漏洞,如IIS PUT漏洞等.
2.文件上传漏洞的危害
上传漏洞与SQL注入或XSS相比,其风险更大,如果Web应用程序存在上传漏洞,攻击者甚至可以直接上传一个webshell到服务器上.
什么是webshell?
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的.
顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限.webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限.由于webshell其大多是以动态脚本的形式出现,也有人称之为网站的后门工具.以上这段话源自百度百科对webshell的解释,如果对此感兴趣,可以搜索:一句话木马.
3.常见的解析漏洞
1.IIS解析漏洞
IIS6.0在解析文件时存在以下两个解析漏洞.
①当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件豆浆被IIS当作asp文件来解析.
②在IIS6.0下,分号后面的扩展名不会被解析,也就是说当文件为*.asp;.jpg时,IIS6.0同样会以ASP脚本来执行.
2.Apache解析漏洞
在Apache 1.x和Apache 2.x中存在解析漏洞,但他们与IIS解析漏洞不同.
Apache在解析文件时有一个规则:当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名位置,如果都不认识,则会暴露其源码.比如:
1.aa
Apache首先会解析aa扩展名,如果不认识则接着解析xx扩展名,这样一直遍历到认识的扩展名为止,然后再将其进行解析.
3.PHP CGI解析漏洞
在PHP的配置文件中有一个关键的选项: cgi.fi: x_pathinfo.这个选项在某些版本是默认开启的,在开启时访问url,比如:/x.txt/x.php,x.php是不存在的文件,所以php将
会向前递归解析,于是就造成了解析漏洞.由于这种漏洞常见于IIS7.0、IIS7.5、Nginx等Web服务器,所以经常会被误认为是这些Web服务器的解析漏洞.
4.Nginx <8.03 空字节代码执行漏洞
影响版本:0.5,0.6,0.7<=0.7.65 0.8<=0.8.37
Nginx在图片中嵌入PHP代码,然后通过访问xxx.jpg%00.php可以执行其中的代码.
5.其他
在windows环境下,xx.jpg[空格]或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,攻击者可以通过抓包,在文件名后加一个空格或者点绕过黑名单.若上传成功,空格和点都会被windows自动消除,这样也可以getshell.
如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
SetHandlerapplication/x-httpd-php
然后再上传名称为shell.jpg的webshell,这样shell.jpg就可解析为php文件.
4.文件上传漏洞的防御方法
很多开发者仅仅通过使用javascript来防御非法文件上传,这样验证对于一些普通用户防止上传错误还可以,对专业的技术人员来说,这是非常低级的验证.攻击者可以通过非常多的方法来突破前端验证,下面举两个例子:
1.使用FireBug
FireBug是一款开源的浏览器插件,它支持Firefox,Chrome等浏览器.它可以让Web开发者轻松地调试HTML、javascirpt、AJAX、CSS等前端脚本代码.正是因为FireBug功能强大,所以也成为了黑客的必备利器.
介绍完FireBug之后,我们来看如何使用FireBug绕过客户端检测.
当单击提交按钮后,Form表单将会触发onsubmit事件,onsubmit事件将会调用checkFile函数.checkFile函数将会检测文件扩展名是否合法,并返回一个布尔值,如果checkFile函数返回true,则表单提交,反之则拦截要上传的文件.知道这一点后,可以用FireBug将onsubmit事件删除,这样就可以绕过javascript函数验证.
2.中间人攻击
中间人攻击和使用FireBug的方法完全不同,FireBug是删除客户端的javascript验证,而使用Burp Suite等抓包软件则是按照正常的流程通过javascript验证,然后在传输中的HTTP层做修改.
首先把木马文件的扩展名字改为一张正常图片或文档的扩展名,如jpg扩展名,在上传时使用Burp拦截上传数据,再将其中的扩展名jpg修改成jsp,就可以绕过客户端验证.
通过以上例子,大家可以看出前端脚本验证是一种非常不可靠的验证方式,不管是对文件上传、XSS还是别的漏洞来说都是如此,当然这并不是说完全不需要做前端验证,而是要把前端验证和服务器端验证相结合.
我们来看服务端检测,在上传文件时,大多开发者会对文件扩展名检测,验证文件扩展名通常有两种方式:黑名单和白名单.
黑名单过滤是一种不安全的方式,黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,与黑名单扩展名对比,如果发现文件扩展名与黑名单里的扩展名匹配,则认为文件不合法.
为什么黑名单过滤是一种不安全的方式呢?
比如一个Web服务器为IIS6.0,Web语言为asp的网站,假定开发者使用了黑名单过滤,过滤了asp、asa、cer等文件格式,那么可以尝试以下几种方式来绕过:
1.大小写,比如AsP、cER等.
2.被忽略的扩展名,IIS6.0会把cdx格式的文件当成asp来解析.
3.配合解析漏洞,上传asp;.jpg格式文件.
4.如果Web服务器开启了其他语言的支持,比如可以解析php文件,那么可以上传php格式的木马.
5.利用Windows系统自动去除.和空格的特性,如上传扩展名asp.格式的文件来绕过.
通过以上几个例子可以看出,黑名单过滤的可靠性并不高,白名单过滤相对来说较为可靠.
白名单与黑名单的机智恰恰相反,黑名单是定义不允许上传的扩展名,白名单则是定义允许上
传的扩展名,虽然采用白名单可以防御未知风险,但是不能完全依赖白名单,因为白名单不能完全防御上传漏洞,例如各种解析漏洞等,白名单仅仅是防御上传漏洞的第一步.通常会结合其他验证方式来使用,虽然不能完全防御文件上传漏洞,但也基本上规避了绝大部分风险,接下来简要说一下其他几种文件上传漏洞防御方法:
1.检查文件上传路径(避免0x00截断、IIS6.0文件夹解析漏洞、目录遍历)
2.文件扩展名检测(避免服务器以非图片的文件格式解析文件)
3.文件MIME验证(比如GIF图片MIME为image/gif,CSS文件的MIME为text/css等)
3.文件内容检测(避免图片中插入webshell)
4.图片二次渲染(最变态的上传漏洞防御方式,基本上完全避免了文件上传漏洞)
5.文件重命名(如随机字符串或时间戳等方式,防止攻击者得到webshell的路径)
另外值得注意的一点是,攻击者上传了webshell之后需要得到webshell的路径才能通过工具连接webshell,所以尽量不要在任何地方(如下载链接等)暴露文件上传后的地址,在这里必须
要提一点,就是有很多网站的上传点在上传了文件之后不会在网页上或下载链接中暴露文件的相对路径,但是在服务器返回的数据包里却带有文件上传后的路径,如下图:
这种情况是应当尽量避免的.
由于文件上传利用方式种类繁多,所以就不在这里详细介绍了,扩展阅读里有一些,大家也可以在网络中搜索相关资料.
4.扩展阅读
1.上传漏洞filepath变量\00截断
/2404.html
2.文件上传绕过验证
wenku.baidu/link?url=RjPW7xaoh48TYXw5Fc7j2svxw7bQzXjGdwgoD55Ue4ywOdH1Ue2rvrz08PoqQsxA_OqzasXy38rpXKxooZUmtoM7cx0SWh32Rsjir8NEuD7
3.特殊的上传技巧,绕过PHP图片转换实现远程代码执行(RCE)
www.freebuf/articles/web/54086.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论