靶场实战:Pikachu Unsafe Fileupload 漏洞的三种绕过手法深度解析

发布时间:2026/6/28 21:10:54
靶场实战:Pikachu Unsafe Fileupload 漏洞的三种绕过手法深度解析 1. 文件上传漏洞基础认知文件上传功能几乎是每个Web应用都具备的基础模块但恰恰是这个看似简单的功能常常成为攻击者突破系统防线的入口点。我在实际渗透测试中发现超过60%的中小型网站存在不同程度的上传漏洞风险。Pikachu靶场的Unsafe Fileupload模块完美复现了这类漏洞的典型场景让我们能够在一个安全的环境中进行实战演练。理解文件上传漏洞的核心在于把握校验环节的缺失。正常的上传流程应该包含客户端校验、服务端校验、文件内容校验等多重防护而漏洞往往出现在某个环节被绕过的情况下。举个例子就像机场安检如果只检查登机牌不检查随身物品危险品就能轻易被带上飞机。在Pikachu靶场中主要模拟了三种典型的防护缺失场景仅依赖前端JavaScript验证纸糊的防线只检查HTTP头的MIME类型形同虚设的门卫单纯使用getimagesize()函数检测容易被欺骗的安检仪2. 客户端JS校验绕过实战2.1 漏洞原理剖析这种防护方式就像把大门钥匙挂在门把手上——所有校验逻辑都暴露在浏览器端。当我第一次遇到这种防护时发现它就像个纸老虎通过浏览器开发者工具就能轻松突破。具体表现为上传非图片文件时页面会弹出请选择图片文件的警告这个提示本身就是漏洞的指示灯。查看页面源代码通常会看到这样的JS代码片段function checkFile() { var file document.getElementById(uploadfile); if(file.value || file.valuenull){ alert(请选择要上传的文件); return false; } if(!/\.(gif|jpg|jpeg|png)$/.test(file.value)){ alert(必须是图片格式); return false; } }2.2 绕过操作详解实际操作中我总结出三种绕过方法直接删除校验函数在Chrome开发者工具中定位到onsubmit事件删除checkFile()调用拦截修改请求使用Burp Suite拦截上传请求直接放行禁用JavaScript在浏览器设置中临时关闭JS执行最彻底的方法是第一种具体步骤按F12打开开发者工具切换到Elements面板找到标签的onsubmit属性右键选择Delete attribute重新选择文件上传上传成功后你会得到类似这样的路径http://[靶机IP]/pikachu/vul/unsafeupload/uploads/exploit.php2.3 防御建议真正的防护应该做到前端校验仅作为用户体验优化后端必须进行双重验证文件存储时重命名避免直接使用用户输入存储目录设置为不可执行3. MIME类型绕过技术3.1 MIME机制解析MIME类型就像是文件的身份证告诉系统应该用什么程序打开它。但问题在于这个身份证是可以伪造的。在HTTP协议中Content-Type就像快递面单上的物品类型声明——完全依赖寄件人的诚信度。常见图片的MIME类型包括文件类型正确MIME类型JPEGimage/jpegPNGimage/pngGIFimage/gif3.2 实战绕过步骤通过Burp Suite拦截上传请求时你会发现两个Content-Type字段整个请求的Content-Type通常为multipart/form-data文件部分的Content-Type这才是关键校验点具体操作流程准备一个PHP木马文件例如?php system($_GET[cmd]); ?使用Burp拦截上传请求修改文件部分的Content-Type为image/jpeg转发请求关键点在于要修改的是第二个Content-Type新手常犯的错误是修改了请求头部的Content-Type。我曾在实际测试中花了两个小时才找到这个关键区别。3.3 高级绕过技巧更隐蔽的绕过方式包括使用image/svgxml类型配合SVG文件注入利用Content-Type解析差异如image/jpg vs image/jpeg在合法图片中嵌入恶意代码4. getimagesize()函数绕过4.1 函数原理深度解析getimagesize()是PHP内置的图片检测函数它会读取图片的文件头信息并返回尺寸等数据。但就像验钞机只检查水印不检查纸张质地一样这个函数存在明显的局限性。函数返回的数组结构Array ( [0] 800 // 宽度 [1] 600 // 高度 [2] 2 // 图片类型常量 [3] width800 height600 [bits] 8 [mime] image/jpeg )4.2 图片木马制作详解制作图片木马就像调制鸡尾酒——需要精确的配比。我推荐使用Windows自带的copy命令比各种图形化工具更可靠准备原始图片如test.jpg创建PHP木马文件shell.php?php fputs(fopen(shell.php,w),?php eval($_POST[cmd]);?); ?在CMD执行copy /b test.jpg shell.php final.jpg验证木马有效性的小技巧用文本编辑器打开生成的final.jpg滚动到文件底部应该能看到完整的PHP代码。4.3 组合利用技巧单纯的图片木马无法直接执行需要配合其他漏洞使用。在Pikachu靶场中可以结合文件包含漏洞实现代码执行上传图片木马到/uploads目录构造包含路径http://[靶机IP]/pikachu/vul/fileinclude/fi_local.php?filenamefile:///path/to/final.jpg访问后会生成可执行的shell.php使用蚁剑连接新生成的shell在实际渗透中我遇到过各种奇葩的环境配置问题。比如有一次因为PHP的safe_mode设置导致文件包含无法生效。这时候就需要尝试其他攻击路径比如结合.htaccess文件上传等。5. 防御体系构建完整的文件上传防护应该像洋葱一样层层设防前端防护白名单扩展名校验文件大小限制实时预览验证服务端防护重命名上传文件使用随机字符串存储目录禁用脚本执行文件内容签名校验病毒扫描系统层防护设置适当的文件权限定期审计上传目录使用单独的子域名托管用户上传内容在PHP中实现安全上传的代码框架$allowed [jpg,png]; $ext pathinfo($_FILES[file][name], PATHINFO_EXTENSION); if(!in_array(strtolower($ext), $allowed)) { die(Invalid file type); } $newName uniqid()...$ext; move_uploaded_file($_FILES[file][tmp_name], /safe/dir/.$newName);6. 靶场实践中的常见问题在Pikachu靶场练习时我遇到过几个典型问题及解决方案上传失败无提示检查php.ini中的upload_max_filesize确保upload_tmp_dir可写关闭Windows Defender实时保护蚁剑连接失败确认木马代码无语法错误检查路径是否包含中文或特殊字符尝试使用base64编码的payload文件包含不生效确认allow_url_includeOn尝试不同的协议php://filter检查文件权限是否为644记得有一次在测试时因为靶场环境的时区设置问题导致包含路径中的时间戳与实际不符。这时候就需要手动计算服务器时间与本地时间的偏移量。这种细节问题在实际渗透中经常遇到也是新手最容易卡壳的地方。