从代码审计到实战:深入剖析phpMyAdmin 4.8.1文件包含漏洞的攻防博弈
1. 漏洞背景与环境搭建
phpMyAdmin作为最流行的MySQL数据库管理工具之一,其安全性直接影响数百万网站的数据安全。2018年爆出的4.8.1版本文件包含漏洞,源于index.php和Core.php中checkPageValidity()函数的校验缺陷。这个漏洞允许攻击者通过精心构造的URL参数实现任意文件包含,轻则泄露敏感数据,重则执行系统命令。
搭建复现环境时,我推荐使用phpStudy集成环境,它能快速配置PHP+MySQL组合。具体步骤:
- 下载phpMyAdmin 4.8.1源码包解压到网站根目录
- 启动Apache和MySQL服务后,访问
http://localhost/phpMyAdmin可能会遇到空白页面问题 - 这时需要修改
libraries/config.default.php中的$cfg['blowfish_secret']值,比如设置为'this_is_a_32_char_long_secret_key'(长度必须≥32字符)
注意:复现漏洞时建议使用虚拟机环境,避免对真实系统造成影响。我曾因为忘记关闭外网访问权限,导致测试服务器被自动化扫描工具攻击。
2. 漏洞原理深度解析
2.1 关键代码审计
漏洞的核心在于index.php对target参数的处理逻辑。当访问index.php?target=xxx时,代码会检查以下条件:
- 参数非空且为字符串
- 不以
index开头 - 不在黑名单(如
import.php) - 通过
checkPageValidity()验证
问题出在Core.php的校验函数中。该函数有三种验证路径:
- 直接匹配白名单(如
db_datadict.php) - 对参数进行
mb_substr截取后匹配白名单 - 对参数进行双重URL解码后再截取匹配
重点在于第三种路径的校验缺陷。当传入db_datadict.php%253f../../../../etc/passwd时:
- 服务器自动解码一次:
%253f→%3f urldecode()再解码一次:%3f→?- 最终校验时实际检查的是
db_datadict.php?,而?后的路径穿越符被巧妙绕过
2.2 攻击向量构造
我通过实际测试发现两种有效攻击方式:
目录穿越包含
http://localhost/phpMyAdmin/index.php?target=db_datadict.php%253f/../../../../Windows/win.ini这种写法可以逐级跳转目录,包含系统任意文件。在Windows环境下测试时,最多需要../../../../../../../../才能到达根目录。
Session文件利用
- 先执行SQL语句:
SELECT "<?php system('whoami');?>" - 在临时目录(如
/tmp/sess_xxx)生成包含PHP代码的session文件 - 通过漏洞包含该session文件实现RCE
3. 实战攻防演练
3.1 攻击者视角
在CTF比赛中,这类漏洞常与其他弱点组合利用。以HCTF 2018的Warmup题目为例:
- 查看源码发现
source.php提示 - 审计源码发现文件包含点
- 结合hint.php的线索,构造payload:
http://target.com/source.php?file=source.php%253f/../../../../ffffllllaaaagggg这种利用方式与phpMyAdmin漏洞如出一辙,都是通过双重编码绕过校验。
3.2 防御者对策
根据实战经验,我总结出三级防御方案:
代码层修复
- 补丁核心是严格校验文件路径,禁止包含目录穿越符
- 建议使用
realpath()解析绝对路径,并检查是否在白名单目录下
服务器配置
# 在httpd.conf中添加 php_admin_value open_basedir "/var/www/html:/tmp"限制PHP只能访问指定目录,即使漏洞被利用也无法读取系统关键文件。
运维监控
- 使用OSSEC等工具监控
/tmp目录下可疑的session文件 - 对phpMyAdmin的访问日志设置告警规则,过滤包含
%253f的异常请求
4. 现代环境下的思考
虽然这是历史漏洞,但其中暴露的安全问题至今仍有警示意义。我在2023年的渗透测试中,仍发现过类似逻辑的文件包含漏洞。开发者常犯的几个错误:
- 过度信任用户输入的路径参数
- 使用黑名单而非白名单机制
- 没有考虑编码绕过的可能性
对于安全研究人员,我建议重点审计以下代码模式:
include($_GET['file'] . '.php'); file_get_contents($user_input);这类动态包含操作,必须配合严格的路径检查和过滤机制。
