csrf漏洞防御方案_变量覆盖漏洞利用及防御方案
一、漏洞簡(jiǎn)介
變量覆蓋漏洞是指攻擊者使用自定義的變量去覆蓋源代碼中的變量,從而改變代碼邏輯,實(shí)現(xiàn)攻擊目的的一種漏洞。通常來說,單獨(dú)的變量覆蓋漏洞很難有利用價(jià)值,但是在與其他應(yīng)用代碼或漏洞結(jié)合后,其造成的危害可能是無法估量的。例如購買商品的支付系統(tǒng)若存在變量覆蓋漏洞,就可能存在0元支付下單的情況。
二、漏洞產(chǎn)生的原因
變量覆蓋漏洞大多數(shù)由函數(shù)使用不當(dāng)導(dǎo)致,經(jīng)常引發(fā)變量覆蓋漏洞的函數(shù)有:
- extract()
- parse_str()
- import_request_variables()
- $$(可變變量)
- register_globals=On (PHP5.4之后正式移除此功能)
三、漏洞挖掘
1. extract()函數(shù)使用不當(dāng)導(dǎo)致的變量覆蓋
extract()函數(shù)覆蓋變量需要一定條件,它的官方說明為“從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號(hào)表”,即將數(shù)組中的鍵值對(duì)注冊(cè)成函數(shù),使用數(shù)組鍵名作為變量名,使用數(shù)組鍵值作為變量值。extract()函數(shù)的結(jié)構(gòu)如下:
extract(array,extract_rules,prefix)
參數(shù)
描述
array
必需。規(guī)定要使用的數(shù)組。
extract_rules
可選。extract() 函數(shù)將檢查每個(gè)鍵名是否為合法的變量名,同時(shí)也檢查和符號(hào)表中已存在的變量名是否沖突。對(duì)不合法和沖突的鍵名的處理將根據(jù)此參數(shù)決定。
prefix
可選。請(qǐng)注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時(shí)需要。如果附加了前綴后的結(jié)果不是合法的變量名,將不會(huì)導(dǎo)入到符號(hào)表中。
前綴和數(shù)組鍵名之間會(huì)自動(dòng)加上一個(gè)下劃線。
從以上說明我們可以看到第一個(gè)參數(shù)是必須的,會(huì)不會(huì)導(dǎo)致變量覆蓋漏洞由第二個(gè)參數(shù)決定,該函數(shù)有三種情況會(huì)覆蓋已有變量,分別如下:
第一種:當(dāng)?shù)诙€(gè)參數(shù)為EXTR_OVERWRITE 時(shí),它表示如果有沖突,則覆蓋已有的變量。
第二種:當(dāng)只傳入第一個(gè)參數(shù),這時(shí)候默認(rèn)為EXTR_OVERWRITE模式。
第三種:當(dāng)?shù)诙€(gè)參數(shù)為EXTR_IF_EXISTS 時(shí),它表示僅在當(dāng)前表中已有同名變量時(shí),覆蓋它們的值,其他的都不注冊(cè)新變量。
下面我們用代碼來說明,測(cè)試代碼如下:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
測(cè)試結(jié)果如下:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
原本變量$a的值為1,經(jīng)過extract()函數(shù)對(duì)變量$b處理后,變量$a的值被成功覆蓋為了3.
2. parse_str()函數(shù)使用不當(dāng)導(dǎo)致的覆蓋
parse_str()函數(shù)的作用是解析字符串并且注冊(cè)陳變量,它在注冊(cè)變量之前不會(huì)驗(yàn)證當(dāng)前變量是否已經(jīng)存在,所以會(huì)直接覆蓋掉已有的變量。parse_str()函數(shù)的結(jié)構(gòu)如下:
parse_str(string,array)
參數(shù)
描述
string
必需。規(guī)定要解析的字符串
array
可選。規(guī)定存儲(chǔ)變量的數(shù)組的名稱。該參數(shù)指示變量將被存儲(chǔ)到數(shù)組中。
從以上說明我們可以看到第一個(gè)參數(shù)是必須的,它代表要解析注冊(cè)成變量的字符串,形式為“a=1”,經(jīng)過parse_str()函數(shù)之后會(huì)注冊(cè)變量$a并且賦值為1。
測(cè)試代碼如下:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
測(cè)試結(jié)果如下,變量$a原有的值1被覆蓋成了5.
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
3. import_request_variables()所導(dǎo)致的變量覆蓋
import_request_variables()函數(shù)作用是把GET、POST、COOKIE的參數(shù)注冊(cè)成變量,該函數(shù)只能用在PHP4.1 ~ PHP5.4之間。
import_request_variables()函數(shù)的結(jié)構(gòu)如下:
import_request_variables ( string $types , string $prefix )
其中$type代表要注冊(cè)的變量,當(dāng)$type為GPC的時(shí)候,則會(huì)注冊(cè)GET、POST、COOKIE參數(shù)為變量。
測(cè)試代碼如下:
點(diǎn)擊添加圖片描述(最多60個(gè)字)
測(cè)試結(jié)果如下,變量$a原有的值1被覆蓋成了6.
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
4. 由$$變量賦值引發(fā)的覆蓋
$$是一種可變變量的寫法,它可以使一個(gè)普通變量的值作為可變變量的名字,這種類型常常會(huì)使用遍歷的方式來釋放變量的代碼,最常見的就是foreach的遍歷,示例代碼如下:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
從代碼中我們可以看出$_key為COOKIE、POST、GET中的參數(shù),$key的值為a而還有一個(gè)$在a的前面,結(jié)合起來則是$a=addslashes($_value);所以這樣會(huì)覆蓋已有的變量$a的值。在瀏覽器輸入http://127.0.0.1/test.php?a=666,結(jié)果如下,可以看到已經(jīng)成功把變量$a的值由2覆蓋成了666。
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
5.全局變量的覆蓋
register_globals的意思就是注冊(cè)為全局變量,所以當(dāng)On的時(shí)候,傳遞過來的值會(huì)被直接的注冊(cè)為全局變量直接使用,而Off的時(shí)候,我們需要到特定的數(shù)組里去得到它。下面我們來看如下一段代碼:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
當(dāng)register_globals為OFF時(shí),我們無法將未初始化的變量進(jìn)行注冊(cè),如下圖所示:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
當(dāng)register_global=ON時(shí),可以看到已經(jīng)成功注冊(cè)了一個(gè)未初始化的變量,如下圖所示:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
還有一種情況,通過$GLOBALS獲取的變量在使用不當(dāng)時(shí)也會(huì)導(dǎo)致變量覆蓋,同樣漏洞觸發(fā)的前提是register_globals為ON,如下圖所示,已成功通過注入GLOBALS[a]來改變$a的值:
點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯
tips:從PHP 4.2.0 版開始配置文件中PHP指令register_globals的默認(rèn)值從on改為off了,自PHP 5.3.0起廢棄并將自PHP 5.4.0起移除。
四、漏洞防范
變量覆蓋漏洞最常見的漏洞點(diǎn)是在做變量注冊(cè)時(shí)沒有驗(yàn)證變量是否存在,以及在賦值給變量的時(shí)候,所以一般推薦使用原始的變量數(shù)組,如$_GET、$_POST,或者在注冊(cè)變量前一定要驗(yàn)證變量是否存在。
①使用原始變量
建議不注冊(cè)變量,直接用原生的$_GET、$_POST等數(shù)組變量進(jìn)行操作,如果考慮程序可讀性等原因,需要注冊(cè)個(gè)別變量,可以直接在代碼中定義變量,然后再把請(qǐng)求中的值賦值給他們。
②驗(yàn)證變量存在
如果一定要使用前面幾種方式注冊(cè)變量,為了解決變量覆蓋的問題,可以再注冊(cè)變量前先判斷變量是否存在。如使用extract( )函數(shù)則可以配置第二個(gè)參數(shù)為EXTR_SKIP。使用php parse_str函數(shù)注冊(cè)變量前需要先自行通過代碼判斷變量是否存在。最重要的一點(diǎn),自行申明的變量一定要初始化,不然即使注冊(cè)變量代碼在執(zhí)行流程最前面也能覆蓋掉這些未初始化的變量。
總結(jié)
以上是生活随笔為你收集整理的csrf漏洞防御方案_变量覆盖漏洞利用及防御方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua与python结合_Lua和Pyt
- 下一篇: 怎么开机选择系统 如何在开机时选择系统