中间件(apache,iis,nginx)解析漏洞总结

0x00 前言

早就想总结一下了,虽然网上也有很多,但是自己复现过效果还是会不一样的。

分别三个部分,分别是apacheiisnginx,说实在话,都是些老掉牙的东西,又不能不学,头疼。


0x01 apache

apache一般在linux中和apache+php+mysql一起用的比较多,目前我碰到的解析漏洞有两个,一个就是熟知的未知后缀名解析,另一个是apache CVE-2017-15715,一个一个来。

未知后缀名解析

其实就是在apache错误的配置环境下,会将aaa.php.xxx当作php来进行解析,如果有多个未知后缀名的话,会右往左依次解析到能够识别的为止。

先来看,正常情况配置下的解析。
中间件(apache,iis,nginx)解析漏洞总结_第1张图片
可以看到,是空白的,那接着,我将配置进行错误的配置。

AddType application/x-httpd-php .php 

上面的配置好像看起来没什么问题。。。但是当你把他配置上去后,重启服务器,再去访问一次。
中间件(apache,iis,nginx)解析漏洞总结_第2张图片
成功执行代码了。当然这个xxx也不是真的可能随便打的,比如jpg
在这里插入图片描述
你会发现,他真的会把这个当图片处理的,也就是说xxx一定要是apache不认识的后缀名,这些东西可以在mime.types中查找和配置
中间件(apache,iis,nginx)解析漏洞总结_第3张图片
你会发现这是可以找到jpg的,但是肯定找不到xxx
在这里插入图片描述
好吧,那我把xxx也加进去,但是不加到php的解析范围内,我们再来看看效果。
在这里插入图片描述
可以看到已经无法解析了
中间件(apache,iis,nginx)解析漏洞总结_第4张图片

CVE-2017-15715

apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析phpxxx.php%0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

测试环境是使用的PHPStudy
中间件(apache,iis,nginx)解析漏洞总结_第5张图片
apache的配置中,有这么一段代码。

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
FilesMatch>

apache这次解析漏洞的根本原因就是这个$,正则表达式中,我们都知道$用来匹配字符串结尾位置,我们来看看菜鸟教程中对正则表达符$的解释:

$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,
则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。

接下来用下列代码来完成测试

//upload2.php
<html>
<body>
 
    <form action="upload2.php" method="post" enctype="multipart/form-data">
 
    <input type="file" name="file" />

    <input type="text" name="name" />
    <input type="submit" value="submit" />
 
    </form>
 
</body>
</html>


if(isset($_FILES['file'])) {
    $name = basename($_POST['name']);
	echo $name;
    $ext = pathinfo($name,PATHINFO_EXTENSION);
    if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
        exit('bad file');
    }
    move_uploaded_file($_FILES['file']['tmp_name'], '.\\' . $name);
}
?>

中间件(apache,iis,nginx)解析漏洞总结_第6张图片
先测试直接上传php文件。
中间件(apache,iis,nginx)解析漏洞总结_第7张图片
没有检查通过,接着再传一次,用burpsuite拦截一下修改点东西。
中间件(apache,iis,nginx)解析漏洞总结_第8张图片
上图中的+是我自己增加上去的,然后去hex里面把+对应的2b改成0a,然后直接上传
在这里插入图片描述
会发现,这次上传成功了,但是有两个warning,因为windows不允许这样规则的命名,于是我换到linux中,同样的步骤
中间件(apache,iis,nginx)解析漏洞总结_第9张图片
接着去访问apache.php%0a
中间件(apache,iis,nginx)解析漏洞总结_第10张图片
显示成功解析,去目录中查看
中间件(apache,iis,nginx)解析漏洞总结_第11张图片
识别成?,但是用tab打出是这样的
在这里插入图片描述
这里有一个重要的事情在于php的文件写法上,获取文件名时用的是basename(),但是用的更多的是$_FILES['file']['name'],但是这个没有办法用,因为它会自动把换行去掉。。。


0x02 IIS

IIS解析漏洞,准备来说应该是算是中间件的特性吧,分别IIS6IIS7的,新版本的有没有我也不晓得。。。通过在windows中和IIS+Asp+MSSql用的比较多。

IIS6之目录解析

这个很简单,以xxx.asp为目录名里面的任何文件都会以asp格式进行解析,上一个图就明白了。

测试环境windows2003 iis6iis.asp目录下的iis.jpg内容为<% response.write "it's ok" %>,效果如下。
中间件(apache,iis,nginx)解析漏洞总结_第12张图片

IIS6之文件解析

和刚刚的差不多,指的是iis.asp;iis.jpg这样的格式的文件,也都会被当作是asp来进行解析,因为;后面会被直接忽略,直接效果图吧。
中间件(apache,iis,nginx)解析漏洞总结_第13张图片

IIS7之解析漏洞

此解析漏洞在nginx里面也有,在IIS中触发就必须要和php一起使用

实验环境

windows2008+php5.45+IIS7

漏洞条件

1. php.ini里的cgi.cgi_pathinfo=1(默认就是1)
2. IIS7在Fast-CGI运行模式下

iis已经可以正常识别php文件了
中间件(apache,iis,nginx)解析漏洞总结_第14张图片
但是你会发现仍然无法利用解析漏洞完成解析。
中间件(apache,iis,nginx)解析漏洞总结_第15张图片
因为这里其实还需要一个错误的配置才能完成这个解析漏洞,把下面的这个勾去掉。
中间件(apache,iis,nginx)解析漏洞总结_第16张图片
接着再重启IIS,再试一遍
中间件(apache,iis,nginx)解析漏洞总结_第17张图片
发现iis.txt已经可以当作php被执行了,我想已经知道要怎么防御了吧。


0x03 nginx

nginx有着和iis7一样的漏洞,测试环境如下。
中间件(apache,iis,nginx)解析漏洞总结_第18张图片
访问nginx.txt文件时,直接在后面加上/.php就会把此文件当作php处理了。
中间件(apache,iis,nginx)解析漏洞总结_第19张图片
当然在关了Fast-CGI/nginx.txt%00.php解析为php来处理的这个解析漏洞利用失败了,因为要求版本小于0.8.37有点难找,这里就不复现了。
中间件(apache,iis,nginx)解析漏洞总结_第20张图片
当然除此之外,nginx还有一个利用非法字符和截止符\0的解析漏洞CVE-2013-4547
中间件(apache,iis,nginx)解析漏洞总结_第21张图片

你可能感兴趣的:(#,WEB安全)