首先我们先看下题目给的提示
Php 代码审计
注意,一般题目给出这样的题解,就已经相当于明确的告诉你,flag线索在网页源码里
而我们只要使用f12快捷键,就可以查看网页源码
进入环境,我们可以看到只有一张图片,根据我们的思路,查看页面源码
好,线索已经出来了
我们来访问一下
在新的页面下返回了一段php源码
审计一下
在这段源码里有几个醒目的地方就是php逻辑运算符
&&逻辑与 ||逻辑或
要求我们的file变量不为空
我们来看看这段代码首先要求我们传进去的得是字符串类型
而下面这段代码又将我们的值传到了emmm类中的checkFile函数
并且这三个值是使用&&逻辑与连接的。所有要求返回值全为真才能返回文件包含的代码,否则返回else中的图片代码
要求已经知道啦,接下来就是函数的使用
mb_substr()函数返回字符串的一部分
mb_strpos(haystack,needle)
第一个参数是要被检查的字符串,第二个参数是要搜索的字符串
代码审计到这里,现在需要做的事就是构造我们的payload
源码中可以看到有一个新的界面Flag的文件名出来了
好,我们再回去看看emm有什么阻拦我们的仔细一看还挺多白名单
首先是isset()判断变量是否声明,is_string判断参数是否为字符串
检测传进来的值是否匹配白名单,是则执行真
过滤?的函数(如果
p
a
g
e
的
值
有
?
,
就
从
?
前
提
取
字
符
串
)
返
回
page的值有?,就从?前提取字符串) 返回
page的值有?,就从?前提取字符串)返回page.?中?出现的第一个位置
二次检查是否匹配白名单
Url编码
二次过滤问号,与之前相同
第三次检测是否匹配白名单
所有的过滤都清楚了
三次白名单,两次问号过滤,一次url解码
依照这个构造payload
Hint.php?../…/…/…/…/ffffllllaaaagggg(第一次白名单后是hint.php。再过滤一次白名单,返回真。最后成功进行包含拿到flag)