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 这个字符串。

原文地址:https://www.cnblogs.com/NineOne/p/14070745.html