php文件上传漏洞绕过需针对性突破服务端三重校验:文件名(大小写、多点空格、%00截断、ntfs流)、mime类型(不可信$_files['type'],须用finfo_file()验证)、文件内容(图片马、伪造gif头、gd/imagick重绘剥离代码)。

绕过前端JavaScript校验
这是最基础也最容易突破的一环。前端用JS检查后缀(如只允许.jpg/.png),本质是信任客户端,毫无安全性可言。
- 直接禁用浏览器JavaScript:F12 → 设置 → 禁用JS,再上传.php文件即可
- 用Burp Suite抓包,在发送前把文件名从
shell.jpg改成shell.php - 查看页面源码,找到
onsubmit="return checkFile()",临时删掉或改返回值为true
绕过后端文件名检查
服务端常靠pathinfo($filename, PATHINFO_EXTENSION)取后缀做白/黑名单判断,但这个函数极易被构造特殊文件名欺骗。
-
大小写混合:如
shell.PHP、shelL.pHp,部分Windows或旧配置不区分大小写 -
多点与空格:传
shell.php.jpg或shell.php[空格],某些解析逻辑会取最后一个点或忽略尾部空白 -
空字节截断(PHP ≤5.3.4):
shell.php%00.jpg,move_uploaded_file()遇到%00会截断,实际保存为shell.php -
NTFS数据流(仅Windows):
shell.php::$DATA,系统识别为shell.php主文件,绕过后缀检测
绕过MIME类型校验
服务端若只检查$_FILES['file']['type'],就等于完全信任浏览器提交的Content-Type,这是严重误判。
- Burp抓包后,将
Content-Type: application/octet-stream改为image/jpeg或image/png - 注意:
$_FILES['type']字段不可信,必须用finfo_file()读取真实文件头来判断MIME
绕过文件内容检测
即使做了getimagesize()或exif_imagetype(),也只能验证文件头是否符合图片规范,无法阻止恶意代码嵌入。
-
图片马(Image Shell):用命令
copy /b 1.jpg + shell.php webshell.jpg(Windows)合并文件,头部仍是合法图片,末尾藏PHP代码 -
伪造文件头:在PHP文件开头加
GIF89a;,让getimagesize()误判为GIF图片 - 重绘图像:真正安全的做法是用GD或Imagick加载后再另存——这会剥离所有附加代码
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











