Pikachu靶场实战:绕过文件上传限制的三种高级技巧

发布时间:2026/7/1 12:06:16

Pikachu靶场实战:绕过文件上传限制的三种高级技巧 1. 从零理解文件上传漏洞的本质很多刚接触Web安全的朋友可能会疑惑为什么一个简单的文件上传功能会成为安全隐患这得从网站处理用户文件的机制说起。想象一下你小区的快递柜——如果管理员不检查包裹内容任何人都能往柜子里放危险物品。同理当网站不对上传文件做严格校验时攻击者就能上传恶意脚本。Pikachu靶场的unsafe upfileupload模块完美模拟了这类漏洞场景。我刚开始做渗透测试时发现80%的文件上传漏洞都源于三种防御机制的缺陷前端校验Client Check、MIME类型校验和getimagesize()校验。下面我会用最接地气的方式带你逐个击破这些防御。2. 突破前端校验的障眼法2.1 为什么前端校验不可靠前端校验就像超市门口的安检门——看起来严格但其实绕过它比想象中简单。很多开发者只在前端用JavaScript检查文件扩展名这种防御有个致命弱点浏览器开发者工具就能轻松绕过。记得我第一次实战时遇到个只允许上传.jpg的网站。试着把webshell改名为test.jpg上传结果前端提示文件类型错误。这时候打开F12开发者工具直接删掉onSubmit事件里的校验函数瞬间上传成功。这种操作就像把违禁品藏在玩具盒里过安检本质上是在利用前后端校验不一致的漏洞。2.2 实战绕过五步曲在Pikachu靶场里复现这个场景特别简单桌面新建test.txt写入?php phpinfo();?重命名为shell.png欺骗前端校验开启Burp Suite拦截请求上传时把文件名改回shell.php访问/uploads/shell.php看到phpinfo页面关键点在于前端看到的永远是修改后的假扩展名而服务器收到的是原始文件。有次给客户做渗透发现他们系统竟然用前端隐藏域存储文件类型用Burp改个参数就直接绕过了这种低级错误在企业系统里出奇地常见。3. 戏弄MIME类型检测3.1 MIME校验的原理与缺陷MIME类型就像是文件的身份证浏览器通过Content-Type字段告诉服务器这是个图片/文档/视频。但问题在于——这个身份证是用户自己填的。就像你能在快递单上写日用品实际寄电子产品一样MIME类型也能被伪造。去年审计某CMS系统时发现它的上传逻辑是这样的if($_FILES[file][type] ! image/jpeg){ die(只允许JPEG图片); }这种校验简直形同虚设因为$_FILES[type]完全来自HTTP请求头用Burp把Content-Type改成image/jpeg就能轻松绕过。3.2 靶场实战偷梁换柱在Pikachu靶场演示更直观准备shell.php文件内容为?php system($_GET[cmd]);?上传时Burp拦截请求修改Content-Type为image/png放行请求后访问上传路径有个骚操作是结合文件包含漏洞先上传伪装成图片的PHP文件再通过文件包含触发。有次真实渗透中我就靠这招在限制上传但存在包含漏洞的系统上拿到了shell。4. 制作能骗过getimagesize()的图片马4.1 图片马的魔术原理getimagesize()是PHP检测图片真实性的函数它会读取文件头部的魔术字节。好比验钞机要检查水印这个函数会验证文件是不是真正的图片。但高级攻击者可以在图片末尾追加PHP代码——就像在画框背面藏纸条。经过多次测试我发现JPEG格式兼容性最好。制作过程其实很简单copy /b cat.jpg shell.php trojan.jpg生成的trojan.jpg用图片查看器正常显示但用文本编辑器拉到文件末尾能看到PHP代码。这种攻击之所以有效是因为getimagesize()只检查文件开头而PHP解释器会执行文件中的任何?php ?标签。4.2 靶场实战三步走在Pikachu环境验证用记事本创建test.php写入?php phpinfo();?准备一张正常的demo.jpg命令行执行copy demo.jpg /b test.php /b shell.jpg上传shell.jpg并记录路径通过文件包含漏洞包含该图片有个坑要注意某些GD库版本会重新压缩图片可能破坏植入的代码。有次客户系统就因为这个导致攻击失败后来改用更隐蔽的EXIF注入才成功。5. 防御者视角的加固方案既然知道了攻击手法作为开发者该如何防御呢根据OWASP建议应该采用分层防御策略白名单校验只允许特定的扩展名和MIME类型$allowed [jpg, png]; $ext pathinfo($filename, PATHINFO_EXTENSION); if(!in_array(strtolower($ext), $allowed)){ die(非法文件类型); }文件内容检测使用finfo_file()代替getimagesize()$finfo finfo_open(FILEINFO_MIME_TYPE); $mime finfo_file($finfo, $_FILES[file][tmp_name]);重命名上传文件避免用户控制文件名$new_name md5(uniqid())...$ext;设置php.ini限制upload_max_filesize 2M cgi.fix_pathinfo0在最近参与的一个金融项目里我们甚至引入了机器学习模型来分析上传文件的特征这种深度防御才是对抗高级攻击的有效手段。

相关新闻