CVE-2016-5734 phpmyadmin后台代码执行漏洞复现
字数 1511 2025-08-25 22:58:47

CVE-2016-5734 phpMyAdmin后台代码执行漏洞分析与复现

0x01 漏洞简介

phpMyAdmin是一个基于PHP的MySQL数据库管理工具,提供Web界面让管理员可以方便地管理MySQL数据库。CVE-2016-5734漏洞存在于phpMyAdmin的特定版本中,允许经过身份验证的攻击者在服务器上执行任意PHP代码。

0x02 漏洞概述

该漏洞源于PHP的preg_replace()函数与phpMyAdmin的查找替换功能结合使用时存在的安全问题。具体来说:

  • preg_replace()函数是执行正则表达式搜索和替换的PHP函数
  • 当使用/e修正符时,替换字符串会被当作PHP代码执行
  • phpMyAdmin的查找替换功能未对用户输入进行充分过滤,导致代码注入

函数签名:

preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count ]])

/e修正符的作用:在替换字符串中对逆向引用作正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串。

0x03 影响版本

  • phpMyAdmin:
    • 4.0.10.16之前的4.0.x版本
    • 4.4.15.7之前的4.4.x版本
    • 4.6.3之前的4.6.x版本
  • PHP版本: 4.3.0 ~ 5.4.6
    • 注意:PHP 5.0以上版本已废弃preg_replace/e修饰符

0x04 环境搭建

推荐使用Docker+vulhub快速搭建漏洞环境:

  1. 安装Docker和Docker-compose
  2. 下载vulhub项目
  3. 进入phpMyAdmin漏洞目录(4.4.15.6版本)
  4. 执行docker-compose up -d
  5. 访问http://[IP]:8080

0x05 漏洞复现

前提条件

  • 需要有效的登录凭证(任意用户权限)

复现步骤

  1. 使用Exploit-DB提供的POC脚本(40185.py):
python 40185.py -u root -p root -d test http://192.168.234.157:8080

参数说明:

  • -u: 用户名
  • -p: 密码
  • -d: 数据库名
  • -c: 指定要执行的PHP代码(默认为system('uname -a')
  • -t: 指定表名(默认为脚本中定义的表名)
  1. 手动复现方法:
  • 登录phpMyAdmin
  • 创建一个数据库和表(如数据库test,表prgpwn,列first
  • 在表中插入值0/e
  • 访问tbl_find_replace.php页面
  • 提交以下POST请求:
    • find: 0/e\0
    • replaceWith: 执行的PHP代码
    • db: test
    • table: prgpwn

0x06 漏洞触发点分析

  1. 漏洞位于libraries/TableSearch.class.php文件中的_getRegplaceRows()函数:
$result = preg_replace($find, $replaceWith, $row[0]);
  1. 参数溯源:
  • findreplaceWith来自tbl_find_replace.php通过POST传递的参数
  • row[0]来自SQL查询结果的第一列值
  1. SQL查询语句:
SELECT $columnname, 1, COUNT(*) FROM database.table_name 
WHERE $columnname RLIKE '$find' COLLATE $charset_bin 
GROUP BY $columnname ORDER BY $column ASC;
  1. 完整利用链:
  • 用户提交查找替换请求
  • phpMyAdmin构造SQL查询
  • 查询结果传递给preg_replace()函数
  • find参数包含/e修饰符时,replaceWith被当作代码执行

0x07 修复方案

  1. 升级phpMyAdmin到安全版本:
  • 4.0.10.16及更高版本
  • 4.4.15.7及更高版本
  • 4.6.3及更高版本
  1. 其他防护措施:
  • 禁用或限制phpMyAdmin的远程访问
  • 使用强密码保护phpMyAdmin登录
  • 升级PHP到5.5+版本(默认禁用/e修饰符)

参考链接

  1. Exploit-DB POC
  2. phpMyAdmin安全公告
  3. PHP preg_replace文档
CVE-2016-5734 phpMyAdmin后台代码执行漏洞分析与复现 0x01 漏洞简介 phpMyAdmin是一个基于PHP的MySQL数据库管理工具,提供Web界面让管理员可以方便地管理MySQL数据库。CVE-2016-5734漏洞存在于phpMyAdmin的特定版本中,允许经过身份验证的攻击者在服务器上执行任意PHP代码。 0x02 漏洞概述 该漏洞源于PHP的 preg_replace() 函数与phpMyAdmin的查找替换功能结合使用时存在的安全问题。具体来说: preg_replace() 函数是执行正则表达式搜索和替换的PHP函数 当使用 /e 修正符时,替换字符串会被当作PHP代码执行 phpMyAdmin的查找替换功能未对用户输入进行充分过滤,导致代码注入 函数签名: /e 修正符的作用:在替换字符串中对逆向引用作正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串。 0x03 影响版本 phpMyAdmin: 4.0.10.16之前的4.0.x版本 4.4.15.7之前的4.4.x版本 4.6.3之前的4.6.x版本 PHP版本: 4.3.0 ~ 5.4.6 注意:PHP 5.0以上版本已废弃 preg_replace 的 /e 修饰符 0x04 环境搭建 推荐使用Docker+vulhub快速搭建漏洞环境: 安装Docker和Docker-compose 下载vulhub项目 进入phpMyAdmin漏洞目录(4.4.15.6版本) 执行 docker-compose up -d 访问 http://[IP]:8080 0x05 漏洞复现 前提条件 需要有效的登录凭证(任意用户权限) 复现步骤 使用Exploit-DB提供的POC脚本(40185.py): 参数说明: -u : 用户名 -p : 密码 -d : 数据库名 -c : 指定要执行的PHP代码(默认为 system('uname -a') ) -t : 指定表名(默认为脚本中定义的表名) 手动复现方法: 登录phpMyAdmin 创建一个数据库和表(如数据库 test ,表 prgpwn ,列 first ) 在表中插入值 0/e 访问 tbl_find_replace.php 页面 提交以下POST请求: find : 0/e\0 replaceWith : 执行的PHP代码 db : test table : prgpwn 0x06 漏洞触发点分析 漏洞位于 libraries/TableSearch.class.php 文件中的 _getRegplaceRows() 函数: 参数溯源: find 和 replaceWith 来自 tbl_find_replace.php 通过POST传递的参数 row[0] 来自SQL查询结果的第一列值 SQL查询语句: 完整利用链: 用户提交查找替换请求 phpMyAdmin构造SQL查询 查询结果传递给 preg_replace() 函数 当 find 参数包含 /e 修饰符时, replaceWith 被当作代码执行 0x07 修复方案 升级phpMyAdmin到安全版本: 4.0.10.16及更高版本 4.4.15.7及更高版本 4.6.3及更高版本 其他防护措施: 禁用或限制phpMyAdmin的远程访问 使用强密码保护phpMyAdmin登录 升级PHP到5.5+版本(默认禁用 /e 修饰符) 参考链接 Exploit-DB POC phpMyAdmin安全公告 PHP preg_ replace文档