變量覆蓋漏洞
常常引起變量覆蓋漏洞的函數有:extract(),parsestr()和importrequestvariables()和$$(可變變量)php
$$可變變量引發的變量覆蓋漏洞
1、咱們先來查看源代碼進行分析
一、Include 調用了flag.php文件
二、$_200,$403 定義兩個參數,以及參數值。
三、接着是兩個判斷語句,判斷訪問頁面的方法是否爲post方法和有沒有參數flag。
四、再接着兩個foreach函數遍歷數組函數,這裏就是把咱們用get方法傳輸的數據當作數組進行遍歷,並將遍歷的參數賦值給key,將參數值複製給value。
五、還有一個if判斷語句,判斷用post方法傳輸的數據是否是和$flag的值相同,若是相同,輸出flag。
六、最後輸出$200的內容。數組
2、從源碼文件中能夠看出,要想得到flag,你必須知道原來的flag,那是不可能的。
這個時候咱們就能夠利用變量覆蓋漏洞。
一、咱們能夠看到在第一個數組ide
foreach ($_GET as $key => $value) $$key = $$value
這個遍歷中出現$$key = $$value,這裏將鍵和值又當作變量來使用。就這個題目來講,咱們用get方法傳遞:_200=flag,通過$$key = $$value的處理後,就會變爲$_200=$flag,這樣就會將原來的$_200的值覆蓋掉,換成$flag的值
三、第二個數組遍歷函數
foreach ($_POST as $key => $value) $$key = $value;
這個遍歷中出現$$key = $value,這裏將只是將數組鍵當作下一個變量,將數組的值當作這個$$key的值。例如post方法傳入flag=abc,則處理後變成$flag=abc。這樣就形成將咱們須要獲取的flag的值給覆蓋掉了。post
3、經過多重分析,咱們可先將$flag的值經過第一個數組遍歷賦值給$_200,而後經過die($_200)輸出出來,不過同時咱們應該知足源碼的判斷條件,經過post方法傳遞flag的值。這裏咱們已經將flag的值給了$_200因此不用再擔憂將flag的值覆蓋掉,能夠隨便輸入。3d
4、因此咱們的payload是:
Get方法傳輸:?_200=flag
Post方法傳輸:flag=abcde
5、驗證結果:
由於是復現題目,flag有所差異。code