其他分享
首页 > 其他分享> > 一天一题-BUUCTF之warm up

一天一题-BUUCTF之warm up

作者:互联网

拿到题目,查看源码
在这里插入图片描述
看到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)) { //0.$page是否为空,是否为字符串
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {  //1.$page是否在数组里
                return true;
            }

            $_page = mb_substr( //取字符串的一部分
                $page,
                0,
                mb_strpos($page . '?', '?') //返回字符在字符串中首次出现的位置
            );
            if (in_array($_page, $whitelist)) { //$page是否数组中
                return true;
            }

            $_page = urldecode($page); //url解码
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) { //$page是否数组中
                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'];//满足条件后包含'file'
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>


从上面的代码中可以看出对传入的REQUEST参数file经过层层筛选,当file进入函数checkFile后,可以看出,如果file在数组中,则会返回True,进而include包含file,大致猜出这是一个包含漏洞,但是韩式没有头绪。看到checkFile的变量:$whitelist = ["source"=>"source.php","hint"=>"hint.php"];看到还有一个hint.php。由于REQUEST的参数包含GET方法传递的参数,所以直接GET传file,在url结尾加?file=hint.php,看到返回的页面提示flag not here, and flag in ffffllllaaaagggg,到这里我想了好久,还是不明白。觉得checkFike里的后俩判断很可疑,但不知如何利用,于是问了度娘,得知:
phpmyadmin4.8.1远程文件包含漏洞 CVE-2018-12613
这是一个文件包含+目录穿越的漏洞,于是剩下就是构造url了,而url怎么构造呢?
看checkFile的源码可以看出,

 if (! isset($page) || !is_string($page)) { //0.$page是否为空,是否为字符串
            echo "you can't see it";
            return false;
        }

        if (in_array($page, $whitelist)) {  //1.$page是否在数组里
            return true;
        }

这两次判断是做不了手脚了,即使返回True,也只能包含$whitelist里的两个文件,于是往下看。
法1:

   $_page = mb_substr( //取字符串的一部分
                $page,
                0,
                mb_strpos($page . '?', '?') //返回字符在字符串中首次出现的位置
            );
            if (in_array($_page, $whitelist)) { //$page是否数组中
                return true;
            }

可以看出,$_page是我们需要的,也可以被利用,我们大致构造一个?hint.php?/..//ffffllllaaaagggg(大致是这个样,具体还需要测试),进而既能满足函数的判断,也能使目标文件被包含。达到目的。
同理,继续往下看
法2:

   $_page = urldecode($page); //url解码
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) { //$page是否数组中
                return true;
            }

发现, $_page又进行一次解码,本身服务器会进行一次解码,然后可以看出可上一个同理,只不过需要经过两次url编码,所以构造 大致构造一个?hint.php%253f/..//ffffllllaaaagggg,进而达到目的。
但是不知道ffffllllaaaagggg文件在哪,可以写一个小脚本,跑着试一下/../../../../../../../../ffffllllaaaagggg,也即是尝试找ffffllllaaaagggg文件的路径,脚本后期再补。

整体就是这样,两种方法都可,主要要看那个漏洞的,这个题就是那个漏洞的变换,换汤不换药。

标签:BUUCTF,return,..,hint,whitelist,up,warm,file,page
来源: https://blog.csdn.net/qq_42728977/article/details/99829288