三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从代码审计到实战:深入剖析phpMyAdmin 4.8.1文件包含漏洞的攻防博弈

从代码审计到实战:深入剖析phpMyAdmin 4.8.1文件包含漏洞的攻防博弈

1. 漏洞背景与环境搭建

phpMyAdmin作为最流行的MySQL数据库管理工具之一,其安全性直接影响数百万网站的数据安全。2018年爆出的4.8.1版本文件包含漏洞,源于index.phpCore.phpcheckPageValidity()函数的校验缺陷。这个漏洞允许攻击者通过精心构造的URL参数实现任意文件包含,轻则泄露敏感数据,重则执行系统命令。

搭建复现环境时,我推荐使用phpStudy集成环境,它能快速配置PHP+MySQL组合。具体步骤:

  1. 下载phpMyAdmin 4.8.1源码包解压到网站根目录
  2. 启动Apache和MySQL服务后,访问http://localhost/phpMyAdmin可能会遇到空白页面问题
  3. 这时需要修改libraries/config.default.php中的$cfg['blowfish_secret']值,比如设置为'this_is_a_32_char_long_secret_key'(长度必须≥32字符)

注意:复现漏洞时建议使用虚拟机环境,避免对真实系统造成影响。我曾因为忘记关闭外网访问权限,导致测试服务器被自动化扫描工具攻击。

2. 漏洞原理深度解析

2.1 关键代码审计

漏洞的核心在于index.phptarget参数的处理逻辑。当访问index.php?target=xxx时,代码会检查以下条件:

  • 参数非空且为字符串
  • 不以index开头
  • 不在黑名单(如import.php
  • 通过checkPageValidity()验证

问题出在Core.php的校验函数中。该函数有三种验证路径:

  1. 直接匹配白名单(如db_datadict.php
  2. 对参数进行mb_substr截取后匹配白名单
  3. 对参数进行双重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文件利用

  1. 先执行SQL语句:SELECT "<?php system('whoami');?>"
  2. 在临时目录(如/tmp/sess_xxx)生成包含PHP代码的session文件
  3. 通过漏洞包含该session文件实现RCE

3. 实战攻防演练

3.1 攻击者视角

在CTF比赛中,这类漏洞常与其他弱点组合利用。以HCTF 2018的Warmup题目为例:

  1. 查看源码发现source.php提示
  2. 审计源码发现文件包含点
  3. 结合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年的渗透测试中,仍发现过类似逻辑的文件包含漏洞。开发者常犯的几个错误:

  1. 过度信任用户输入的路径参数
  2. 使用黑名单而非白名单机制
  3. 没有考虑编码绕过的可能性

对于安全研究人员,我建议重点审计以下代码模式:

include($_GET['file'] . '.php'); file_get_contents($user_input);

这类动态包含操作,必须配合严格的路径检查和过滤机制。

← 返回列表