話不多說直接上代碼:
使用foreach來周遊數組中的值,然後再将擷取到的數組鍵名作為變量,數組中的鍵值作為變量的值。是以就産生了變量覆寫漏洞。請求?name=test 會将$name的值覆寫,變為test。
1.<?php
2.//?name=test
3.//output:string(4) “name” string(4) “test” string(4) “test” test
4.$name=’thinking’;
5.foreach ($_GET as $key => $value)
6. $$key = $value;
7. var_dump($key);
8. var_dump($value);
9. var_dump($$key);
10.echo $name;
11.?>
CTF中$$導緻的變量覆寫問題的例題1:
題目源碼:
1.<?php
2.include “flag.php”;
3.$_403 = “Access Denied”;
4.$_200 = “Welcome Admin”;
5.if ($_SERVER["REQUEST_METHOD"] != “POST”)
6. die(“BugsBunnyCTF is here :p…”);
7.if ( !isset($_POST["flag"]) )
8. die($_403);
9.foreach ($_GET as $key => $value)
10. $$key = $$value;
11.foreach ($_POST as $key => $value)
12. $$key = $value;
13.if ( $_POST["flag"] !== $flag )
14. die($_403);
15.echo “This is your flag : “. $flag . “\n”;
16.die($_200);
17.?>
代碼分析:
1、Include 調用了flag.php檔案
2、_200,_403 定義兩個參數,以及參數值。
3、接着是兩個判斷語句,判斷通路頁面的方法是否為post方法和有沒有參數flag。
4、再接着兩個foreach函數周遊數組函數,這裡就是把我們用get方法傳輸的資料當做數組進行周遊,并将周遊的參數指派給key,将參數值複制給value。
5、還有一個if判斷語句,判斷用post方法傳輸的資料是不是和$flag的值相同,如果相同,輸出flag。
6、最後輸出$200的内容。
二、從源碼檔案中可以看出,要想獲得flag,你必須知道原來的flag,那是不可能的。
這個時候我們就可以利用變量覆寫漏洞。
1、我們可以看到在第一個數組
foreach ($_GET as $key => $value)
$$key = $$value
這個周遊中出現
$$key = $$value
,這裡将鍵和值又當做變量來使用。就這個題目來說,我們用get方法傳遞:_200=flag,經過
$$key = $$value
的處理後,就會變為
$_200=$flag
,這樣就會将原來的
$_200
的值覆寫掉,換成$flag的值
3、第二個數組周遊
foreach ($_POST as $key => $value)
$$key = $value;
這個周遊中出現
$$key = $value
,這裡将隻是将數組鍵當做下一個變量,将數組的值當做這個
$$key
的值。例如post方法傳入flag=abc,則處理後變成$flag=abc。這樣就造成将我們需要擷取的flag的值給覆寫掉了。
三、通過多重分析,我們可先将
$flag
的值通過第一個數組周遊指派給
$_200
,然後通過
die($_200)
輸出出來,不過同時我們應該滿足源碼的判斷條件,通過post方法傳遞flag的值。這裡我們已經将flag的值給了$_200是以不用再擔心将flag的值覆寫掉(即使覆寫掉了我們輸出的是_200的值),可以随便輸入。
四、是以我們的payload是:
Get方法傳輸:?_200=flag
Post方法傳輸:flag=abcde