變數覆蓋漏洞是需要我們需要值得注意的乙個漏洞,下面就對變數覆蓋漏洞進行乙個小總結。
變數覆蓋指的是可以用我們自定義的引數值替換程式原有的變數值,通常需要結合程式的其他功能來實現完整攻擊。那麼它是如何引起的?其實,大多數變數覆蓋漏洞是函式使用不當導致的。比如extract()函式和parse_str()。還有乙個函式是import_request_variables(),它是在沒有開啟全域性變數註冊的時候,呼叫這個函式相當於開啟了全域性變數註冊,在php5.4之後,這個函式被取消了。還有一種是利用$$的方式來註冊變數,但是沒有驗證已有變數,導致被覆蓋。
函式結構:
int extract( array &$var_array[, int $extract_type = extr_overwrite[, string $prefix = null]] )
再看一下php手冊對這個函式的說明
說的通俗點就是將陣列中的鍵值對註冊成變數。extract()函式想要變數覆蓋,需要一定的條件。它最多允許三個引數,用**說明一下這三個引數:
由上圖可知,該函式有三種情況會覆蓋掉已有變數。下面用一段簡單的**來加深印象。
<?php
$b=2;
$a=array('b'=>'123');
extract($a);
echo $b;
?>
原來$b=2,經過extract()函式對$a處理後,$b被成功覆蓋為123。
parse_str()函式的作用是解析字串並且註冊成變數,它在註冊變數之前不會驗證當前變數是否存在,所以會直接覆蓋掉原有變數。函式說明如下:
void parse_str( string $str[, array &$arr] )
函式有兩個引數,第乙個是必須的,代表要解析註冊成變數的字串,比如「a=1」經過parse_str()函式後會註冊$a並複製為1,第二個引數是乙個陣列,當第二個引數存在時,註冊的變數會放到這個陣列裡,如果原來有相同的鍵值,則會覆蓋掉它。
用一段簡單的**加深印象:
<?php
$b=2;
parse_str($b=321);
print_r($b);
?>
我們發現$b的值被覆蓋為321。
先看引起覆蓋的一小段**:
<?php
$a=1;
foreach (array('_cookie','_post','_get') as $_request)
}echo $a;
?>
它為什麼會導致變數覆蓋呢?重點在$$符號,從**中,我們可以看出$_key為cookir、post、get中的引數,如果我們提交?a=3,那麼$key的值就為3,還有乙個$在a的前面,結合起來就是$a=addslashes($_value),所以會覆蓋原有a的值。上面的**我們執行一下,如下圖,發現a被覆蓋成由get方式傳的8。
變數覆蓋最常見的漏洞點是做變數註冊時沒有驗證變數是否存在。所以想要防範,推薦使用原始的變數陣列,如$_get、$_post等,或者在註冊變數前一定要驗證變數是否存在。
PHP 變數覆蓋漏洞
php中的變數覆蓋漏洞 變數覆蓋 自定義的引數值替換原有變數值的情況稱為變數覆蓋漏洞 經常導致變數覆蓋漏洞場景有 開啟了全域性變數註冊 使用不當 extract 函式使用不當 parse str 函式使用不當 import request variables 使用不當等。在 php5.3 之前,預設...
php之變數覆蓋漏洞講解
1.變數沒有初始化的問題 1 wooyun連線1 link href wooyun phpcms v9 member表內容隨意修改漏洞 tenzy link updateinfo password newpassword 裡面的陣列沒有初始化類似這樣的賦值,我們在挖洞的時候搜尋類似updateinf...
變數覆蓋漏洞
變數覆蓋指的是可以用我們自定義的引數值替換程式原有的變數值 經常引發變數覆蓋漏洞的函式有 extract parse str 和import request variables 函式 一 使用函式不當 1.extract 函式 該函式有三種情況會覆蓋掉已有變數 第一種情況是第二個引數為extr ov...