[BJDCTF2020]Mark loves cat 三种方法

本题考点:php代码审计,变量覆盖漏洞

进入页面发现,找提示没找到,抓包也没有提示,试试扫目录吧

发现了.git那可能有git泄露

我直接使用githack的时候没有拿到源码只能借用别人的源码了

Index.php



<?php

include 'flag.php';

$yds = "dog";

$is = "cat";

$handsome = 'yds';


foreach($_POST as $x => $y){    

    $$x = $y  ;  //post 声明至当前文件

}


foreach($_GET as $x => $y){   

    $$x = $$y;  //GET型变量重新赋值为当前文件变量中以其值为键名的值

}


foreach($_GET as $x => $y){

    if($_GET['flag'] === $x && $x !== 'flag'){  //传入的变量为flag   value不是flag

        exit($handsome);

    }

}


if(!isset($_GET['flag']) && !isset($_POST['flag'])){ 

    exit($yds);

}


if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){  

    exit($is);

}


echo "the flag is: ".$flag;

}

从最后一段代码中可以得知调用$flag变量即可获得flag,那么可以用变量覆盖漏洞,让exit输出flag变量

代码审计:

foreach($_POST as $x => $y){    

    $$x = $y  ;  //post 声明至当前文件

}

foreach是php中的循环,这里的意思是把post里面的数据当作键对值,而$$x可以简单理解为$($x)就是括号里面的是变量的值,然后再加上前面的$符号组成新的变量,举个例子:

post数据为:

a=c

那么这里的键对值就为:$a=c

同理:

foreach($_GET as $x => $y){   

    $$x = $$y;  //GET型变量重新赋值为当前文件变量中以其值为键名的值

}

这里就是把get的数据参数传为变量

举例:

?b=c

那么键对值就为$b=$c

第一种方法:

foreach($_GET as $x => $y){

    if($_GET['flag'] === $x && $x !== 'flag'){  //传入的变量为flag   value不是flag

        exit($handsome);

    }

}

遍历get方式传入数据的键值对,get['flag']===$x,要求?flag的值要等于get传参中的键名$x,且$x不能为flag

那么可以用?a=flag&flag=a

这里的$x就为a,参数flag的值为a,那么get['flag']=a,$x=a,$x!=flag,完成条件,推出程序,且输出变量,那么再加上变量覆盖就可以得到flag

Payload:?handsome=flag&a=flag&flag=a

第二种方法:

if(!isset($_GET['flag']) && !isset($_POST['flag'])){ 

    exit($yds);

}

这里要求get和post都不能有flag参数,那么我们直接进行变量覆盖就会执行exit,并输出变量

所以payload:?yds=flag

第三种方法:

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){  

    exit($is);

}

只要post参数为flag=flag或者get参数为flag=flag就执行exit并输出变量

所以payload:?is=flag&flag=flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值