打开题目链接后只有一个滑稽??(那就看看它里面有啥吧)
想啥呢,是审查源码啦
可以看到有注释source.php,访问后可以看到其源码
又发现一个hint.php文件,先访问再说
提示我们flag在ffffllllaaaagggg里面,此时题目已经完成一半啦
接着看回source.php源码
可以看到最后的include 是可以动态构造参数的,那应该就是解题关键了
不过要经过三个判断
第一个:检查一个变量是否为空
第二个:是否为字符串
第三个:通过函数来检查
我们要构造的payload本身就满足前两点所以无视
重要是第三点的这个函数
函数作用是分三步检查传进来的参数是否满足白名单:
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
第一步:
只要我们传的参数是source.php或者hint.php则返回真
如果不满足继续往下判断
第二步:
取传进参数首次出现?前的部分
再进行白名单判断
如果还不满足继续往下判断
第三步:
先把传进的参数做urldecode
接着就和第二步一样
都不满足就输出"you can't see it"并且返回假
要想满足这些条件那我们传的参数就只能是这种形式
($_REQUEST 是通过 GET,POST 和 COOKIE 输入机制来传递参数,下面偷懒就用get方式传值)
http://111.198.29.45:48818/source.php?file=source.php?(payload)
http://111.198.29.45:48818/source.php?file=hint.php?(payload)
上面这种形式就符合函数的第二个判断
如果闲着无聊也可以满足第三种,就是双重url编码,传过去的时候会自动解码一次,再加上函数的一次就会满足条件
http://111.198.29.45:48818/source.php?file=source.php%253f(%253f就是?的两次url编码)
http://111.198.29.45:48818/source.php?file=hint.php%253f
符合条件后include得到得值就变成:
include source.php?(payload)
因为source.php?(或hint.php?)是固定不能改的,那么我们能利用的漏洞只有本地文件包含了
(本人技术比较菜也只能想出这种了,如果还有别的方法还望大佬们赐教)
flag文件名也知道了就差路径不知道,一个一个试可以得到
source.php(或hint.php)?/../../../../../../ffffllllaaaagggg
ok!flag get√
可能会有疑问为啥include source.php(或hint.php)?/../../../../../../ffffllllaaaagggg能执行成功
看官方对include的定义
因为我们的参数是有/../../../../../../这样的路径所以符合最后一段话如果定义了路径,就会忽略/前的字符串而去找/../../../../../../ffffllllaaaagggg这个文件
-----------------------------------------------------------------我是分割线--------------------------------------------------------------
看完了觉得不错就点个赞或者评论下吧,感谢!!!
如果本文哪里有误随时可以提出了,收到会尽快更正的