Apache HTTPD 换行解析漏洞(CVE-2017-15715)
漏洞描述
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0a
将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
产生原因:apache这次解析漏洞的根本原因就是$
这个表达符,在正则表达式中,我们都知道$
用来匹配字符串结尾位置,我们来看看菜鸟教程中对正则表达符$的解释:
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。
因此,在设置了 RegExp 对象的 Multiline 属性的条件下,$还会匹配到字符串结尾的换行符
环境搭建
使用vulhub靶场环境进行漏洞复现
进入到vulhub文件夹进入对应目录,执行命令开启漏洞环境
docker compose build
docker compose up -d
查看是否启动成功
docker ps
或docker-compose ps
查看对应的端口,查看ip,访问即可
查看ip地址
ifconfig
访问:
http://your-ip:8080
成功访问,环境如下:
接下来进行复现即可
详细的搭建步骤参考官方链接:https://vulhub.org
漏洞复现
正常的去上传一个php文件看能否上传上去,上传后发现无法正常的上传
提交后:
根据源码发现为黑名单限制,无法上传php等一系列后缀的文件
源码:
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['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);
} else {
?>
...
分析代码文件名$name是接受POST请求中的数据,因为POST接收不会去掉我们添加的\n,如果使用 $_FILES[‘file’][‘name’]去接收文件名,则会吧\n去掉,所以要满足此漏洞 的条件之一就是使用POST接收文件名。
$ext等于POST中的文件名后缀,所以文件名不能是[‘php’, ‘php3’, ‘php4’, ‘php5’, ‘phtml’, ‘pht’],但是 可以是php\n的这种方式,就绕过了if判断,同时这样的文件还以被解析成PHP
跟进配置文件
<FilesMatch \.php$>
看到在正则中是 \.php$
,因为结尾有个$
符号,结合上述原理, $匹配配 ‘\n’ 或 ‘\r’,所以我们修 改数据包在文件名后加\n, \n的十六进制为0a
通过以上的分析,我们再次上传,使用bp抓包,修改数据包的十六进制信息
找到此处,可以将0d修改为0a,或者不修改直接插入0a也可以,均可实现。修改完成后放包即可
可发给重发器进行测试,看是否能上传成功
观察网页的变化和提示,没有错误的提示,空白,说明上传成功
访问该上传的文件,看是否被解析,成功被解析
http://192.168.100.134:8080/cmd.php%0a
同理将php一句话换成一句话木马,即可getshell获取权限,使用蚁剑连接即可
蚁剑连接:
成功连接,并正常进入
文章不妥之处,欢迎批评指正!