文件上传漏洞验证需动手确认能否真正上传并执行,而非依赖扫描报告;应先定位上传点、抓包分析请求与响应,再分层测试前端JS、后端黑名单、Content-Type、文件头等绕过方式,最后用探针验证PHP执行能力。

发现上传漏洞不能只看扫描报告,得动手验证它是否真能利用。重点不是“有没有报”,而是“能不能传、能不能执行、会不会被拦”。
确认上传点的真实性和上下文
先搞清这个上传功能在哪、谁用、怎么触发:
- 是前端表单(如头像上传、附件提交),还是后台管理中的文件导入?不同位置权限和校验逻辑差异很大;
- 抓包看实际请求:是否带 Content-Type(如 multipart/form-data)、是否有 token 或 referer 校验;
- 检查响应内容:返回的 URL 是直接可访问路径(如
/uploads/123.php),还是经由代理或重写(如/file?id=123)——后者可能不落地,无法执行。
分层测试绕过方式
别一上来就传 .php,按常见防护层级逐项试探:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
前端 JS 校验:禁用浏览器 JavaScript,或用 Burp 修改文件名(如
shell.jpg→shell.php)再发包; -
服务端后缀黑名单:试
.php3、.phtml、.php5、.phar,PHP 8.2 默认仍解析这些; -
Content-Type 检查:把
image/jpeg改成application/x-php或空值,看是否拦截; -
文件头校验:用十六进制编辑器在 PHP 文件开头加
GIF89a;,保存为shell.gif,上传后尝试访问并加?a=.php或.php后缀解析; -
大小写/编码绕过:传
ShElL.Php、shell.php%00.jpg(注意 PHP 8.2 已默认拒绝 %00 截断,但部分 Nginx 配置仍有风险)。
验证能否真正执行代码
上传成功只是第一步,关键看服务器是否把它当脚本执行:
- 上传一个最小化探针:
,保存为test.php,上传后用浏览器直接访问该 URL,看是否输出alive; - 如果返回源码或 403/404,说明 Web 服务器未将该目录设为可执行,或
open_basedir/disable_functions限制严格; - 若返回 500,检查错误日志(
tail -f /var/log/php/error.log),看是否因 PHP 8.2 新增弃用项(如动态属性、create_function)导致解析失败; - 避免用
system('id')等高危函数直接测试,优先用phpinfo()或getcwd()确认执行环境。
结合 PHP 8.2 特性做针对性验证
PHP 8.2 对某些旧绕过方式做了加固,需注意:
-
%00截断已失效,不再尝试shell.php%00.jpg; -
phar://反序列化仍有效,但需目标启用phar.readonly=Off(默认为 On),可用php -i | grep phar确认; - 上传的文件若含 PHP 8.2 不兼容语法(如未声明的动态属性、
__callStatic返回类型缺失),会导致解析失败——这本身也是种“防御”,但容易误判为不可执行; - 检查是否启用了
opcache.validate_permission=1或upload_tmp_dir权限隔离,这些会影响临时文件处理流程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










