本文所有知识点仅用于网络安全防御技术学习 ,测试手段仅可在合法授权的测试环境 中使用。如需复现漏洞,可使用 phpStudy 搭建本地靶机测试环境,模拟不同服务器版本进行验证。未经授权侵入他人系统、窃取信息属违法行为,将承担相应法律责任。网络安全的核心是 "攻防兼备",掌握攻击手段的同时,更要牢记防护使命,共同维护网络空间安全。
目录
[(一)Apache 解析漏洞](#(一)Apache 解析漏洞)
[1. 核心特性](#1. 核心特性)
[2. 典型利用场景](#2. 典型利用场景)
[3. 补充知识点](#3. 补充知识点)
[(二)IIS 解析漏洞](#(二)IIS 解析漏洞)
[1. IIS 6.0 漏洞(经典高风险)](#1. IIS 6.0 漏洞(经典高风险))
[2. IIS 7.x 漏洞(Fast-CGI 模式)](#2. IIS 7.x 漏洞(Fast-CGI 模式))
[(三)Nginx 解析漏洞](#(三)Nginx 解析漏洞)
[1. 核心漏洞类型](#1. 核心漏洞类型)
[2. 利用条件](#2. 利用条件)
[1. 通用防御措施](#1. 通用防御措施)
[2. 服务器专属修复](#2. 服务器专属修复)
[3. PHP 配置优化](#3. PHP 配置优化)
一、解析漏洞核心概念
解析漏洞是指 Apache、IIS、Nginx 等主流 Web 服务器,在特定条件下将非脚本格式文件 (如图片、文本文件)错误解释为可执行脚本文件(如 PHP、ASP)并执行,从而被攻击者利用的安全漏洞,核心危害是攻击者可通过上传恶意文件获取服务器控制权。
二、主流服务器解析漏洞详解
(一)Apache 解析漏洞
1. 核心特性
解析规则:从右到左识别文件后缀,未识别后缀则向左递归判断(如1.php.jhh1会被解析为 PHP 文件)。
关键漏洞:CVE-2017-15715(影响 2.4.0~2.4.29 版本),因正则$可匹配\n或\r,1.php\x0A会被当作 PHP 文件解析。
2. 典型利用场景
配置AddHandler application/x-httpd-php .php后,任何含.php后缀的文件都会被解析。
上传test.php.(后缀加点),抓包修改为test.php%0A(换行符),直接访问即可执行。
3. 补充知识点
Apache 默认依赖mime.types文件识别后缀,自定义AddType指令可能扩大解析范围(如AddType application/x-httpd-php .jpg会让 JPG 文件以 PHP 执行)。
(二)IIS 解析漏洞
1. IIS 6.0 漏洞(经典高风险)
(1) 文件名截断:*.asp;.jpg格式文件会忽略;后内容,按 ASP 解析(如shell.asp;.jpg)。
核心意思:IIS 6.0 服务器遇到shell.asp;.jpg这类文件名时,会自动忽略分号(;)及后面的所有内容 ,只把前面的shell.asp当作有效文件名,最终按 ASP 脚本执行这个文件(哪怕实际是 JPG 后缀)。
简单类比:就像你给文件起名 "笔记.txt;.pdf",电脑却只认 "笔记.txt" 并按文本文件打开,完全不管后面的.pdf 后缀 ------ 这里 IIS 6.0 就是 "认.asp 不认后面的内容",让恶意文件披着 JPG 的 "外衣" 执行 ASP 恶意代码。
(2) 文件夹欺骗:*.asp/目录下所有文件均按 ASP 解析,新建1.asp文件夹后,其中shl.jpg会被当作 ASP 执行。
核心意思:IIS 6.0 服务器会把名称带*.asp/的文件夹,当成 "ASP 脚本执行目录"------ 哪怕文件夹里是 JPG、TXT 这类普通文件,都会被强制按 ASP 脚本解析执行。
简单类比:就像给文件夹贴了 "ASP 专属" 标签,不管里面装的是照片(JPG)还是笔记(TXT),服务器都只认 "标签",不认文件本身,一律按 ASP 脚本运行。
(3) 特殊后缀支持:默认解析.asa、.cer、.cdx后缀文件为 ASP 脚本。
核心意思:IIS 6.0 服务器有个默认规则 ------不用额外配置,就会把后缀是.asa、.cer、.cdx的文件,直接当作 ASP 脚本解析执行,哪怕文件内容是恶意代码也会运行。
简单类比:这就像系统默认把标了 "ASP 专属" 标签的文件直接放行,哪怕这些文件看起来不是常见的.asp后缀,服务器也会按 ASP 脚本执行,相当于给攻击者多了几个 "伪装通道"。
2. IIS 7.x 漏洞(Fast-CGI 模式)
解析规则:文件后加/.php即可触发(如1.jpg/.php会将 JPG 解析为 PHP)。
核心意思:IIS 7.x 在 Fast-CGI 模式下,给任意文件(比如图片、文本)的 URL 后面加 /.php,服务器就会把这个文件当成 PHP 脚本执行 ------ 比如 1.jpg 本身是图片,访问 1.jpg/.php 时,IIS 会让 PHP 解析器去执行这张 "图片"。
简单类比:就像给普通文件贴了个 "PHP 脚本" 的标签,服务器只看标签(URL 里的 /.php),不管文件本身是什么类型,直接按标签对应的规则执行。
漏洞根源:默认开启cgi.fix_pathinfo=1,PHP 会自动寻找路径中存在的文件并执行。
(三)Nginx 解析漏洞
1. 核心漏洞类型
(1) 路径欺骗漏洞:1.jpg/xxx.php形式 URL,Nginx 传递路径给 PHP 后,因xxx.php不存在,PHP 会以1.jpg作为执行文件。
核心意思:Nginx 服务器遇到 1.jpg/xxx.php 这种 URL 时,会因为 URL 以 .php 结尾,把整个路径传给 PHP 解析;但服务器上根本没有 xxx.php 文件,PHP 就会 "退而求其次",找到路径中真实存在的 1.jpg,并把它当作 PHP 脚本执行。
简单类比:就像你要找 "张三 / 李四",发现李四不存在,就直接让张三来替李四办事 ------ 这里的 "张三" 就是 1.jpg,"李四" 是 xxx.php,服务器最终让图片文件执行了 PHP 的 "活"。
(2) 空字节漏洞(影响 0.5.、0.6. 、0.7<=0.7.65、0.8<=0.8.37 版本):shell.jpg%00.php(%00为空字节)会被解析为 PHP,不受cgi.fix_pathinfo配置影响。
核心意思:低版本 Nginx(0.5.、0.6. 、0.7<=0.7.65、0.8<=0.8.37)遇到 shell.jpg%00.php 这类 URL 时,会把 %00(空字节)当作 "字符串结束符",直接忽略后面的 .php,将 shell.jpg 当作 PHP 文件解析执行 ------ 而且这个漏洞和 cgi.fix_pathinfo 配置无关,哪怕设为 0 也会触发。
简单类比:就像给文件名字符串 "画了终止线",%00 前面的内容(shell.jpg)被服务器当作完整文件名,后面的 .php 直接 "作废",但因为 URL 里有 .php 结尾,服务器还是按 PHP 脚本执行前面的文件。
2. 利用条件
服务器开启 PHP-FastCGI 模式,且未限制上传目录脚本执行权限。
三、漏洞利用常见绕过方式
| 检测类型 | 绕过手段分类 | 具体绕过方式 | 适用场景 |
|---|---|---|---|
| 前端 JS 检测 | 抓包修改 | 1. 前端限制后缀(如禁止.php),上传合法文件后用 Burp 抓包改名为恶意后缀(如 test.php) | 仅前端 JS 校验,无后端二次检测 |
| 前端 JS 检测 | 本地 JS 篡改 | 2. 浏览器控制台禁用前端 JS,直接上传恶意文件 | 前端 JS 逻辑简单可绕 |
| 服务器 MIME 检测 | Content-Type 篡改 | 1. 上传图片时,抓包将Content-Type: image/jpeg改为application/x-httpd-php |
仅校验请求头 MIME,不校验文件内容 |
| 黑名单检测 | 后缀变形 | 1. 大小写绕过 :Test.PHP/tEsT.pHp(适用于 Windows IIS、Apache 低版本) |
服务器仅禁止小写恶意后缀,不区分大小写 |
| 黑名单检测 | 后缀变形 | 2. 双写绕过 :test.pphphp(服务器过滤一次.php 后剩余 test.php) |
服务器仅简单替换恶意后缀(如把.php 替换为空) |
| 黑名单检测 | 后缀变形 | 3. 特殊后缀绕过:test.php./test.php_(后缀加空格 / 点 / 下划线,部分服务器自动截断) |
服务器未过滤带特殊符号的后缀 |
| 黑名单检测 | 后缀变形 | 4. 多后缀绕过:test.php.jpg(Apache 从右向左识别,结合解析漏洞执行) |
服务器仅检测最后一个后缀,未防御解析漏洞 |
| 黑名单检测 | 特殊符号截断 | 5. 0x00 截断:test.jpg%00.php(低版本服务器截断 %00 后内容) |
PHP<5.3.4、IIS 6.0 等老旧环境 |
| 黑名单检测 | 特殊符号截断 | 6. 分号截断:test.asp;.jpg(IIS 6.0 忽略;后内容) |
仅适用于 IIS 6.0 |
| 黑名单检测 | 配置文件攻击 | 7. .htaccess攻击:上传.htaccess 文件,内容写AddType application/x-httpd-php .jpg(Apache 将 jpg 解析为 PHP) |
Apache 服务器允许上传.htaccess,且未限制其权限 |
| 黑名单检测 | 操作系统特性 | 8. 文件名含特殊字符:test.php (末尾加空格,Windows 自动去除)/test.php:(Windows 不允许的符号,服务器自动截断) |
Windows 服务器未过滤文件名特殊字符 |
| 白名单检测 | 解析漏洞结合 | 1. 路径欺骗:test.jpg/.php(IIS 7.x/Nginx,结合 cgi.fix_pathinfo=1) |
白名单仅允许图片后缀,服务器开 Fast-CGI 模式 |
| 白名单检测 | 解析漏洞结合 | 2. 文件夹欺骗:test.asp/目录下传 test.jpg(IIS 6.0 解析为 ASP) |
白名单仅允许图片后缀,适用于 IIS 6.0 |
| 白名单检测 | 解析漏洞结合 | 3. 特殊后缀解析:test.cer/test.asa(IIS 默认解析为 ASP) |
白名单允许.cer/.asa 等 IIS 默认解析后缀 |
| 白名单检测 | 本地文件包含(LFI)结合 | 4. 上传 test.jpg(含 PHP 代码),通过 LFI 漏洞包含执行 | 服务器存在 LFI,且上传路径可访问 |
| 文件内容检测 | 文件头伪装 | 1. 恶意代码前加图片头(如 JPG 头FF D8 FF E0),保存为 test.jpg |
仅校验文件头,不校验完整内容 |
| 文件内容检测 | 代码注入 | 2. 图片中嵌入 PHP 代码(如<?php eval($_POST['cmd']);?>),结合解析漏洞执行 |
仅校验文件格式,未检测内容中的恶意代码 |
| 文件内容检测 | 二次渲染绕过 | 3. 利用图片二次渲染漏洞(如压缩时保留代码),嵌入代码到图片可保留区域 | 服务器对图片二次渲染,但逻辑有缺陷 |
| 其他检测 | 协议绕过 | 1. 远程文件包含(RFI):上传文件到远程服务器,通过 RFI 包含执行 | 服务器允许 RFI,且上传文件可公网访问 |
| 其他检测 | 分块上传 | 2. 分块上传恶意文件,绕过单文件大小 / 内容检测 | 服务器对单文件检测严格,未限制分块上传 |
| 其他检测 | 符号绕过 | 3. 反斜杠绕过:test.php\(Windows 服务器自动去除反斜杠) |
四、漏洞修复方案
1. 通用防御措施
禁用文件上传目录脚本执行权限(Apache/Nginx/IIS 均需配置)。
实现 "库站分离":上传文件存储在独立服务器或云存储,不与 Web 服务同服务器。
严格校验文件:前端 + 后端双重校验,检查文件后缀、内容(如图片文件校验文件头)。
2. 服务器专属修复
Apache:升级至 2.4.30 + 版本;禁用不必要的AddHandler/AddType指令;正则匹配文件后缀时加\z替代$(精准匹配字符串结尾)。IIS 6.0:限制.asp、.asa等后缀的文件上传;禁用危险文件夹命名规则;升级至更高版本。
IIS 7.x:修改php.ini中cgi.fix_pathinfo=0,重启 PHP-CGI 服务;配置 IIS 禁止 URL 中包含/.php后缀的访问。
Nginx:升级至安全版本;配置security.limit_extensions = .php(仅允许 PHP 后缀执行);禁止上传目录的execute权限。
3. PHP 配置优化
关闭cgi.fix_pathinfo(设为 0),避免路径自动补全。
限制open_basedir,防止 PHP 访问非授权目录。
五、实战案例总结
- IIS 6.0 案例 :上传
asp大马.asp;.jpg,利用;截断特性,成功执行 ASP 脚本获取服务器权限。 - IIS 7.5 案例 :上传
1.png恶意图片马,通过20200318110451.png/.php访问执行,获取虚拟终端。 - Nginx 案例 :论坛上传图片马
baidu.jpg,通过baidu.jpg/index.php访问,利用解析漏洞连接菜刀工具,窃取数据库信息。
六、关键注意事项
- 解析漏洞常与文件上传漏洞结合利用,防御需 "上传校验 + 解析限制" 双重保障。
- 老旧服务器(如 IIS 6.0、Apache 2.4.29 以下)是漏洞高发区,优先升级版本。
- 云服务器需额外配置安全组,限制上传目录的外部访问权限。
提示:实际测试需获得合法授权,禁止未授权渗透测试!如需复现漏洞,可使用 phpStudy 搭建本地靶机测试环境,模拟不同服务器版本进行验证。