web大手子炼成记之warmup

XCTF

warmup

题目链接:题目链接
记xctf之wramup writeup!!!
打开题目链接,F12发现提示,进入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\" />";
    }  
?>

开始代码审计,发现hint.php
web大手子炼成记之warmup_第1张图片提示flag在***里面(因为不知道它到底在哪个目录,所以就想到目录穿越漏洞!!!)
由以下代码知,构造payload满足$file不为空,是字符串,满足checkFile函数检查就能将“file”文件包含进去。

if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; } else { echo "
"; }

再来看checkFile函数

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

四个检查的地方:
1,检查$page是否为空,是否为字符串
2,白名单检测,检测 $page是否在数组中,存在则 return ture;
3, $_page截取?后面的内容进行白名单检测
4,url解码 $page后再截取?后面的内容进行白名单检测
综上可构造payload(不唯一):?file=soure.php%253f…/…/…/…/…/ffffllllaaaagggg,即拿到flag!!!
注:构造%253f是因为浏览器自动解码一次,即%253f url解码一次后为%3f,然后再到checkFile函数解码后为?,就可以成功绕过 return ture,将file文件包含进来,,,,,得到了flag!
最后贴一下flag。。。。。。
在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(web大手子炼成记之warmup)