天天看點

$$導緻的變量覆寫問題

話不多說直接上代碼:

使用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