首先打开页面是一个滑稽的表情,直接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真的好重要,不然连人家写的是啥都不懂