上传漏洞与SQL注入漏洞相比,危害更大,利用上传漏洞可以直接上传Webshell。
解析漏洞
攻击者利用上传漏洞时,通常会与Web容器的解析漏洞结合在一起。
所以我们先了解解析漏洞,才能更深入的了解上传漏洞
常见的Web容器有IIS、Apache、Tomcat、Nginx等
一、IIS 5.x/6.0解析漏洞
IIS 6.0解析利用方法有两种
1.目录解析
/xx.asp/xx.jpg
在网站下建立文件夹的名字为 .asp、.asa 的文件夹
其目录内的任何扩展名的文件都被 IIS 当作asp文件来解析并执行 (用burp代理创建目录)。
例如创建目录 mst.asp,那么/mst.asp/1.jpg将被当作asp文件来执行。
假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了。
2.文件解析
mst.asp;.jpg
在IIS6.0下,分号后面的不被解析,也就是说mst.asp;.jpg会被服务器看成是mst.asp
还有IIS6.0 默认的可执行文件,除了asp还包含这三种:mst.asa mst.cer mst.cdx
二、IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞
在默认Fast-CGI开启状况下,黑阔上传一个名字为mst.jpg,
内容为下面所示的文件:
’); ?>
然后访问mst.jpg/.php,在这个目录下就会生成一句话木马 shell.php。
三、Nginx <8.03 空字节代码执行漏洞
影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
Nginx在图片中嵌入PHP代码,然后通过访问
xxx.jpg%00.php
来执行其中的代码
四、Apache解析漏洞
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.
比如 mst.php.owf.rar,“owf”和”.rar” 这两种后缀是apache不可识别解析
Apache就会把mst.php.owf.rar解析成php.
如何判断是不是合法的后缀就是这个漏洞的利用关键
测试时可以尝试上传一个mst.php.rara.jpg.png…(把知道的常见后缀都写上…)
去测试是否是合法后缀
五、其他--在windows环境下
xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的
若这样命名,windows会默认除去空格或点
黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单.
若上传成功,空格和点都会被windows自动消除,这样也可以getshell。
如果在Apache中.htaccess可被执行.且可被上传.
那可以尝试在.htaccess中写入:SetHandler application/x-httpd-php
然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件
http://victim.com/1.jpg/1.php //1.php并不存在,此时1.jpg会被当做PHP脚本执行
如何绕过检测进行上传攻击
首先了解几种常见的检测方式
A 客户端javascript检测 (通常为检测文件扩展名)
B 服务端MIME类型检测 (检测Content-Type内容)
C 服务端目录路径检测 (检测跟path参数相关的内容)
D 服务端文件扩展名检测 (检测跟文件extension相关的内容)
E 服务端文件内容检测 (检测内容是否合法或含有恶意代码)
A:客户端JavaScript检测绕过
这类检测通常在上传界面有专门检测文件上传的JavaScript代码。
最常见的就是检测扩展名是否合法。
绕过:
先打开Burp反向代理HTTP,随便点击浏览“”选择文件;
但是还没点击“上传”,就弹出警告框,说明流量没经过burp代理;
所以非常可能是客户端JavaScript检测。
用用firebug禁用js脚本或者burp拦截修改(Content-Length要看情况修改)都可以绕过。
B:服务端MIME类型检测绕过
用burp把Content-Type改掉或者改上传文件后缀可以绕过
C:服务器目录路径检测绕过
00截断可以绕过
00截断问题
php 版本<5.3.4
$_GET[“filename”] 这样就可以接收到这样的请求,filename=test.php%00.txt
实际得到的是 test.php
主要利用常见:
1.上传时路径可控,使用00截断
2.文件下载时,00截断绕过白名单检查
3.文件包含时,00截断后面限制(主要是本地包含时)
4.其它与文件操作有关的地方都可能使用00截断。
D:服务端文件扩展名检测绕过
对于扩展名检测不强的可以结合目录路径绕过
比如 filename=”test.asp/evil.jpg” 之类
黑名单检测:
黑名单检测安全性比白名单检测安全性低很多
fckeditor2.4.3或之前版本的黑名单
1.文件名大小写绕过
用像AsP,pHp之类的文件名绕过黑名单检测
2.名单列表绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有asa或cer之类
3.特殊文件名绕过
比如发送的http包里把文件名改成test.asp.或test.asp_(下划线为空格),
这种命名方式在windows系统里是不被允许的,所以需要在burp之类里进行修改,
然后绕过验证后,会被windows系统自动去掉后面的点和空格,
但要注意Unix/Linux系统没有这个特性。
4.0×00截断绕过
在扩展名检测这一块目前只遇到过asp的程序有这种漏洞
5..htaccess文件攻击
配合名单列表绕过,上传一个自定义的.htaccess,可以轻松绕过各种检测
6.解析调用/漏洞绕过
上传图片马,再利用解析漏洞绕过
白名单检测
白名单检测相对黑名单安全一些,但不见得绝对安全
1.0×00截断绕过
用像test.asp%00.jpg的方式进行截断,属于白名单文件,
再利用服务端代码的检测逻辑漏洞进行攻击
目前只遇到过asp的程序有这种漏洞
2.解析调用/漏洞绕过
上传图片马,再利用解析漏洞绕过
.htaccess文件攻击
无论是黑名单还是白名单
直接点就是直接攻击.htaccess文件。
PHP manual中提到了下面一段话
move_uploaded_file section,there is awarning which states
‘If the destination file already exists, it will be overwritten.’
如果PHP安全没配置好
就可以通过move_uploaded_file函数把自己写的.htaccess文件覆盖掉服务器上的
这样就能任意定义解析名单了。
来做个小实验,先描述下效果:
通过一个.htaccess文件调用php的解析器去解析一个文件名中只要包含”xkx”这个字符串的
任意文件, 所以无论文件名是什么样子, 只要包含”xkx”这个字符串,
都可以被以php的方式来解析, 是不是相当邪恶,
一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制
建一个.htaccess文件,里面的内容如下
SetHandler application/x-httpd-php
同目录有个我们上传一个只有文件名并包含字符串”xkx”,但是却无任何扩展名的文件
里面的内容是php一句话木马.然后用菜刀连接通杀一切检测(内容检测除外)
E:服务端文件内容检测
如果内容检测设置比较严格,上传攻击将会非常困难。
它是代码层检测的最后一道关卡
如果它被突破了,就算没有代码层漏洞,也会给后面利用应用层的解析漏洞带来机会
最常见的是图像类型内容检测
文件幻数检测
主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数
然后在文件幻数后加上自己的一句话木马代码就行了
文件相关信息检测
图像文件相关信息检测常用的就是getimagesize()函数
只需要把文件头部分伪造好就ok了,就是在幻数的基础上还加了一些文件信息
有点像下面的结构
GIF89a
(…some binary datafor image…)
<?php phpinfo();?>
(…skipping therest of binarydata …)
文件加载检测
这个是最变态的检测了,一般是调用API或者函数去进行文件加载测试
常见的是图像渲染测试,再变态点甚至是进行二次渲染
对渲染/加载测试的攻击方式是代码注入绕过(用winhex制作图片木马)
对二次渲染的攻击方式是攻击文件加载器自身
二次渲染一般是调用PHP 的GD库
有一个