漏洞代号 CVE-2017-15715
漏洞原理
- Apache 这次解析漏洞的根本原因就是这个 $ ,正则表达式中,我们都知道 $ 用来匹配字符串结尾位置.
- $符号: 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。 要匹配 $ 字符本身,请使用 \$。
- 如果设置MULTILINE标示,就当作换符处理,如果不设置就当作一行文本处理
参考:Apache解析漏洞CVE-2017-15715、apache_parsing_vulnerability、CVE-2021-40438 vulhub复现分析_@Camelus的博客-CSDN博客
漏洞复现
使用vulhub复现
拉取靶场
访问
尝试提交一个php文件
发现无法上传,但是这个apache换行解析漏洞是因为代码当中的配置错误,在配置文件中出现了以下代码:
<FilesMatch \.php$>
SetHandler application/xhttpdphp
</FilesMatch>
$符匹配‘/n’或者是‘/r’,所以在我们上传文件后缀名为.php/n时,apache将自动将该文件解析为php文件
接下来使用burp suite抓包
对数据包就行修改,在1.php后面添加换行,因为提交方式是POST方式,所以要对换行符进行两次url编码
在burp suite中就可以直接编码,发包
返回200 ok
在靶场环境中访问我们的上传文件,注意访问的文件名为1.php%0A
漏洞修复
- 升级到最新版本
- 或将上传的文件重命名为为时间戳+随机数+.jpg的格式并禁用上传文件目录执行脚本权限
- 获取文件名时用“去掉换行”的函数,比如 $_FILES['file']['name']
- 在httpd.conf中加入其他正则表达式。
- Apache 这次解析漏洞的根本原因就是这个 $ ,正则表达式中,我们都知道 $ 用来匹配字符串结尾位置.
- $符号: 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。 要匹配 $ 字符本身,请使用 \$。
- 如果设置MULTILINE标示,就当作换符处理,如果不设置就当作一行文本处理