文件包含
一
进入页面发现一个大的滑稽脸,查看源代码,发现提示source.php
进入该页面,进行代码审计,又发现一个hint.php
页面,进入发现提示
表明 flag 在这个文件中,且这个文件名暗示要使用四层目录
二
继续审计代码
发现满足三个条件,会包含并运行指定文件file
,此处的file
可以由我们构造,为切入点:
检查
file
变量是否为空检查
file
变量是否为字符串通过自定义的
checkFile
函数来检查
由于我们要构造payload,前两点直接满足,直接查看checkFile
函数代码:
发现包含四个if语句:
第一个 if 语句对变量进行检验,要求
$page
为字符串,否则返回 false第二个 if 语句判断
$page
是否存在于$whitelist
数组中,存在则返回 true第三个 if 语句,截取传进参数中首次出现
?
之前的部分,判断该部分是否存在于$whitelist
数组中,,存在则返回 true第四个 if 语句,先对构造的 payload 进行 url 解码,再截取传进参数中首次出现
?
之前的部分,并判断该部分是否存在于$whitelist
中,存在则返回 true
以上四个满足一个即可返回 true,若均未满足,则返回 false
三
我们利用第三个 if 语句构造参数:
?file=source.php?/../../../../ffffllllaaaagggg
第一个?
表示传参,第二个?
用来满足截取
四
为什么
include source.php(或hint.php)?/../../../../ffffllllaaaagggg
能执行成功因为我们的参数是有
/../../../../
这样的路径,所以符合最后一段话如果定义了路径,就会忽略/
前的字符串而去找/../../../../ffffllllaaaagggg
这个文件网上大多数 writeup 用到的 url 编码绕过发现并没有用到,这一方法的思路是将
?
进行两次 url 编码,变为%253f
,在服务器端提取参数时自动解码一次,checkFile
函数中解码一次,仍会解码为?
,可以绕过第四个 if ,但是实测只编码一次也可以得到 flag