题目来源:https://adworld.xctf.org.cn/challenges
打开题目查看源码发现有提示:<!--source.php-->
于是尝试对source.php进行访问得到
解题前需要了解的函数:
isset:用于检测变量是否已设置并且非 NULL。
in_array:检测是否在数组中
mb_substr(str,start,length,encoding):截取字符串
mb_strpos($haystack,$needle,$offset,$encoding):int|false:返回
haystack
中needle
首次出现位置的数值。 如果没有找到needle
,它将返回false
。urldecode:url解码
is_string:判断是否为字符串
1.首先观察代码的底部可得知需传入file参数,内容经过检测后会有include进行文件包含
2.观察emm类发现有四个if条件,前两个检测参数是否存在且在白名单中,可以先包含白名单中的文件名称进行测试
payload:61.147.171.105:59436/source.php?file=hint.php
提示flag在ffffllllaaaagggg中
接下来分析这段代码
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);if (in_array($_page, $whitelist)) {
return true;
}大概意思为截取page参数中出现?号前的字符串,没有则返回原字符串,并检测page中数据是否在白名单中,接着url解码后又一次重复该过程也就是要验证两次
构造payload:61.147.171.105:59436/source.php?file=hint.php?ffffllllaaaagggg
第一次被截取后page为:hint.php通过白名单,第二次截取时因为page中已无?号,所以
截取结果仍为hint.php可通过白名单,满足emm类后最底部代码进行文件包含,但发现flag
并未出现,这里我就不会了,查看别人的wp发现flag在根目录构造payload为
61.147.171.105:59436/source.php?file=hint.php?/../../../../ffffllllaaaagggg
即可,至少四个../
参考资料:[原题复现]HCTF 2018 Warmup(文件包含) - 笑花大王 - 博客园 (cnblogs.com)