漏洞介绍

Apache HTTPD 是一个广泛使用的 HTTP 服务器,可以通过 mod_php 模块来运行 PHP 网页。在其 2.4.0 到 2.4.29 版本中存在一个解析漏洞,当文件名以 1.php\x0A 结尾时,该文件会被按照 PHP 文件进行解析,这使得攻击者可以绕过服务器的一些安全策略。

漏洞范围

Apache HTTPD 2.4.0 - 2.4.29

漏洞靶场

使用vulhub的靶场:

使用环境为Apache HTTPD 2.4.10

vulhub-master/httpd/CVE-2017-15715/

启动靶场环境:

1
docker-compose up -d

环境启动后,Apache 将运行在 http://your-ip:8080

漏洞原理

靶场源代码:

image-20250605214510924

看完上面的源代码我们很容易就能知道我们上传xx.php%0a和xx.php是不一样的,我们上传xx.php%0a就可以对文件上传的黑名单进行了绕过

另外在该版本的配置中,存在这么一段配置

1
2
3
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>

docs/manual/mod/core.html.en#L4043-L4045

该文件为说明文档,安装后这项配置会添加进apache2.conf或者.htaccess文件中

只要满足这么一个正则匹配,就会告知Apache将这个满足匹配的文件按PHP文件来解析

但是不巧的是这里还有一个东西就是$这个东西,它是用来匹配字符串结尾位置的,而且如果设置了RegExp 对象(正则表达式)的 Multiline(/m) 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。

所以如果我们设置了RegExp 对象的 Multiline 属性(\m)的条件下,$还会匹配到字符串结尾的换行符(也就是%0a),于是也就产生了这么一个换行解析漏洞

漏洞复现

首先,尝试上传一个名为 1.php 的文件,可以看到上传被安全检查拦截:

1.php内容为phpinfo信息

1
<?php phpinfo();?>

image-20250605213916867

但是,如果我们在文件名 1.php 后面添加一个 \x0A(注意:必须是单独的 \x0A,而不是 \x0D\x0A),上传就会成功:

image-20250605214153775

image-20250605214239815

当访问上传的文件 /1.php%0a 时,虽然该文件没有正确的 PHP 扩展名,但它会被成功解析为 PHP 文件。这证实了解析漏洞的存在:

image-20250605214325814

参考

https://github.com/vulhub/vulhub/blob/master/httpd/CVE-2017-15715/README.zh-cn.md

Apache HTTPD 换行解析漏洞分析与复现(CVE-2017-15715) - FreeBuf网络安全行业门户