上传漏洞审计需紧盯文件名、临时路径、保存路径三个变量,重点回溯其来源与拼接逻辑,核查白名单校验、真实类型检测及上传目录可执行性。

盯紧三个关键变量
上传漏洞往往藏在 文件名、临时路径、保存路径 这三个变量的拼接或赋值逻辑里。审计时直接搜索 $_FILES、move_uploaded_file、file_put_contents、fopen 等函数调用点,定位到具体文件后,立刻回溯这三个变量的来源。
重点看:
- $tmp_name 是否来自 $_FILES 且未经校验直接使用
- $name 是否被拼进最终路径(如 "upload/".$_FILES['file']['name'])
- 保存路径是否可控(比如由 $_GET['dir'] 或配置项动态拼接)
检查扩展名和 MIME 的验证方式
黑名单过滤(如禁止 .php、.phtml)基本无效,绕过方法太多。要确认是否采用白名单机制,且白名单是否硬编码在代码中、未被外部参数覆盖。
同时注意:
- 是否只校验客户端传来的 $_FILES['file']['type']?这个字段完全由浏览器控制,不可信
- 是否做了服务端内容检测(如读取文件头、用 finfo_file 识别真实类型)
- 是否允许双扩展名(如 shell.php.jpg)、大小写绕过(.PHP)、空字节截断(shell.php%00.jpg)
确认上传目录是否可执行
即使文件名被重命名、扩展名被过滤,只要上传目录被 Web 服务器解析为 PHP,仍可能被利用。审计时不能只看代码,还要结合部署环境判断:
- 上传路径是否在 Web 根目录下(如 /uploads/)
- Web 服务器(Nginx/Apache)是否对该目录禁用了脚本执行(如 Nginx 中的 location ~ \.php$ { deny all; })
- 目录是否存在 .htaccess 或 nginx.conf 覆盖行为(尤其多租户或用户可写配置的场景)
快速验证是否存在未授权上传点
很多上传功能本应登录后使用,但开发疏忽导致接口暴露。审计时优先排查:
- 非 /admin/、/manage/ 等后台路径下的上传入口(如 /api/upload.php、/include/up.php)
- 前端隐藏但未做权限校验的接口(如仅靠 JS 注释掉按钮,后端无 is_login() 判断)
- 第三方组件或插件自带的上传模块(如编辑器 kindeditor、ueditor 的 dialog.php)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











