注:本文仅供学习参考

文件上传定义:
文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。
即便很容易被攻击者利用漏洞,但是在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效率。企业支持门户,给用户各企业员工有效地共享文件。允许用户上传图片,视频,头像和许多其他类型的文件。方便的同时也带来了隐患。

文件上传原理
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。如一句话木马,病毒等等。如果被恶意攻击者拿到webshell的话危害是非常大的。
Apache、Tomcat、Nginx、IIS等都曝出过文件上传解析漏洞。

文件上传漏洞的话可以看对方服务器配置了什么中间件看是否存在解析漏洞,下面我们来了解一下解析漏洞。

解析漏洞
IIS6.0解析漏洞
使用iis5.x-6.x版本的服务器,打多是windows server 2003网站也是比较古老一般为asp开发的 该解析漏洞也只能解析asp的 不能解析aspx
目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理:服务器默认会把.asp .asa目录下的文件都解析成asp文件(如果上传可以修改路径的话可以修改成asp目录下 利用解析漏洞使服务器把jpg文件解析成asp)

文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析分号后面的内容因此xx.asp;.jpg被解析成asp文件(用于只允许jpg文件上传等等)

IIS 7.5解析利用方法
漏洞与PHP配置有关,php.ini中的参数cgi.fix_pathinfo参数配置错误导致解析漏洞,开启了cgi.fix_pathinfo,与IIS本身无关,仅是php开发有关,不支持asp、aps.net等其他语言。
上传个一句话马儿php.jpg,就是php一句话改名为jpg,然后以下面方式访问:
http://www.xxxx.com/UploadFil...

APACHE解析漏洞
Apache解析文件是从右到左开始判断的,如果后缀名识别不了就会往左继续判断,比如1.php.aaa.bbb.ccc aaa bbb ccc这种后缀名都识别不了直到识别成功为php(在低版本存在2.x)

漏洞形式
www.xxx.com/1.php.aa.bb

其余配置问题导致漏洞
(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .png即使扩展名是 jpg,一样能以 php 方式执行。

nginx解析漏洞
漏洞形式
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
xxx.jpg%00.php (Nginx <8.03 空字节代码执行漏洞)

漏洞原理
  Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。

另外一种手法:上传一个名字为test.jpg,以下内容的文件。
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php
下面附一张总图

image.png

利用解析漏洞的前提是对方服务器存在这个漏洞才能利用,如果不存在的话我们只能通过其他方式,下面学习一下

常见的上传检测方式

1客户端js检测
2服务端mime类型检测(检测content-type内容)
3服务端目录路径检测(检测跟path参数相关的内容)
4服务端文件扩展名检测(检测跟文件extension相关的内容)

1客户端js验证

image.png

这个弄了等于没弄 绕过方法可以禁用js 改js文件,抓包修改,上传图片马等等等等

2服务端mime类型检测
这是在服务端验证客户端发送的http请求包,如果内容类型不符合的,则拒绝该请求,我们来查看一下他源码

if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&( $uploaded_size < 100000 ) )
{
   if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
            echo "<pre>图片上传失败</pre>";
        }
        else {
            echo "<pre>{$target_path} 图片上传成功!</pre>";
            }

可以看到,如果类型等于image/jpeg或者png并且字节小于100000可以通过,那我们正常上传一个php木马 抓包 在content-type处修改成image/jpeg类型即可
image.png

image.png

3.服务端目录路径检测
目录路径检测 一般就检测路径是否合法,但稍微特殊一点的都没有防御 比如比较新的fckeditor php<=2.6.4任意文件上传漏洞
当post下面的url的时候
Xx/xx/command=fileupload&type=image&
Currentfolder=fuck.php%00.gif http/1.0
修改文件上传路径 uploads

4.服务端文件扩展名检测
黑名单检测(不允许上传什么类型)
白名单检测(只允许上传什么类型,其他都不行)
黑名单安全性比白名单安全性低 攻击手法比白名单多 一般有个专门的blacklist文件 里面会包含常见的危险脚本文件 例如fckeditor2.4.3或之前版本的黑名单

黑名单绕过
1.找黑名单扩展名的漏网之鱼 - 比如上面就漏掉了 asa 和 cer 之类
2.可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
3.特别文件名构造 - 比如发送的 http包里把文件名改成 help.asp.  或help.asp_(下划线为空 格)
4.IIS 或 nginx 文件名解析漏洞 - 比如 help.asp;.jpg 或 http://www.xx.com/help.jpg/2.php 
5.0x00 截断绕过 比如:1.jpg%00.php

白名单检测
比黑名单安全一些 但也不是绝对安全
1. 特别文件名构造 (同黑名单攻击第 3 条) 
2. IIS 或 nginx 文件名解析漏洞 (同黑名单攻击第 4 条)
3. 0x00 截断绕过 (同黑名单攻击第 5 条)
4. .htaccess 文件攻击,如果 PHP 安全没配置好 就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务上的 这样就能任意定义解析名单了
双文件上传
检测了第一个 没检测第二个
绕过二次渲染
攻击函数本身
通过上传不完整的图片让其渲染函数暴露,
第二种方法
对文件加载器进行溢出攻击

还有一些条件竞争上传之类的,大家有兴趣可以去研究一下(本人去验证的时候只成功过1,2次有点玄学)。可以去玩下upload的20关挺有意思的,继续加油吧


在努力的wulaoban
4 声望8 粉丝