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修饰符
- 注意:PHP 5.0以上版本已废弃
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):
python 40185.py -u root -p root -d test http://192.168.234.157:8080
参数说明:
-u: 用户名-p: 密码-d: 数据库名-c: 指定要执行的PHP代码(默认为system('uname -a'))-t: 指定表名(默认为脚本中定义的表名)
- 手动复现方法:
- 登录phpMyAdmin
- 创建一个数据库和表(如数据库
test,表prgpwn,列first) - 在表中插入值
0/e - 访问
tbl_find_replace.php页面 - 提交以下POST请求:
find:0/e\0replaceWith:执行的PHP代码db:testtable:prgpwn
0x06 漏洞触发点分析
- 漏洞位于
libraries/TableSearch.class.php文件中的_getRegplaceRows()函数:
$result = preg_replace($find, $replaceWith, $row[0]);
- 参数溯源:
find和replaceWith来自tbl_find_replace.php通过POST传递的参数row[0]来自SQL查询结果的第一列值
- SQL查询语句:
SELECT $columnname, 1, COUNT(*) FROM database.table_name
WHERE $columnname RLIKE '$find' COLLATE $charset_bin
GROUP BY $columnname ORDER BY $column ASC;
- 完整利用链:
- 用户提交查找替换请求
- 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修饰符)