CVE-2016-5734分析

针对phpMyAdmin 4.6.2 - Authenticated Remote Code Execution进行漏洞复现并分析。
html.png

漏洞简述

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。在4.6.2版本中preg_replace /触发的callback导致命令执行。

漏洞分析

复现过程

下载POC并执行即可。
success.png

漏洞分析

这个漏洞出现在TableSearchController.php中的getRegexReplaceRows函数。
跟进/libraries/controllers/table/TableSearchController.php,第708行定义getRegexReplaceRows函数,在第731行处$find存在任意一个范围符号的时候,在$find前面加上/。
1.png
在661行getReplacePreview函数调用了getRegexReplaceRows。
2.png
在613行findAction函数调用了getReplacePreview。
3.png
在175行indexAction函数调用了findAction,当searchType为replace调用findAction。
4.png
在/tbl_find_replace.php第33行调用indexAction。
5.png
根据以上可得知,调用getRegexReplaceRows函数的流程为:

1
2
3
4
5
/tbl_find_replace.ph →
/libraries/controllers/table/TableSearchController.php indexAction() →
/libraries/controllers/table/TableSearchController.php findAction() →
/libraries/controllers/table/TableSearchController.php getReplacePreview() →
/libraries/controllers/table/TableSearchController.php _getRegexReplaceRows()

当row[0]成功匹配$find即可执行命令,在716,717行存在db、table两个成员。
6.png
在/libraries/controllers/TableController.php第20、25行分别定义了$db、$table。
7.png
回溯Controller类,跟进/libraries/di/Container.php,在51行定义get函数。
8.png
当$find构造为0/e0,preg_replace将$find变成/0/e0/,在php5.5以下发生截断,变成preg_replace(/0/e, command,0/e)。由此代码执行产生。

修复建议

升级phpMyAdmin。