白帽子挖洞—文件上传(File Upload )
作者:admin | 时间:2017-9-12 22:03:26 | 分类:黑客技术 隐藏侧边栏展开侧边栏
0x00 介绍
文件上传漏洞概念
文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。即便很容易被攻击者利用漏洞,但是在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效率。企业支持门户,给用户各企业员工有效地共享文件。允许用户上传图片,视频,头像和许多其他类型的文件。向用户提供的功能越多,Web应用受到攻击的风险和机会就越大,这种功能会被恶意用户利用,获得到一个特定网站的权限,或危及服务器的可能性是非常高的。
漏洞成因
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。打个比方来说,如果你使用 windows 服务器并且以 asp 作为服务器端的动态网站环境,那么在你的网站的上传功能处,就一定不能让用户上传 asp 类型的文件,否则他上传一个 webshell,你服务器上的文件就可以被他任意更改了。因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。
对于初学者而言,找漏洞最好是基于白盒审计进行,所谓白盒审计可以简单地理解为就是看着代码找漏洞,那么在正式挖洞前,我们先看看开源的DVWA给出的四种级别的文件上传的源代码。
0x01 基于dvwa的代码审计
DVWA 的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到入门级别的代码审计的内容。
DWVA界面Low级别代码
分析关键代码
可以看到:
DVWA_WEB_PAGE_TO_ROOT为网页的根目录,target_path变量为上传文件的绝对路径,basename( $_FILES['uploaded']['name'])将文件中已经“uploaded”的文件的名字取出并加入到target_path变量中。if语句判断文件是否上传到指定的路径中,若没有则显示没有上传。总的可见,此级别没有对上传文件的类型进行任何的过滤,也就是可以随意上传php文件。代码对上传文件的类型没有做任何检查,存在文件上传漏洞
Mediem级别代码
分析关键代码:
可以看到:
代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B。
High级别代码
分析关键代码:
可以看到:
strrpos(字符串,查找,开始)
函数返回字符串查找另一字符串串中最后一次出现的位置,如果没有找到字符串则返回false ,可选参数开始规定在何处开始搜索。
getimagesize(string filename)
函数会通过读取文件头,返回图片的长,宽等信息,如果没有相关的图片文件头,函数会报错。
可以看到,高级别的代码读取文件名中最后一个 “ 。“ 后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是” * .jpg “ ,” * .jpeg “ ,” * .png “ 之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型
代码限制上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一,同时通过getimagesize()函数限制上传文件的文件头必须为图像类型
Impossible级别代码
分析关键代码:
可以看到:
代码在High级别代码的基础上,通过Md5散列的方法对文件重命名,加入Anti-CSRF令牌防护CSRF 攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。
0x02 挖掘漏洞
注:下文的提到的漏洞均已获授权进行测试,并交由厂商修复。
先来第一枚用常见的套路就能挖出来的漏洞
弱密码登陆后,在配置文件出找到某上传点,不过发现只允许上传.dat文件
这能难得到我们?用fiddler抓包截断
改成jsp后成功上传
同样的方法上传个大马
Arp –a看下缓存发现这个漏洞可以涉及到内网
Ifconfig同样可以证实我们的判断
还可以拿到数据库
点到为止哈,到此就足以证明漏洞的危害了,该去提交漏洞了
总结:虽然加了过滤,不过fiddler等抓包截断就可轻易绕过,代码强度级别相当于DVWA的medium
第二枚漏洞源自国内某生成电脑外设的厂商,文件上传漏洞还是一样的套路,不过这家厂商甚至连过滤都没有,展示这枚漏洞的原因在于连上菜刀后得到的信息可丰富了
注册一个帐号登陆进去
红框的地方都是可以上传的,随便找一个上传的地方
上传个马儿,连接菜刀
咱们重点关注下.config的文件
Username,password都泄露了
有个certificate挺吸引我们的,证书诶,点进去看看
原来都是些用户上传的证书
说回前面的.config,我们发现了邮箱
而且还是可以登陆的,我们登陆进去看看
总结:光就文件上传漏洞而言,这个网站防护做得实在太差,连基本的过滤都没有,抓包截断都不用了,真是为白帽子们省心。代码级别相当于DVWA的Low.
0x03 资源推荐
Fiddler工具介绍与抓包改包实践:http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015091509001400001
文件上传漏洞的高级利用
http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2016071516552700001
0x04 经验心得
我们挖文件上传漏洞时,很多时候都会碰到一些编辑器组件配合apache、IIS产生的解析漏洞,这里给大家总结了很经典的例子。
(一)IIS5.x-6.x解析漏洞
原理:
使用iis5.x-6.x版本的服务器,大多为windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。
(1)目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理: 服务器默认会把.asp目录下的文件(即使非asp格式)都解析成asp文件。
(2)文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。
(二)apache解析漏洞
原理:Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.qwe.asd “.qwe”和”.asd” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.qwe.asd解析成php。
漏洞形式:www.xxxx.xxx.com/test.php.php123
其余配置问题导致漏洞:
(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5- .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。
(三)nginx解析漏洞
漏洞原理:Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi__name会被设置为“phpinfo.jpg/1.php”,然后构造成_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:PHP会认为_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了
漏洞形式
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/%200.php
另外一种方法:上传一个名字为test.jpg,然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
0x05 防护措施
首先关于文件上传漏洞我们需要注意三点:
1.上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
2.用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
3.用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
针对以上三点,我们不难得出防范文件上传漏洞的方法:
1.文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Java的XSS利用等问题将得到解决。
以上仅为一孔之见,欢迎小伙伴们留言提出其他的想法
0x06 声明
本系列文章旨在普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征、挖掘技巧等。若读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。
作者:合天智汇