變數覆蓋

0X00 背景

總結一下自己對變數覆蓋漏洞的見解,此漏洞主要產生於白盒程式碼審計。

0X00 什麼是變數覆蓋

顧名思義,自定義的變數替換原有變數的情況稱為變數覆蓋漏洞
主要涉及的函數有以下四個:
extract() parse_str() importrequestvariables() $$

$$ 導致的變數覆蓋問題($$這種稱為可變變數)

1.一個可變變數獲取了一個普通變數的值作為這個可變變數的變數名
<?php
$a = “hello”;
echo “$a”; //輸出hello
$a=”world”;
echo “$a”; //輸出hello
echo “$$a”; //輸出word
echo “$a ${$a}”; //輸出hello world
echo “$a $hello”; //輸出hello world
?>
2.漏洞產生:通過forreach來遍曆數組中的值,然後再將獲取到的數組鍵名作為變數,數組中的鍵值作為變數的值,因此產生變數覆蓋漏洞
<?php
foreach ($_GET as $key => $value) {
${$key} = $value;
}
echo $a;
?>
get得到的數據$key和$value,關鍵第三行,${$key}用get傳進來的$key作為新的變數,將get傳進來的
$value賦值給它
get?a=1第三行會解析為$a=1,造成了變數覆蓋

extract()函數導致的變數覆蓋

extract()該函數使用數組鍵名作為變數名,使用數組鍵值作為變數值。針對數組中的每一個元素,將在當前符號表中創建對應的一個變數

parse_str函數導致的變數覆蓋問題

parse_str()函數用於把查詢字元串解析到變數中,如果沒有array參數,則由該函數設置的變數
將覆蓋已存在的變數名

import_request_variables()使用不當

import_request_variables將GET/POST/COOKIE變數導入到全局作用域中
import_request_variables()函數就是把GET、POST、COOKIE的參數註冊成變數,用在register_globals被禁止的時候