• 刷题[BJDCTF2020]Mark loves cat


    解题思路

    打开网页,发现是一个博客,基本寻找博客挂载信息,源码等无果后,扫描后台。发现.git泄露

    .git泄露

    发现.git泄露后,使用Git Extract这款工具,可自动将源码clone到本地

    发现flag.php和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){
        if($_GET['flag'] === $x && $x !== 'flag'){
            exit($handsome);
        }
    }
    
    if(!isset($_GET['flag']) && !isset($_POST['flag'])){
        exit($yds);
    }
    
    if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
        exit($is);
    }
    
    echo "the flag is: ".$flag;
    

    进行代码审计,共有三个结束条件,此时思路是构造其中一个结束条件,使其满足if中的内容。最后exit($flag),输出flag内容

    第一个if

    if($_GET['flag'] === $x && $x !== 'flag'){
            exit($handsome);
    

    判断get传过来键为flag的值是否等于flag,如果不等于,结束输出$handsome

    第二个if

    if(!isset($_GET['flag']) && !isset($_POST['flag'])){
        exit($yds);
    }
    

    判断get和post都没有传输键为flag的内容,则结束输出$yds

    第三个if

    if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
        exit($is);
    }
    

    判断get和post都传输了键值都为flag的内容,则结束输出$is

    解题

    选取一个结束条件,这里选第二个if。
    结束的参数为yds,所以这里我们get传入yds的键,值为flag
    那么经过foreach后,$yds=$flag。即打到变量覆盖,yds的值覆盖为flag的内容,获取flag

    总结思路

    核心思路:

    • 发现存在.git泄露
    • 发现存在经典的foreach 和 $$ 变量覆盖漏洞
    • 通过变量覆盖获取flag

    知识点

    • .git泄露
    • 变量覆盖
  • 相关阅读:
    Golang :索引值对的数组
    MySql-BlackHole:黑洞引擎
    golang fmt 中的 Sprintf、Fprintf和 Printf函数
    golang 中的 rune 和 byte
    mysql 全文索引
    Python 原始字符串
    如何给博客园(或者CSDN)设置域名访问
    CPU、内存、磁盘三者的关系
    018.redis 阶段性总结:1T 以上海量数据+10 万以上 QPS 高并发+ 99.99% 高可用
    017.redis 在实践中的一些常见问题以及优化思路(包含 linux 内核参数优化)
  • 原文地址:https://www.cnblogs.com/karsa/p/13377034.html
Copyright © 2020-2023  润新知