文章源自-投稿
作者-南宫十六
Apache HTTPD是一款HTTP服务器,其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。该漏洞属于用户配置不当所产生,与具体中间件版本无关。
漏洞复现:
使用vulhub进行复现,它是一个集成大量漏洞,方便漏洞复现的一个漏洞集合。
l 在具用Docker环境的Linux虚拟机上执行命令:“git clone https://github.com/vulhub/vulhub.git”拉取所需环境。
l 进入漏洞复现的对应目录,输入命令:“cd vulhub-master/httpd/CVE-2017-15715”。
l 启动Docker容器,输入命令:“docker-compose up -d”。
l 查看容器状态,输入命令:“docker ps”并查看对应容器ID。
l 进入容器,输入命令:“docker exec -it 容器id /bin/bash”。
查看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);
}
这是一个文件上传的后端PHP代码,除了上传文件外,还要以POST请求方式传入参数name,其值作为文件上传后最后的名字,同时设置了黑名单过滤name值传递的带有黑名单信息的后缀。
再看一下配置文件信息,输入命令“cat /etc/apache2/conf-available/docker-php.conf”,如图所示。
前三行的内容意思是将所有以“.php”为后缀的文件内容当作PHP代码进行解析,但是却使用了“$”进行文件匹配,这就导致了漏洞的产生。这个符号在正则表达式中是匹配字符串中结尾的位置,若存在换行则匹配换行符为结尾,也就是说可以利用换行符使“$”与其匹配从而绕过黑名单机制实现文件上传。
访问http://127.0.0.1:8080会发现页面空白,原因是代码中没有上传文件的表单,自行构造一个文件上传的表单即可,代码如下:
<html>
<head><meta charset="utf-8"></head>
<body>
<form action method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="text" name="name" <br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
访问页面后,按“F12”点击查看器,右击HTML标签选择“编辑HTML”,将以上代码写入,保存。如图所示。
在物理机上可通过访问虚拟机IP(192.168.194.165)加Docker开启的8080端口,间接访问漏洞环境,如图所示。
在文本框中写入上传后文件的名字,如:test.php,选择一个带有phpinfo代码的PHP文件,利用BurpSuite抓包上传,按【Ctrl】+【R】快捷键发送至“Repeater”模块,如图所示。
在test.php后插入空格,点击Hex,找到test.php后空格所对应的十六进制:“20”(0x20),将其改为“0a”(0x0a),如图所示。
点击“Go”,访问http://192.168.194.165:8080/test.php%0A,可以看到PHP代码已经被解析,如图所示。