一、漏洞介紹
變量覆蓋指的是用我們自定義的參數值替換程序原有的變量值,一般變量覆蓋漏洞需要結合程序的其它功能來實現完整的攻擊
二、漏洞函數
變量覆蓋漏洞大多數由函數使用不當導致,經常引發變量覆蓋漏洞的函數有:extract(),parse_str()和import_request_variables()
1、extract()
目前最常見的就是這個函數,使用頻率最高,導致的漏洞也最多
extract(array,extract_rules,prefix)
| 參數 | 描述 |
|---|---|
| array | 必需。規定要使用的輸入。 |
| extract_rules (可選) | extract() 函數將檢查每個鍵名是否為合法的變量名,同時也檢查和符號表中的變量名是否沖突。 對非法、數字和沖突的鍵名的處理將根據此參數決定。可以是以下值之一: 可能的值:
|
| prefix(可選) | 請注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時需要。如果附加了前綴后的結果不是合法的變量名,將不會導入到符號表中。 前綴和數組鍵名之間會自動加上一個下划線。 |
從以上說明我們可以看到第一個參數是必須的,會不會導致變量覆蓋漏洞由第二個參數決定,該函數有三種情況會覆蓋已有變量。
1 <?php 2 $a = 1; //原變量值為1 3 $b = array('a' => '3'); 4 extract($b); //經過extract()函數對$b處理后 5 echo $a; //輸出結果為3 6 ?>
2、parse_str函數
parse_str函數的作用就是解析字符串並注冊成變量,在注冊變量之前不會驗證當前變量是否存在,所以直接覆蓋掉已有變量
void parse_str ( string $str [, array &$arr ] )
參數:
-
str輸入的字符串。 -
arr如果設置了第二個變量arr,變量將會以數組元素的形式存入到這個數組,作為替代。
1 <?php 2 $a = 1; //原變量值為1 3 parse_str('a=2'); //經過parse_str()函數后注冊變量$a,重新賦值 4 print_r($b); //輸出結果為2 5 ?>
3、 import_request_variables()
import_request_variables()函數就是把GET、POST、COOKIE的參數注冊成變量,用在register_globals被禁止的時候
bool import_request_variables ( string $types [, string $prefix ] )
$type代表要注冊的變量,G代表GET,P代表POST,C代表COOKIE,第二個參數為要注冊變量的前綴
<?php $a = 1; //原變量值為1 import_request_variables('GP'); //傳入參數時注冊變量 print_r($a); //輸出結果為2 ?>
三、挖掘經驗
由於變量覆蓋漏洞通常要結合應用其他功能代碼來實現完整攻擊,所以挖掘一個可用的變量覆蓋漏洞不僅僅要考慮的是能夠實現變量覆蓋,還要考慮后面的代碼能不能讓這個漏洞利用起來。
