------已搬运-------BUUCTF:[BJDCTF2020]Mark loves cat (两种解法)(变量覆盖漏洞)

本文介绍了在BJDCTF2020的Mark loves cat挑战中如何利用变量覆盖漏洞解题。通过git泄露获取源码后,作者探讨了如何通过设置不同的请求参数,如GET的'yds'和'is',来覆盖变量并最终获取flag。解题关键在于理解exit()函数也可作为输出,并利用这一特性进行变量操纵。

主要锻炼一下变量覆盖那些绕绕的东西。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值