f12看页面元素,发现提示,访问
函数从这里开始运行,接收一个变量file,传递到checkFile这个函数里面
主要审计的代码就是这一块,全部返回true之后就可以执行上面的include语句,访问文件,我们看看每个if条件句
在class里面有4个if条件语句
第一个if语句判断变量$page是不是字符串,不是则返回false
第二个if语句判断变量$page是否是白名单数组中的字符串,是则返回true
然后将$page过滤,substr函数是将字符串分割,mb_strpos($page.’?’, ‘?’)先将page加上一个问号,然后计算问号前的字符串的数量,并返回这个数量的值
假设我们的page=‘flag?id=123456?pwd=123456’
strop返回的值则是4,substr分割出来的字符串就是flag
第三个if语句和第二个一样,对过滤后的page进行白名单检测
然后用urldecode()函数编码,“?”的编码是%253f
再进行一次过滤
第4个if语句,$page变量过滤后还有白名单中的字符串则返回true
我们还看到白名单中还有“hint.php”,访问可以得到提示,flag再ffffllllaaaagggg文件中
所以构造出来的语句肯定要有白名单中的字符串
还要用file作为变量传递
file变量的值要满足刚刚checkFile中的所有条件
source.php?file=source.php?../../../../../ffffllllaaaagggg
解释一下
因为checkFile函数是对file传进去的值进行过滤,所以进入checkFile代码中作为$page变量保存的字符串是这一段
source.php?../../../../../ffffllllaaaagggg
#我把整句当成传进去的值了。。。怎么分析都不对
第一次过滤的时候整个字符串就只剩下了source.php
第二次过滤的时候字符串还是source.php
mb_strpos($_page . '?', '?')
#因为PHP中的“.”表示连接符,相当于在source.php后面加了个问号,
#所以mb_strops返回的值还是这个字符串的长度,
#mb_substr函数自然还是返回这个字符串
所以这个构造可以通过函数的验证,执行最终的include语句
如果还有不懂的地方可以关注我的公众号“沉淀Hack”,发消息向我留言,每天会更新大量干货教程,快扫下面的二维码吧