CVE-2016-5734是phpMyAdmin 4.0.x–4.6.2的远程代码执行漏洞,因用户输入被拼入preg_replace第一个参数,攻击者利用\0截断并注入/e修饰符,在PHP≤5.4.6下使第二个参数被当作PHP代码执行。
preg_replace 的 e 修饰符漏洞(CVE-2016-5734)是 phpMyAdmin 4.0.x–4.6.2 中最直接、最危险的远程代码执行入口,无需管理员权限,只要登录成功即可触发。
为什么 preg_replace + e 会导致 RCE?
漏洞本质不是「功能设计错误」,而是用户输入被拼进 preg_replace 第一个参数($pattern)后,攻击者用 \0 截断原始正则,并强行注入 /e 修饰符。php ≤ 5.4.6 会把第二个参数($replacement)当作 php 代码执行 —— 这意味着你传进去的 system('id') 真的会被 eval 执行。
-
preg_replace在 PHP 5.5.0+ 已废弃e修饰符,所以该漏洞在新版 PHP 上天然不可利用 - 但旧版 phpMyAdmin(如 4.4.15.6)若运行在 PHP 5.4.6 环境下,
e仍有效,且无任何过滤 - 触发点固定在「表数据查找替换」功能,路径类似
/tbl_find_replace.php,参数名通常是find和replace_with
CVE-2016-5734 的实际利用门槛和限制
这个漏洞不是“有版本就能打”,它卡在三个硬性条件上:
- phpMyAdmin 版本必须 ≤
4.0.10.16/4.4.15.7/4.6.2(注意:4.6.3 要求 PHP ≥ 5.5,反而绕过了该漏洞) - 底层 PHP 必须 ≤ 5.4.6;PHP 5.4.7+ 已修复
\0截断问题 - 攻击者必须拥有一个可登录的数据库账号(哪怕只是普通用户),因为查找替换功能需登录态
常见误判:看到 phpMyAdmin 是 4.6.2 就认为一定可打 —— 如果后端 PHP 是 7.4,preg_replace 根本不认 e,Payload 直接报错或静默失败。
别忽略 CVE-2018-12613:二次编码绕过的 LFI → RCE 链
phpMyAdmin 4.8.0–4.8.1 存在 index.php?target= 参数的远程文件包含漏洞(CVE-2018-12613),虽非直接 RCE,但配合 phpinfo() 或临时文件写入,极易升级为 RCE:
- 原始校验只检查
target是否在白名单(如db_sql.php),但未规范解码逻辑 - 攻击者发送
target=db_sql.php%253f/../../../../../etc/passwd(%253f是?的双重 URL 编码),可绕过白名单并读取任意文件 - 若服务器启用了
expect://或能控制 session 文件路径,LFI 可转为命令执行
这个漏洞比 CVE-2016-5734 更隐蔽:它不依赖 PHP 版本,只要 phpMyAdmin 是 4.8.0/4.8.1,且 Web 服务器未禁用 allow_url_include,就可能被链式利用。
升级时最容易被跳过的致命细节
很多人以为「覆盖新包」就万事大吉,结果留下一堆可被利用的残留点:
- 旧版
config.inc.php中的$cfg['blowfish_secret']若弱或为空,会成为 CVE-2023-50741 等新漏洞的入口 - 未删除
libraries/vendor_config.php或tmp/目录,这些路径曾被用于 CVE-2022-44898 的 LFI 利用链 -
session.save_path仍指向全局可写目录(如/tmp),攻击者可通过竞争条件写入恶意 session 文件 - Nginx/Apache 未屏蔽
/setup/、/libraries/、/config/等敏感路径,导致配置文件被直接下载
真正安全的升级,不是换版本号,而是清理所有旧痕迹、重设 session 路径、关闭 auto_start、并验证每个高频功能是否仍可用 —— 否则补丁形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











