解析和文件上传漏洞

上传漏洞与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,

内容为下面所示的文件:

1
2
3
4
5
<?php

fputs(fopen(‘shell.php’,’w’),'<?php eval($_POST[xksec])?>’);

?>

然后访问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文件

六、PHP CGI解析漏洞

1
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或之前版本的黑名单

https://img.wenhairu.com/images/2019/01/23/20190122162654760.png

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文件,里面的内容如下

1
2
3
4
5
<FilesMatch “xkx”>

SetHandler application/x-httpd-php

</FilesMatch>

同目录有个我们上传一个只有文件名并包含字符串”xkx”,但是却无任何扩展名的文件

里面的内容是php一句话木马.然后用菜刀连接通杀一切检测(内容检测除外)

E:服务端文件内容检测

如果内容检测设置比较严格,上传攻击将会非常困难。

它是代码层检测的最后一道关卡

如果它被突破了,就算没有代码层漏洞,也会给后面利用应用层的解析漏洞带来机会

最常见的是图像类型内容检测

文件幻数检测

主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数

https://img.wenhairu.com/images/2019/01/23/20190122162717261.png

然后在文件幻数后加上自己的一句话木马代码就行了

文件相关信息检测

图像文件相关信息检测常用的就是getimagesize()函数

只需要把文件头部分伪造好就ok了,就是在幻数的基础上还加了一些文件信息

有点像下面的结构

GIF89a

(…some binary datafor image…)

<?php phpinfo();?>

(…skipping therest of binarydata …)

文件加载检测

这个是最变态的检测了,一般是调用API或者函数去进行文件加载测试

常见的是图像渲染测试,再变态点甚至是进行二次渲染

对渲染/加载测试的攻击方式是代码注入绕过(用winhex制作图片木马)

对二次渲染的攻击方式是攻击文件加载器自身

二次渲染一般是调用PHP 的GD库

有一个绕过GD库的Webshell生成器