phpstudy前端js校验形同虚设,因checkfile()仅在浏览器执行;content-type可被篡改;后缀黑名单易被大小写、空格、点号及双写绕过;默认不校验文件内容或重命名。

PHPStudy里前端JS校验形同虚设
因为 checkFile() 这类函数只在浏览器里跑,PHPStudy 启动的 PHP 服务压根不执行它。用户点上传按钮时,JS 检查失败就直接 return false,请求根本没发出去——但只要禁用 JS 或删掉 onsubmit="return checkFile()",表单立刻就能提交任意后缀文件。
常见操作包括:
- F12 → F1 → 勾选 “Disable JavaScript”
- 用 Script Blocker Ultimate 插件全局拦截 JS
- 右键“查看页面源代码”,复制整个
<form></form>到本地 HTML 文件,删掉onsubmit属性再打开上传
Content-Type 字段完全由客户端控制
PHP 的 $_FILES['upload_file']['type'] 取值来源是 HTTP 请求头里的 Content-Type,不是文件真实内容。PHPStudy 默认没做深度解析,只比对字符串是否匹配 image/jpeg 这类固定值。你用 Burp Suite 抓包后把 Content-Type: text/plain 改成 Content-Type: image/png,服务端就信了。
注意:这个值和文件扩展名无关,rce.php 的 Content-Type 也能设成 image/gif。
后缀黑名单校验容易被大小写、空格、点号绕过
很多靶场(比如 upload-labs Pass-03)用 strrchr() 或 pathinfo($filename, PATHINFO_EXTENSION) 提取后缀,但没统一转小写或 trim 空格。结果 shell.PHP、shell.php.、shell.php[space] 全部能过检测。
更隐蔽的是双写,比如传 shell.pphphp,某些正则替换逻辑(如 str_replace('php', '', $ext))会先删掉中间 php,剩下 shell.php 被最终保存。
PHPStudy 默认配置不校验文件内容或重命名
本地测试环境通常跳过两个关键防护:
- 没调用
getimagesize()或finfo_open()检查文件头,所以 GIF89a 开头的图片马能直接执行 - 没启用
move_uploaded_file()后的重命名逻辑,上传的shell.php仍保留原名,放在 Web 可访问路径下就能直连
这些都不是 PHPStudy “有漏洞”,而是它作为教学环境,默认关闭了生产级防护——这也正是你练绕过的前提。真要复现,得盯住具体靶场的 PHP 源码里哪一行做了什么判断,而不是笼统说“PHPStudy 不安全”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











