變量覆蓋--代碼審計php
這是個薄弱地方,因此此次學習一下,總結一下。html
變量覆蓋漏洞:自定義的參數值替換原有變量值的狀況稱爲變量覆蓋漏洞數組
常常致使變量覆蓋漏洞場景有:$$ 使用不當,extract() 函數使用不當,parse_str() 函數使用不當,import_request_variables() 使用不當,開啓了全局變量註冊函數
$$致使的變量覆蓋學習
$$介紹
$$這種寫法稱爲可變變量
一個可變變量獲取了一個普通變量的值做爲這個可變變量的變量名。spa
<?php
$a = "hello";
echo "$a"; //輸出hello
$a="world";
echo "$a"; //輸出hello
echo "$$a"; //輸出word
echo "$a ${$a}"; //輸出hello world
echo "$a $hello"; //輸出hello world
?>
漏洞產生
使用 foreach 來遍歷數組中的值,而後再將獲取到的數組鍵名做爲變量,數組中的鍵值做爲變量的值。所以就產生了變量覆蓋漏洞。code
<?php foreach ($_GET as $key => $value) { ${$key} = $value; } echo $a; ?>
get獲得的數據$key和$value,關鍵第3行,${$key}用get傳進來的$key作爲新的變量,將get傳進來的$value賦值給它。
get ?a=1 第3行會解析爲$a=1。就形成了變量覆蓋。htm
extract()函數致使的變量覆蓋blog
extract() 該函數使用數組鍵名做爲變量名,使用數組鍵值做爲變量值。針對數組中的每一個元素,將在當前符號表中建立對應的一個變量。 字符串
extract()的用法參考:http://www.runoob.com/php/func-array-extract.html
parse_str函數致使的變量覆蓋
parse_str() 函數用於把查詢字符串解析到變量中,若是沒有array 參數,則由該函數設置的變量將覆蓋已存在的同名變量。