主要锻炼一下变量覆盖那些绕绕的东西。
git泄露,,这个还没好,等问问班长的
获得源码后:
index.php
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){/*参数中flag的值绝对某个键值,且键名不能有flag*/
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
/*get方法键名不能够 flag,post中也不能有键名为 flag的*/
if(!isset($_GET['flag']) && !isset($_POST['flag'])){//不存在get型flag参数, 且,不存在post型flag参数
exit($yds);
}
/*get方法键名不能够 flag,post中也不能有键名为 flag的*/
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){//不存在get型flag参数, 且,不存在post型flag参数
exit($is);
}
echo "the flag is: ".$flag;
flag.php
<?php//$flag就是最终的flag内容
$flag = file_get_contents('/flag');
我的想法是,,直接走走走,一直到最后echo出flag来,,,
但是不会做。看WP后恍然大悟,exit也是输出啊。是吧
那就输出这三个变量,就让这三个字符串变成变量名,指向$flag就好了嘛,这不就有了变量覆盖的思路了么。
假设走第一个exit()
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
/*参数中flag的值绝对某个键值,且键名不能有flag*/
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
键名不能有flag,而且又要键名为flag的键值等于其中一个键名,
不能有,又要求相等,,进不去,换下一个
第二个:
$yds = "dog";
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
/*get方法键名不能够 flag,post中也不能有键名为 flag的*/
if(!isset($_GET['flag']) && !isset($_POST['flag'])){//不存在get型flag参数, 且,不存在post型flag参数
exit($yds);
}
GET:yds=flag
他输出$yds。我们只需让$yds=$flag就好了,能能够出flag了
$$x=$$y。 $x=yds,$y=flag.
也就是 $($x)=$yds , $($y)=$flag。所以,$yds=$flag
而 $flag就是那个字符串,$yds=ctf{*******}
exit($yds)。就是echo $flag。就出flag了
再走第三个:
<?php
include 'flag.php';
$is = "cat";
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
/*get方法键名不能够 flag,post中也不能有键名为 flag的*/
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){//不存在get型flag参数, 且,不存在post型flag参数
exit($is);
}
先看post这条路 flag=flag
$flag=flag。好了,原本的flag{**********}被我们换成 flag字符串了,,整没了,所以不行。
那再看get这条路flag=flag
$flag=$flag。对于flag没有影响。
然后和上面那个一样,get:is=flag就好
参考自:https://blog.youkuaiyun.com/qq_43622442/article/details/105925473
本文介绍了在BJDCTF2020的Mark loves cat挑战中如何利用变量覆盖漏洞解题。通过git泄露获取源码后,作者探讨了如何通过设置不同的请求参数,如GET的'yds'和'is',来覆盖变量并最终获取flag。解题关键在于理解exit()函数也可作为输出,并利用这一特性进行变量操纵。
535

被折叠的 条评论
为什么被折叠?



