攻防世界-web高手进阶篇-warmup

打开题目链接后只有一个滑稽??(那就看看它里面攻防世界-web高手进阶篇-warmup_第1张图片有啥吧)

攻防世界-web高手进阶篇-warmup_第2张图片

想啥呢,是审查源码啦

攻防世界-web高手进阶篇-warmup_第3张图片

可以看到有注释source.php,访问后可以看到其源码

攻防世界-web高手进阶篇-warmup_第4张图片

又发现一个hint.php文件,先访问再说

攻防世界-web高手进阶篇-warmup_第5张图片

提示我们flag在ffffllllaaaagggg里面,此时题目已经完成一半啦

接着看回source.php源码

可以看到最后的include 是可以动态构造参数的,那应该就是解题关键了

不过要经过三个判断

第一个:检查一个变量是否为空

第二个:是否为字符串

第三个:通过函数来检查

我们要构造的payload本身就满足前两点所以无视

重要是第三点的这个函数

函数作用是分三步检查传进来的参数是否满足白名单:

$whitelist = ["source"=>"source.php","hint"=>"hint.php"];

第一步:

攻防世界-web高手进阶篇-warmup_第6张图片

只要我们传的参数是source.php或者hint.php则返回真

如果不满足继续往下判断

第二步:

攻防世界-web高手进阶篇-warmup_第7张图片

取传进参数首次出现?前的部分

再进行白名单判断

如果还不满足继续往下判断

第三步:

攻防世界-web高手进阶篇-warmup_第8张图片

先把传进的参数做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√

攻防世界-web高手进阶篇-warmup_第9张图片

可能会有疑问为啥include source.php(或hint.php)?/../../../../../../ffffllllaaaagggg能执行成功

攻防世界-web高手进阶篇-warmup_第10张图片

看官方对include的定义

因为我们的参数是有/../../../../../../这样的路径所以符合最后一段话如果定义了路径,就会忽略/前的字符串而去找/../../../../../../ffffllllaaaagggg这个文件

-----------------------------------------------------------------我是分割线--------------------------------------------------------------

 

看完了觉得不错就点个赞或者评论下吧,感谢!!!

如果本文哪里有误随时可以提出了,收到会尽快更正的

你可能感兴趣的:(CTF)