Apache HTTPD 换行解析漏洞(CVE-2017-15715) 漏洞复现
前言
Apache在2.4.0-2.4.29版本中存在一个解析漏洞。程序在解析PHP时,如果文件名最后有一个换行符x0A
,apache依然会将其当成php解析,但是在上传文件时可以成功的绕过黑名单。
如果上传文件的php程序是设置的白名单,那么这个漏洞将无法利用。
漏洞环境
该环境使用vulhub搭建,该漏洞路径为 vulhub/httpd/CVE-2017-15715
。进入该漏洞路径后执行以下命令:
docker-compose up -d
-d 表示后台运行。
注意:该命令必须在漏洞目录下执行,该命令是启动当前目录下的docker容器。
如果不会搭建环境可以参考官方文档:https://vulhub.org/#/docs/
原理分析
启动容器后执行以下命令查看容器ID。
docker ps
然后执行以下命令进入容器。
docker exec -it 容器ID /bin/bash
exec 表示在容器中执行一个命令,该命令后加容器ID和要执行命令,上面执行的命令就是/bin/bash。
-i 表示即使没有连接,也要保持STDIN打开,也就是一直监听命令的状态。
-t 表示分配一个tty终端设备,加上这个参数就具有按TAB自动补全命令等等功能。
更多详细内容可以参考:https://blog.csdn.net/qq_40081976/article/details/84590119,docker exec 的使用-it操作。
查看一下上传文件的php文件:
cat index.php
该程序是采用黑名单的形式,如果文件后缀名不在名单内即可上传,所以 a.php\x0A
不在黑名单列表中,可以上传。但是x0A
是换行符,所以apache会直接忽略,将其当成php来执行。
漏洞复现
打开目标地址 http://192.168.119.131:8080/
,选择一句话木马准备上传。
然后打开burpsuite,开启数据监听。
点击网页中提交按钮,上传文件。此时burpsuite就会抓取提交的数据。
点击 Hex
按钮,进入十六进制编辑页面,并找到文件名a.php
的位置。
然后再文件名后插入0A
,这个位置也就是在 od oa
的前面。
然后点击 Forward
按钮,这时候浏览器上什么也没有显示,但是此时文件已经上传成功了。接下来访问一句话木马a.php%0a
,并通过参数a传递命令即可控制服务器。
http://192.168.119.131:8080/a.php%0A?a=id
注意:该文件名是通过
$_POST['name']
获取的,所以会将x0A
保留。如果文件名使用的是$_FILES['file']['name']
获取将会自动把末尾的x0A
去掉,导致无法利用该漏洞。