ID:-
Web应用发展的今天,许多的应用程序都允许用户上传自己的文件。但是,这也造成了Web应用安全中著名的漏洞——文件上传漏洞(File )。由于Web应用的上传功能实现代码没有严格限制用户上传文件的格式、文件的后缀以及文件的类型,导致允许攻击者向某个可通过Web访问的目录上传任意的PHP文件,并能够将这些文件在PHP解释器上运行,从而可以远程控制服务器。这种攻击方式最为直接,最为有效,有时几乎没有什么门槛。但是,随着程序员安全意识的提高,上传漏洞也逐渐减少,在现在的互联网中已经很少可以发现文件上传的漏洞。但是对于渗透测试人员而言,这是一个必须知道的漏洞,并且要了解其原理,然后预防这一漏洞。本文将从其原理和预防展开,实验实例在DVWA上演示。
1. 上传漏洞原理
文件上传漏洞一般是指上传Web脚本能够被服务器解析的问题。在大多数情况下,攻击者想要完成整个文件上传漏洞攻击是需要满足条件的,条件如下。
首先,上传的文件能够被Web容器解析执行,所以文件上传后的目录要是Web容器所覆盖的路径。其次,Web服务器要能访问到该文件,如果上传成功了,但是攻击者不能通过Web途径进行访问,那么攻击是无法形成的。最后,如果上传的文件被Web安全检测格式化、图片压缩等改变其内容,导致无法解析的话,攻击也是无法形成的。
接下来通过DVWA上的上传漏洞实例,来为大家解析整个漏洞攻击的过程。
先将DVWA的安全程度调至low,然后在自己本地编写一句话PHP文件,代码如下。
然后将这个文件在DVWA中上传,如图1所示。
图1 上传文件
之后,再根据上传路径目录访问上传的文件,路径为:。
信息如图2所示。
图2 访问上传文件
这个页面就表示文件中编写的那句()在Web服务器中执行了。
如果上传的脚本是一个的话,就可以直接获得服务器的控制权限。
文件在上传之后,会被Web容器解析,那么解析文件的过程会产生一些问题。
2. IIS文件解析问题
使用iis5.x-6.x版本的服务器,大多为 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。
(1)目录解析(IIS6.0)
形式:。
原理:服务器默认会把.asp和.asp目录下的文件都解析成asp文件。
(2)文件解析
形式:;.jpg。
原理:服务器默认不解析“;”后面的内容,因此,xx.asp;.jpg便被解析为asp文件。
(3)解析文件类型
IIS6.0 默认的可执行文件除了asp还包含以下3种:/test.asa、/test.cer、/test.cdx。
3. 文件解析问题
解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。如test.php.qwe.rar,“.qwe”和”.rar”这两种后缀是不可识别解析的, 就会把 .php.qwe.rar 解析成 PHP 文件。提供一个漏洞的例子:,其余配置问题导致如下漏洞。
1)如果在的conf里有这样一行配置 php5-.php,这时只要文件名里包含.php,即使文件名是test2.php.jpg也会以PHP来执行。
2)如果在的conf里有这样一行配置 /x-httpd-php.jpg,即使扩展名是jpg,一样能以PHP方式执行。
4. PHP的CGI路径解析问题
Nginx默认以CGI的方式支持PHP解析,普遍的做法是在Nginx配置文件中通过正则匹配设置 。当访问 时,$ 会被设置为“.jpg/1.php”,然后构造成 传递给PHP CGI,但是PHP为什么会接受这样的参数,并将.jpg作为PHP文件解析呢?这就要说到这个选项了。如果开启了这个选项,那么就会触发在PHP中的如下逻辑。
PHP会认为是.jpg,而1.php是,所以就会将.jpg作为PHP文件来解析了。
下面提供几个路径的例子:
%20.php
另外一种手法是一个名字为 test.jpg,然后访问 test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
5. 绕过上传漏洞
当程序员意识到上传漏洞时,会对上传的文件进行文件后缀的限制。例如,一个网站上传文件只允许上传.jpg后缀的图片。那么,攻击者就需要想办法去绕过上传时的后缀名检测。
最常使用的方法是 截断。攻击者可以通过手动修改上传过程中的 POST 分组,在文件名后面添加 字节,就可以截断某些函数对文件名的判断,因为在许多语言的函数中,如C、PHP等语言常用字符串处理文件名,而0x00为终止符。接着上面的例子继续分析,Web应用只允许上传.jpg的文件,那么攻击者可以构造一个文件xxx.php[].jpg,其中,[]为十六进制的0x00字符。这样就绕过了客户端对于文件后缀的校验,但是在服务器上,由于运行的是PHP环境,在解析这个文件时,会因为0x00字符截断,最后解析为PHP文件。
6. 客户端绕过
一般来说,客户端会使用来进行文件名的校验。
对于这种校验方式,攻击者可以在客户端输入正常的文件名后缀,然后通过使用工具抓到修改文件名的后缀,如图3所示。
图3 抓取后缀
7. 服务端绕过
服务端会使用3种方式去校验用户提交上来的文件:-type字段校验、文件头校验和扩展名验证。而攻击者可以通过不同的方法去绕过每一个校验。
-type字段表示的是文件上传的类型,有些服务器接收时,会根据这个字段来判断文件的类型,常见的类型有image/gif、/x-php等。
那么,攻击者还是可以通过 对数据分组中的这个字段进行修改,如图 4所示。
图4 修改字段
文件头校验,可以通过自己写正则匹配,判断文件头是否符合标准,接下来列举几个常用的文件头形式:
1).JPEG;.JPE;.JPG
2).gif
3).zip
4).doc;.xls;.xlt;.ppt;.apr
这种方式校验,攻击者只需要在一句木马前加上文件类型所对应的文件头,如在 gif 文件头的校验时,只要原()变成就可以了。
扩展名验证其实就是多用途互联网邮件扩展类型(MIME, )验证,是设定某种扩展名的文件用一种应用程序来打开的方式类型。当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
MIME的作用是使客户端软件区分不同种类的数据,如Web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的文件。Web服务器使用MIME来说明发送数据的种类,Web客户端使用MIME来说明希望接收到的数据类型。
一个普通的文本邮件的信息包含一个头部分(To:From::等)和一个体部分(Hello Mr.等)。在一个符合MIME的信息中也包含一个信息头并不奇怪,邮件的各个部分叫作MIME段,每段前也缀以一个特别的头。MIME邮件只是基于RFC 822邮件的一个扩展,然而它有着自己的RFC规范集。
头字段:MIME头根据在邮件分组中的位置,大体上分为MIME信息头和MIME段头。MIME信息头指整个邮件的头,而MIME段头只每个MIME段的头。
这种形式的验证其实是比较安全的,攻击者能绕过这种验证的唯一方法就是去查找黑名单中所漏掉的扩展名或可能会存在大小写的区别。
8. 编辑器上传漏洞
许多的文本编辑器为了方便用户使用,都会具备文件上传的功能。下面介绍两个编辑器的文件上传漏洞。
9.
是一款当今各大站长使用最为广泛的网页编辑器,其兼容性和易使用被广为人知,但是它的安全性很差。近年来的一次IIS解析问题被披露后,FCK就遭受到了冲击。一方面,自身的问题与IIS解析问题密切相关,另一方面,FCK对于上传文件名的扩展名检查不严格。下面我们来看一下FCK的上传问题。
对于FCK而言,需要找到3个页面:test.html、.html和.html。
先从test.html文件讲起,这是一个FCK的测试文件。测试文件和商业产品一起被发布出来,这个行为本身就存在一定的问题。有些使用FCK的网站,还存在这个页面。这个页面非常危险,能够直接上传动态文件。
然后是 .html,它的默认路径是 /////.html?Type=file&=/asp/.asp。
这里可以看到上传的地方,并且利用了ASP连接器,就可以上传成功。FCK是利用XML列出文件的,在连接器中可以使用“”就可以列出文件。可以尝试输入:
/////PHP/.php?=&Type=Image&=/,如果行的话就会列出文件路径。
.html页面中,就会有一个上传图片的功能。在这里,攻击者可以测试多个文件类型,并且如果上传成功,它会显示上传地址。
10.
的任意文件漏洞问题发现在 3.8 for php版本中,我们可以来看一下早先发现的人写好的EXP,如下。
.8 for php任意文件上EXP
然后,在自己本地的环境中查看 php/.php 文件,该文件类似数据库存储文件,中间保存了用户和密码,以及一些样式。它将所有的风格配置信息保存为一个数组$,在为on的情况下可以任意添加自己喜欢的风格,然后就可以在自己添加的风格中可以随意定义可上传文件类型。
11. 修复上传漏洞
上传问题由来已久,对于这种漏洞的修复,开发人员也想出了相应的解决方案。这种漏洞在现在Web应用中,很难被攻击者所利用。下面我们来了解一下上传漏洞的预防。
首先,服务器对于上传目录的设置问题。从上传漏洞的产生可以看出其中一个环节是上传文件的执行。那么,预防的第一步就是切断这一环节,将上传的目录设置为不可执行。另外,在上传文件类型的判断中,往往使用黑名单机制,其实这样很容易导致限制不严格的问题,所以推荐使用白名单机制。之后是图片处理的问题,可以使用图片压缩函数或函数,对此图片进行处理,同时破坏图片中含有的恶意代码。
我们也可以使用随机数改写文件名或文件路径,使文件不能被攻击者访问,但这种防御的限制比较大,因为往往上传的文件是需要被大量访问的。最后,也可以设置单独的文件服务器,由于浏览器的同源策略的关系,客户端的攻击将变得无效,这样成本会增加,一般会在大型企业中比较适用。