【代碼審計】變量覆蓋漏洞詳解


一、漏洞介紹

變量覆蓋指的是用我們自定義的參數值替換程序原有的變量值,一般變量覆蓋漏洞需要結合程序的其它功能來實現完整的攻擊

二、漏洞函數

變量覆蓋漏洞大多數由函數使用不當導致,經常引發變量覆蓋漏洞的函數有:extract(),parse_str()和import_request_variables()

1、extract()

  目前最常見的就是這個函數,使用頻率最高,導致的漏洞也最多

   extract(array,extract_rules,prefix) 

 參數 描述
array 必需。規定要使用的輸入。
extract_rules (可選)         

extract() 函數將檢查每個鍵名是否為合法的變量名,同時也檢查和符號表中的變量名是否沖突。

對非法、數字和沖突的鍵名的處理將根據此參數決定。可以是以下值之一:

可能的值:

  • EXTR_OVERWRITE - 默認。如果有沖突,則覆蓋已有的變量。
  • EXTR_SKIP - 如果有沖突,不覆蓋已有的變量。(忽略數組中同名的元素)
  • EXTR_PREFIX_SAME - 如果有沖突,在變量名前加上前綴 prefix。自 PHP 4.0.5 起,這也包括了對數字索引的處理。
  • EXTR_PREFIX_ALL - 給所有變量名加上前綴 prefix(第三個參數)。
  • EXTR_PREFIX_INVALID - 僅在非法或數字變量名前加上前綴 prefix。本標記是 PHP 4.0.5 新加的。
  • EXTR_IF_EXISTS - 僅在當前符號表中已有同名變量時,覆蓋它們的值。其它的都不處理。可以用在已經定義了一組合法的變量,然后要從一個數組例如 $_REQUEST 中提取值覆蓋這些變量的場合。本標記是 PHP 4.2.0 新加的。
  • EXTR_PREFIX_IF_EXISTS - 僅在當前符號表中已有同名變量時,建立附加了前綴的變量名,其它的都不處理。本標記是 PHP 4.2.0 新加的。
  • EXTR_REFS - 將變量作為引用提取。這有力地表明了導入的變量仍然引用了 var_array 參數的值。可以單獨使用這個標志或者在 extract_type 中用 OR 與其它任何標志結合使用。本標記是 PHP 4.3.0 新加的。
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
?>

三、挖掘經驗

  由於變量覆蓋漏洞通常要結合應用其他功能代碼來實現完整攻擊,所以挖掘一個可用的變量覆蓋漏洞不僅僅要考慮的是能夠實現變量覆蓋,還要考慮后面的代碼能不能讓這個漏洞利用起來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM