本文最后更新于 8 天前,其中的信息可能已经有所发展或是发生改变。
题目

做法
启动靶机,点进去


<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->
简要分析一波
前提小知识
$cat $:表示一个自定义的普通变量 $+字符串:表示一个变量名/对象名 双$:表示一个可变变量,用于存储变量的值
$_GET $_GET 是 PHP中预定义的 超全局变量(Superglobal Variable),用于获取通过 HTTP GET请求发送的参数。 数据类型:本质是一个 关联数组,键为参数名,值为参数对应的值
说人话:如题中的
$cat=$_GET['cat'];
就是定义一个叫cat的变量,然后通过 $_GET 从URL参数中获取cat变量的值
echo $cat: echo PHP中有两个基本的输出方式:echo和print echo和print的区别: 1、echo – 可以输出一个或多个字符串 2、print – 只允许输出一个字符串,返回值总为 1 注: echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()
Syc{cat_cat_cat_cat},类似于我们要的flag格式flag{},猜想就是满足上面的条件即可得出我们要的flag
$cat = $_GET['cat']; // 从URL参数中获取cat变量的值
echo $cat; // 直接输出cat变量的值(存在XSS风险)
if($cat == 'dog'){ // 判断cat变量是否严格等于字符串'dog'
echo 'Syc{cat_cat_cat_cat}'; // 如果条件成立,输出flag
}
方法一
直接在URL上编写payload 根据上面的分析,我们直接在地址后面加上
/?cat=dog
然后回车,我们就可以得出flag

解释:
(1)
不带斜杠:服务器不知道你到底要访问首页,还是整个站点的根? 让其误解路径,导致参数传不到代码里 带斜杠:就是访问站点的根路径,然后还写入了cat=dog的参数
(2)
- 满足
$_GET接收逻辑:必须用?参数名=值的格式,代码才能通过$_GET['cat']拿到值。 - get传参——参数和 URI 之间用问号
?隔开, 参数键值用等号=连接,然后参数之间用连接符&拼接起来方法二(思路大差不差,不过利用了一下HackBar)
F12后点击HackBar V2跳出此页面
然后点击左边的Load URL即可把当前的URL放进框中
然后就像上面的思路一般,直接在后面加入
/?cat=dog
点击Execute,即可得出flag

最后,回到题目提交flag即可

