跳转至

CVE-2017-15715(Apache 多行解析漏洞)

漏洞描述

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略

影响版本

  • Apache 2.4.0~2.4.29

环境配置

  • Vulhub项目
  • Docker-compose启动

漏洞复现

这里Vulhub使用Apache 2.4.51的版本同样可以复现成功

首先上传PHP文件,被拦截

抓包,在文件名后增加%0a,16进制的换行符

CSS
http://192.168.40.129:8080/evil.php%0a

成功解析PHP文件

漏洞原理

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

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

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

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

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

Vulhub该环境配置文件在/etc/apache2/conf-available目录下

关于正则表达式中$的多行匹配可以参考:https://zh.javascript.info/regexp-multiline-mode

Important

漏洞利用条件如下:

  1. 获取文件名时不能用**$_FILES['file']['name']**,因为它会自动把换行去掉。
  2. Apache源码中正则匹配时需要使用多行匹配模式
  3. 服务器必须是**linux系统**,因为windows环境下不支持后缀名带有换行符\x0a

修复建议

  • 将Apache升级到最新版本
  • 将上传的文件重命名为时间戳+随机数+.jpg的格式并禁用上传文件目录执行脚本权限