zoukankan      html  css  js  c++  java
  • foreach循环导致变量覆盖

    foreach循环导致变量覆盖

    前言

    • 环境:Buuctf中[BJDCTF2020]Mark loves cat
    • 知识点:foreach语法
    • 参考:wp

    做题

    进去题目,f12审计,发现链接都是空链接,响应包无提示

    dirsearch调低线程扫一下

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

    扫到git泄露

    源码

    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;
    

    flag.php

    <?php
    
    $flag = file_get_contents('/flag');
    

    foreach


    可以看到有两种用法,一种是直接用值,一种用键和值

    我一开始想着怎样突破重重限制,到最后的直接echo$flag ,但是就是绕不过去。

    思维固定了,exit也是一种输出,并且这里存在变量覆盖漏洞

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

    利用变量覆盖漏洞,构造

    payload:yds=flag

    经过处理就是$yds=$flag ,因为没有设置$_GET[flag]$_POST[flag],导致exit($yds),而此时$yds 的值已经是flag{xxxxxxx}

    还有另一种利用exit($is),构造

    payload:is=flag&flag=flag ,经过处理就是$is=$flag ,此时$is 已经成了flag{xxxxxx}了,但是为了exit(is) ,我们还是要令flag=flag ,最后输出flag

    错误姿势

    一开始我的想法是构造

    GET:a=$flag

    POST:flag=a

    GET经处理之后就是$a=$flag ,经POST之后就是$flag=$a ,结果最后输出的是$flag ,原因大概是我们GET和POST传进去的字符是以单引号的形式,所以赋值的时候赋的是$flag 这个字符串。

  • 相关阅读:
    3D Slicer 体系结构2
    3D Slicer 体系结构1
    3D Slicer FAQ-3
    3D Slicer FAQ-2
    3D Slicer FAQ-1
    3D Slicer 编译、调试、规范化的开发
    3D Slicer 开发者必晓ABC
    3D Slicer 模块管理(二)场景视图、体数据、体绘制
    3D Slicer 模块管理(一)颜色、DCM、数据、模型、注释
    3D Slicer 数据与帮助
  • 原文地址:https://www.cnblogs.com/NineOne/p/14070745.html
Copyright © 2011-2022 走看看