[BJDCTF2020]Mark loves cat


0x00 知識點

GitHack讀取源碼

$$會導致變量覆蓋漏洞

0x01解題

dirsearch掃描一下,發現/.git目錄,用githack獲取一下源碼。

<?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'){	//GET方式傳flag只能傳一個flag=flag
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){	//GET和POST其中之一必須傳flag
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){	//GET和POST傳flag,必須不能是flag=flag
    exit($is);
}

echo "the flag is: ".$flag;

分析一下代碼邏輯

forsearch:
post傳參和get傳參的參數鍵名和值

首先我們post:$flag=flag

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

簡單好理解一點,我們直接帶入第一行后再比較第二行
這樣就變成了$$flag = flag

接下來GET:?yds=flag

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

$x為yds,$y為flag,所以$$x表示$yds,$$y也就是$flag,$flag就是真正的flag{XXXXXX}。$$x = $$y,也就是$yds=flag{XXXXXX}。
看源碼

只要沒有flag參數,就會exit($yds),就可以得到flag了。

payload:

GET:yds=flag
POST:$flag=flag


免責聲明!

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



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