PhpMyAdmin Authorized Rce(CVE-2016-5734)分析

0x00 补丁对比

一: Description

In some versions of PHP, it’s possible for an attacker to pass parameters to the preg_replace() function which can allow the execution of arbitrary PHP code. This code is not properly sanitized in phpMyAdmin as part of the table search and replace feature.

All 4.6.x versions (prior to 4.6.3), 4.4.x versions (prior to 4.4.15.7), and 4.0.x versions (prior to 4.0.10.16) are affected

显而易见,preg_replace /e触发的callback导致命令执行.

二: diff

1

补丁后的版本,当发现$find里存在任意一个范围符号的时候,用下一个符号重新包裹
比如 0/e会变成 @0/e@.

当然了,可以构造参数然后用phpstroe等ide进行栈回溯,因为利用过程很简单,我这里手工回溯的

0x01 stack trace

1.TableSearchController.php中第656行 getReplacePreview func.

2(1)

  • findAction -> getReplacePreview
    看到这五个参数的构造

3(1)

可以看到$find 、$replaceWith、$useRegex、$columnIndex都是我们可控的

  • indexAction -> findAction

4

当_searchType成员为’replace’的时候调用findAction.

4.全局搜索indexAction()

class TableSearchController extends TableController

6

或许可以用sed同时匹配两个不同行的字符串…但我不会…

5

对searchType的赋值,tbl_find_replace.php符合要求.

那么调用流程:

tbl_find_replace.php-> TableSearchController.php indexAction-> findAction -> getReplacePreview -> _getRegexReplaceRows

看一下完整的_getRegexReplaceRows函数的代码:

7

要想执行命令,$row[0]要成功匹配$find,$find自不必说,而$row[0]是从一个表中取出的数据.

从db和table成员开始回溯,class TableSearchController extends TableController 继承了TableController,用同样的命令找到以下路径:

libraries\controllers\TableController.php

看代码 :

8

在这里定义了db和table成员,回溯Controller类,找到 libraries\di\Container.php:

9

0x02 漏洞验证

$find和表单数据构造为0/e\0,preg_replace给$find包含/ /的时候变成这个样子 /0/e\0/

php5.5以下版本发生截断,变成preg_replace(‘/0/e’,’command’,’0/e’);.

开头的官方描述说这个洞影响phpmyadmin4.6.0-4.6.3,其实不是的,在4.6.0以上的版本common.inc.php有这样一段代码:

10

在php5.5之下是无法运行phpmyadmin4.6.0之上的版本的.除非遇到高端会玩的站长…

12

0x03 referer

https://www.phpmyadmin.net/security/PMASA-2016-27/

https://www.exploit-db.com/exploits/40185/

 

原创文章,作者:Moto,如若转载,请注明出处:http://www.mottoin.com/article/code/87808.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code