PHP 7.4文件上传漏洞排查核心是还原上传链路:查入口(grep $_FILES)、验逻辑(白名单+真实MIME+魔数检测)、看路径(防遍历/截断)、验落地(目录禁执行+非Web根目录存储),三道防线缺一不可。

PHP 7.4 网站文件上传漏洞排查,核心是“查入口、验逻辑、看路径、验落地”,不能只盯后缀名过滤,要还原整个上传链路是否被用户输入可控。
检查上传接口是否直接受控
重点扫描所有接收 $_FILES 的脚本(如 upload.php、api/upload、admin/do_upload),用 grep 快速定位:
grep -r "\$_FILES\[" ./ --include="*.php"
确认是否存在以下危险模式:
- 未校验
$_FILES['file']['name']就直接拼进路径,例如:$path = 'uploads/' . $_FILES['file']['name']; - 仅靠前端 JS 或
accept="image/*"限制类型——这类完全可绕过 - 用
pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)提取后缀,但没统一转小写,导致phP绕过 - 白名单校验后,又用
basename()处理文件名,却没防shell.php%00.jpg类型的 00 截断
验证服务端校验是否闭环
上传功能是否真正安全,取决于三道防线是否都生效:
立即学习“PHP免费学习笔记(深入)”;
-
扩展名校验:必须用白名单(如
in_array($ext, ['jpg', 'png', 'pdf'], true)),禁用黑名单;大小写需统一转小写再比对 -
MIME 类型校验:仅检查
$_FILES['file']['type']不可靠(客户端伪造),应配合finfo_open(FILEINFO_MIME_TYPE)读文件头 -
内容检测:对图片类上传,读取前 2–4 字节判断魔数(
255216 → JPG、13780 → PNG);非图片类需额外做二进制特征扫描(如 PHP 标签<?php)
特别注意:.htaccess、.user.ini 文件若允许上传,可能直接改写解析规则,让 shell.jpg 被当作 PHP 执行。
审查保存路径与文件名生成逻辑
攻击者常通过控制 save_path、filename 参数或利用截断,把文件写到 Web 可访问目录并执行。排查时关注:
- 是否使用用户传入的参数(如
$_GET['dir']、$_POST['save_path'])拼接存储路径 - 是否在重命名时保留原始扩展名,或用随机名但未清除原文件名中的恶意字符(如
shell.php/.jpg中的/) - 是否对完整路径调用
realpath()并检查是否落在预期根目录内(如/var/www/html/uploads/),防止符号链接跳出 - 上传后是否直接返回可访问 URL,且该 URL 对应路径未设为
deny all(Nginx)或Require all denied(Apache)
测试常见绕过手法是否生效
不依赖工具,手工验证几类典型绕过是否被拦截:
- 上传
shell.php.jpg,抓包改 Content-Disposition 中 filename 为shell.php - 上传
shell.php%00.jpg(URL 编码后的空字节),观察服务端是否仍保存为shell.php - 上传含
<?php phpinfo();?>的图片,在末尾追加 PHP 内容,再用php://filter/convert.base64-encode/resource=尝试读取 - 尝试上传
.htaccess(内容:AddType application/x-httpd-php .jpg),再上传同目录下shell.jpg
每一步都要查看实际保存的文件名、路径、权限(ls -l),以及能否通过 HTTP 直接访问并执行。



















