HCTF 2018 WarmUp Wp

首先打开页面是一个滑稽的表情,直接F12看到source.php的提示
ok看source.php

直接分析代码

第一眼就看到有hint.php文件,直接打开看

flag not here, and flag in ffffllllaaaagggg

在主体代码中最重要的是通过GET传入file参数,判断emmm::类中checkFile是否为true
那只看emmm这个类

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语句
第一个:判断是否有page参数并且是字符串类型,有一个不满足就返回false(也就是说不会返回true)
第二个:判断page参数是否包含在whitelist数组中,存在则返回true

mb_substr(string,start,length)
mb_strpos (haystack ,needle )

第三个:判断被从“?”截断的page参数是否包含在whitelise数组中,存在返回true
第四个:判断被url解码过的,且被从”?“截断的page参数是否存在于whitelist数组中,存在返回true
只有四个中有一个返回true时,才可以返回true
如果只传入whitelist中含有的参数,那么我们想要查看flag的想法就不能实现了,所以就直接放弃冲第一个true
第二个是需要从第一个”?“开始截断,所以我们可以在第一个问号后写hint中的参数,用来访问flag文件。
payload:/source.php?file=source.php?/ffffllllaaaagggg
第二个问号用来在转跳后的页面中访问我们想看的文件
还没有,有可能flag文件在更上一层
当payload为/source.php?file=source.php?../…/…/…/…/ffffllllaaaagggg时,终于在代码的尾部看到flag

总结

学好php真的好重要,不然连人家写的是啥都不懂

你可能感兴趣的:(HCTF 2018 WarmUp Wp)