漏洞介绍
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。
漏洞原理
靶场源代码:

看完上面的源代码我们很容易就能知道我们上传xx.php%0a和xx.php是不一样的,我们上传xx.php%0a就可以对文件上传的黑名单进行了绕过
另外在该版本的配置中,存在这么一段配置
1 | <FilesMatch \.php$> |
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();?> |

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


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

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