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