早就想总结一下了,虽然网上也有很多,但是自己复现过效果还是会不一样的。
分别三个部分,分别是apache
,iis
,nginx
,说实在话,都是些老掉牙的东西,又不能不学,头疼。
apache
apache
一般在linux
中和apache+php+mysql
一起用的比较多,目前我碰到的解析漏洞有两个,一个就是熟知的未知后缀名解析
,另一个是apache CVE-2017-15715
,一个一个来。
其实就是在apache
错误的配置环境下,会将aaa.php.xxx
当作php
来进行解析,如果有多个未知后缀名的话,会右往左依次解析到能够识别的为止。
先来看,正常情况配置下的解析。
可以看到,是空白的,那接着,我将配置进行错误的配置。
AddType application/x-httpd-php .php
上面的配置好像看起来没什么问题。。。但是当你把他配置上去后,重启服务器,再去访问一次。
成功执行代码了。当然这个xxx
也不是真的可能随便打的,比如jpg
你会发现,他真的会把这个当图片处理的,也就是说xxx
一定要是apache
不认识的后缀名,这些东西可以在mime.types
中查找和配置
你会发现这是可以找到jpg
的,但是肯定找不到xxx
好吧,那我把xxx
也加进去,但是不加到php
的解析范围内,我们再来看看效果。
可以看到已经无法解析了
apache
通过mod_php
来运行脚本,其2.4.0-2.4.29
中存在apache
换行解析漏洞,在解析php
时xxx.php%0A
将被按照PHP
后缀进行解析,导致绕过一些服务器的安全策略。
测试环境是使用的PHPStudy
在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);
}
?>
先测试直接上传php
文件。
没有检查通过,接着再传一次,用burpsuite
拦截一下修改点东西。
上图中的+
是我自己增加上去的,然后去hex
里面把+
对应的2b
改成0a
,然后直接上传
会发现,这次上传成功了,但是有两个warning
,因为windows
不允许这样规则的命名,于是我换到linux
中,同样的步骤
接着去访问apache.php%0a
显示成功解析,去目录中查看
识别成?
,但是用tab
打出是这样的
这里有一个重要的事情在于php
的文件写法上,获取文件名时用的是basename()
,但是用的更多的是$_FILES['file']['name']
,但是这个没有办法用,因为它会自动把换行去掉。。。
IIS
IIS
解析漏洞,准备来说应该是算是中间件的特性吧,分别IIS6
及IIS7
的,新版本的有没有我也不晓得。。。通过在windows
中和IIS+Asp+MSSql
用的比较多。
这个很简单,以xxx.asp
为目录名里面的任何文件都会以asp
格式进行解析,上一个图就明白了。
测试环境windows2003 iis6
,iis.asp
目录下的iis.jpg
内容为<% response.write "it's ok" %>
,效果如下。
和刚刚的差不多,指的是iis.asp;iis.jpg
这样的格式的文件,也都会被当作是asp
来进行解析,因为;
后面会被直接忽略,直接效果图吧。
此解析漏洞在nginx
里面也有,在IIS
中触发就必须要和php
一起使用
实验环境
windows2008+php5.45+IIS7
漏洞条件
1. php.ini里的cgi.cgi_pathinfo=1(默认就是1)
2. IIS7在Fast-CGI运行模式下
iis
已经可以正常识别php
文件了
但是你会发现仍然无法利用解析漏洞完成解析。
因为这里其实还需要一个错误的配置才能完成这个解析漏洞,把下面的这个勾去掉。
接着再重启IIS
,再试一遍
发现iis.txt
已经可以当作php
被执行了,我想已经知道要怎么防御了吧。
nginx
nginx
有着和iis7
一样的漏洞,测试环境如下。
访问nginx.txt
文件时,直接在后面加上/.php
就会把此文件当作php
处理了。
当然在关了Fast-CGI
时/nginx.txt%00.php
解析为php
来处理的这个解析漏洞利用失败了,因为要求版本小于0.8.37
有点难找,这里就不复现了。
当然除此之外,nginx
还有一个利用非法字符和截止符\0
的解析漏洞CVE-2013-4547
。