进入页面之后查看源代码
发现source.php
访问后发现代码审计
代码分为两个部分,上面是class,下面是一个if判断,如果经过if判断正确后直接进入文件包含漏洞中获取flag
$_REQUEST是get或者post获取参数值
empty判空
is_string判是否为字符串
emmm::checkFile通过emmm类判断
也就是file传入一个字符串即可通过前两个判断,进入emmm类中
类中有四个判断,不可以满足第一个,满足后三个中一个即可
第一个if, 判断page变量是否为空,是否是字符串
第二个if,判断传入的page是否在白名单中
第三个if,截取page ?之前的字符赋给_page,判断_page是否在白名单中
第四个if,对page进行一次url解码并赋给_page,截取_page ?之前的字符赋给_page
判断_page是否在白名单中,因此需传入二次编码后的内容,就可以使checkfile返回true
第一个if传入字符串即可
第二个if传入必须是白名单中内容($whitelist = ["source"=>"source.php","hint"=>"hint.php"];)
传入后发现不是flag,但是给出了提示信息(flag not here, and flag in ffffllllaaaagggg)
第三个if截取file中?之前的内容所以再加一个?
发现页面显示空白,猜测第三个判断成功
直接使用include漏洞(根据构造路径进行寻找文件)
根据上面的提示猜测要四个../,发现不是,结果是五个../
再回到上面的第四个if,需要经过一次url解码,并且再次截取?之前的字符串,查看是否在白名单中,只需要对?进行一次url编码(%3f)即可,后续include漏洞一致。
?file=hint.php%3f../../../../../ffffllllaaaagggg