提示是source.php,访问一下
总的来说这个cehckFile这个函数进行了 3次白名单检测、 2次问好过滤、一次URL解码
class emmm
2 {
3 public static function checkFile(&$page)
4
5 {
6 //白名单列表
7 KaTeX parse error: Expected 'EOF', got '&' at position 112: …ng()判断变量是否是字符串 &̲&用了逻辑与两个值都为真才执行…page) || !is_string(page))10echo"youcan′tseeitA";11returnfalse;1213//检测传进来的值是否匹配白名单列表page)) {
10 echo "you can't see it A";
11 return false;
12 }
13 //检测传进来的值是否匹配白名单列表page))10echo"youcan′tseeitA";11returnfalse;1213//检测传进来的值是否匹配白名单列表whitelist 如果有则执行真
14 if (in_array($page, whitelist))15returntrue;1617//过滤问号的函数(如果whitelist)) {
15 return true;
16 }
17 //过滤问号的函数(如果whitelist))15returntrue;1617//过滤问号的函数(如果page的值有?则从?之前提取字符串)
18 $_page = mb_substr(
19 page,200,21mbstrpos(page,
20 0,
21 mb_strpos(page,200,21mbstrpos(page . ‘?’, ‘?’)//返回page.?里卖弄?号出现的第一个位置22);2324//第二次检测传进来的值是否匹配白名单列表page.?里卖弄?号出现的第一个位置
22 );
23
24 //第二次检测传进来的值是否匹配白名单列表page.?里卖弄?号出现的第一个位置22);2324//第二次检测传进来的值是否匹配白名单列表whitelist 如果有则执行真
25 if (in_array($_page, whitelist))26returntrue;2728//url对whitelist)) {
26 return true;
27 }
28 //url对whitelist))26returntrue;2728//url对page解码
29 page=urldecode(_page = urldecode(page=urldecode(page);
30
31 //第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
32 $_page = mb_substr(
33 page,340,35mbstrpos(_page,
34 0,
35 mb_strpos(page,340,35mbstrpos(_page . ‘?’, ‘?’)
36 );
37 //第三次检测传进来的值是否匹配白名单列表whitelist如果有则执行真38if(inarray(whitelist 如果有则执行真
38 if (in_array(whitelist如果有则执行真38if(inarray(_page, $whitelist)) {
39 return true;
40 }
41 echo “you can’t see it”;
42 return false;
43 }
44 }
访问hint.php
现在构造获取flag的语句
思路一
hint.php?../…/…/…/…/ffffllllaaaagggg 我们可以想象他传入checkFile函数要经历 第一次白名单验证 一次?过滤后他就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag
tips:include函数有这么一个神奇的功能:以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。
这里的ffffllllaaaagggg是在hint.php中发现的,显然flag在这个文件里。其实文件名提示了我们要使用四层目录,这里比较坑。
思路二四个f提示是四层目录
flag{a513a35f-246a-4ae0-8d15-59f96aff655c}