文件上传漏洞实战:从upload-labs 1~5看Web安全攻防

发布时间:2026/5/15 13:57:25

文件上传漏洞实战:从upload-labs 1~5看Web安全攻防 1. 前端JS验证绕过实战Pass-01当你点击上传按钮时突然弹出文件类型不允许的提示但页面根本没有刷新——这种情况八成遇到了前端JS验证。我去年审计某企业OA系统时就发现他们仅靠前端验证来过滤上传文件导致攻击者只需禁用JS就能轻松上传Webshell。前端验证的原理很简单浏览器在文件提交到服务器前先用JavaScript检查文件后缀名。查看Pass-01的源码会发现这样的逻辑function checkFile() { var allow_ext .jpg|.png|.gif; var ext_name file.substring(file.lastIndexOf(.)); if (allow_ext.indexOf(ext_name |) -1) { alert(该文件不允许上传); return false; } }绕过方法比想象中简单按F12打开开发者工具在Sources面板找到包含checkFile()的JS文件直接删除表单的onsubmit事件或修改return checkFile()为return true此时再上传php文件就像穿过空气墙一样畅通无阻我曾用Burp Suite的Repeater模块测试过即使不改JS代码只要拦截请求并修改文件名后缀同样能绕过验证。这暴露出前端验证的最大问题客户端的所有检查都不可信任。2. 服务端MIME类型检测突破Pass-02某次渗透测试中我发现目标网站上传接口会检查Content-Type字段。这属于服务端MIME验证的典型场景比前端JS验证难对付些但仍有致命缺陷。Pass-02的PHP源码关键判断如下if ($_FILES[upload_file][type] image/jpeg) { move_uploaded_file($temp_file, $img_path); }实战绕过步骤用Burp抓取上传请求包将Content-Type从application/octet-stream改为image/jpeg观察响应包中的文件路径回显直接访问上传的php文件如/upload/shell.php有个容易忽略的细节不同浏览器对MIME类型的处理差异。比如Chrome上传.jpg文件时默认Content-Type是image/jpeg而Firefox可能发送image/pjpeg。开发人员如果校验逻辑不严谨就可能被特殊MIME类型绕过。3. 黑名单策略的致命漏洞Pass-03黑名单机制就像只堵已知的漏洞我遇到过把.php、.asp等50多种后缀加入黑名单的系统结果还是被我用.phtml成功突破。Pass-03的源码展示了典型的黑名单实现$deny_ext array(.asp,.aspx,.php,.jsp); if(!in_array($file_ext, $deny_ext)) { // 允许上传 }绕过黑名单的六种姿势冷门脚本后缀.php5、.pht、.phar需服务器配置支持大小写变形.PHP、.PhPWindows服务器不区分大小写特殊字符截断shell.php%00.jpg利用PHP的null字节截断双重后缀shell.jpg.php配合Apache解析漏洞空格/点号shell.php. Windows会自动去除末尾点配合.htaccess详见Pass-04去年某CMS爆出的漏洞就是黑名单遗漏了.phar后缀攻击者上传.phar文件配合phar://协议实现RCE。这提醒我们黑名单永远会有漏网之鱼。4. .htaccess文件的核弹级利用Pass-04.htaccess是Apache的分布式配置文件就像给服务器注射变异药剂。有次我拿到网站写权限后通过.htaccess让所有.jpg文件都当作PHP执行管理员半年都没发现异常。Pass-04的绕过流程上传包含以下内容的.htaccess文件FilesMatch shell.jpg SetHandler application/x-httpd-php /FilesMatch上传图片马shell.jpg实际是PHP代码访问/shell.jpg触发代码执行防御方要注意在httpd.conf中设置AllowOverride None对.htaccess文件做指纹监控禁用高危指令如php_value、SetHandler有个坑点如果网站使用Nginx.htaccess方案会失效。这时要转而利用Nginx的解析漏洞比如上传shell.jpg/.php触发错误配置。5. .user.ini的隐蔽攻击链Pass-05.user.ini像是PHP应用的隐形开关它能自动包含指定文件。某次实战中我发现网站允许上传.ini文件但过滤了.htaccess于是用.user.ini构建了攻击链上传.user.ini文件auto_prepend_fileshell.jpg上传包含PHP代码的shell.jpg访问同目录下的正常php文件如index.php时shell.jpg会被自动包含关键原理auto_prepend_file会在文件头部自动包含目标文件需要目录下有可访问的PHP文件如Pass-05的readme.php比.htaccess更隐蔽因为不会改变文件解析方式防御建议在php.ini中设置user_ini.filename为空禁用危险指令如auto_prepend_file对上传目录设置open_basedir限制记得有次甲方坚持认为.user.ini没风险我当场演示了如何通过它实现持久化后门他们立刻修改了上传策略。这再次证明安全防护必须层层设防任何单一措施都可能被突破。

相关新闻