phpmyadmin4.8.1远程文件包含漏洞(CVE-2018-12613)-hctf218-warmup

用hctf2018的一道题可以重现改漏洞。
根据源码提示进入source.php中,可以拿到源码。

 
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                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;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

最下面有个文件包含include,所以要拿flag就要使用文件包含的方式,看到上面的白名单中海油hint.php文件,进入访问该文件,得到

flag not here, and flag in ffffllllaaaagggg

所以我们要包含的文件就是ffffllllaaaagggg了。

成功进行文件包含要满足的条件是:
1、! empty($_REQUEST[‘file’] file传参不为空
2、is_string($_REQUEST[‘file’] file传参为字符串
3、emmm::checkFile($_REQUEST[‘file’]) checkFile函数返回true

前两个都很简单,对checkFile函数进行审计。

返回true的有三个地方,都需要file参数是在白名单里的。
然而中间对page进行了处理:

$_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );

mb_是以字为单位处理,也就是说,先给$page加上?,然后mb_strpos找出$page中第一个?的索引,然后利用mb_substr()截取第一个问号之前的字符,然后再对$_page进行白名单的判断

构造payload:source.php?file=source.php?../…/…/…/…/ffffllllaaaagggg

这样就可以在截取之后保留source.php,是checkFile函数返回true,然后成功进行文件包含,从而查看到ffffllllaaaagggg的内容。

你可能感兴趣的:(漏洞复现,漏洞复现)