BUUCTF学习笔记-WarmUp

BUUCTF学习笔记-WarmUp

时间:2020/03/04
考点:代码审计

BUUCTF学习笔记-WarmUp_第1张图片

        先看看题目的描述,写着PHP代码审计,估计是那种直接给一段PHP源代码,然后构造请求来获得flag

BUUCTF学习笔记-WarmUp_第2张图片

        打开题目链接只有一个表情包的图片,右键查看源代码提示我们访问source.php,访问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\" />";
    }  
?>

        代码审计下来能看到是要我们输入一个file的参数,只要这个参数不是非空、为字符串类型和能通过自定义的checkFile函数就能直接包含这个文件。
        仔细看一下checkFile这个函数,是一个类似白名单的判断的函数。一开始设立了一个白名单,包括两个文件名source.phphint.php。然后会进行3次白名单的判断,只要成功一次算通过白名单。
        第一次判断,没有进行任何操作,直接拿输入的值来进行白名单判断。
        第二次判断,是取输入的值第一个?号前面的字符串来进行白名单判断。
        第三次判断,是取输入的值进行URL编码的解码,然后和第二次判断你的操作一样,取解码后的字符串的第一个?号前面的内容来进行白名单判断。

        那正式开始尝试,首先看第一次判断,因为没有对值进行任何操作,所以也不能存在任何绕过的可能性,只能输入默认的两个白名单参数。

        输入?file=source.php,能看到页面上又加载了一次source.php的代码。
        输入?file=hint.php,能看到页面上加载了hint.php的内容flag not here, and flag in ffffllllaaaagggg。能看出来我们的目标是绕过白名单,使页面能加载ffffllllaaaagggg文件。

        尝试在第二次判断中绕过,因为是取第一个?号前面的字符串来进行白名单判断。所以前面肯定是?file=source.php或者?file=hint.php。不然根本通不过白名单,但是我们可以在后面加上任何东西,应为他只取?前面的来进行判断。这时就能想到用../来跳出目录,找到对应的ffffllllaaaagggg文件。

        输入?file=hint.php?/../ffffllllaaaagggg,没有加载出来。
        输入?file=hint.php?/../../ffffllllaaaagggg,没有加载出来。
        输入?file=hint.php?/../../../ffffllllaaaagggg,没有加载出来。
        输入?file=hint.php?/../../../../ffffllllaaaagggg,成功加载到页面,并看到flag。

        尝试在第三次判断中绕过,因为和第二次判断相比,第三次判断前面的操作只是多了一次URL编码的解码,又因为本身浏览器解析的时候会进行URL的解码。所以我们需要对参数进行两次的URL编码。需要编码的其实也只有?这个字符。

        ?第一从URL编码为%3f,将%再编码一次为%25。所以合起来?两次URL编码为%253f
        在上面的payload中将?替换成%253f等到新的payload。file=hint.php%253f/../../../../ffffllllaaaagggg输入后也能加载到文件,等到flag。

你可能感兴趣的:(BUUCTF学习笔记-WarmUp)