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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM