漏洞简介
Apache HTTPD 是一款 HTTP 服务器,它可以通过 mod_php 来运行 PHP 网页
漏洞影响版本:2.4.0~2.4.29版本
在解析 PHP 时,1.php\x0A 将被按照 PHP 后缀进行解析,导致绕过一些服务器的安全策略
漏洞环境
相关命令
# cd vulhub/httpd/CVE-2017-15715/
# docker-compose build
# docker-compose up -d
# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------
cve-2017-15715_apache_1 apache2-foreground Up 0.0.0.0:8080->80/tcp
漏洞复现
访问存在漏洞的页面
上传一句话木马 webshell.php 并使用 burp suite 抓包,在如下所示位置加上一个 + 号,以便定位(+号的16进制是0x2b)
切换 16 进制修改包,找到 + 号的位置,也就是 2b,将其修改为 0a,然后放包即可成功上传一句话木马
访问刚才上传的/evil.php%0a,发现能够成功解析,但这个文件不是PHP后缀,说明存在解析漏洞
漏洞原理
查看 PHP 配置文件,vulhub 里没有,需要进入容器内部查看
发现其将当前目录下符合正则表达式 .php$ 的所有文件,都当作 PHP 文件解析
而 $ 符号可以匹配换行符 “\n”,也就是16进制的 0x0a,所以存在解析漏洞
//进入容器
# docker exec -it 0e33c6d54c10 /bin/bash
//查看 PHP 配置文件
# cat /etc/apache2/conf-available/docker-php.conf
//下面这一段存在问题 ↓↓↓
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex disabled
DirectoryIndex index.php index.html
<Directory /var/www/>
Options -Indexes
AllowOverride All
</Directory>
查看源码,发现获取 $name 获取的是以 POST 方式提交的 name 值,该值默认为 evil.php,是用户可以控制的
只对 $name 做了后缀黑名单检查,并没有对我们所上传的文件名做任何检查(绕过方式有很多)
我们控制 POST 方式提交的 name 值,在其后缀后加上了换行符,绕过了后缀黑名单正常上传
并且,由于上述PHP配置文件所存在的原因,导致我们的 evil.php%0a 可以被当作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 {
?>
<!DOCTYPE html>
<html>
<head>
<title>Upload</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data">
<p>
<label>file:<input type="file" name="file"></label>
</p>
<p>
<label>filename:<input type="text" name="name" value="evil.php"></label>
</p>
<input type="submit">
</form>
</body>
</html>
<?php
}
?>
漏洞修复
1.对中间件进行升级
2.将上传的文件重命名为为时间戳+随机数+.jpg的格式
3.上传时采用白名单的验证方式
4.禁用上传文件的执行权限