重定向相關(guān)的安全隱患
重定向相關(guān)的安全隱患
隱患來(lái)源:
Web應(yīng)用中有時(shí)會(huì)重定向至外界指定的URL。典型的案例為,在登錄頁(yè)面的參數(shù)中指定URL,登錄成功后再重定向至該URL。
比如:使用以下URL登錄Googe后,就會(huì)重定向到continue=指定的URL(此處為Gmail)。
復(fù)制
重定向處理時(shí)產(chǎn)生的安全隱患有如下幾種,而且他們都會(huì)招致被動(dòng)攻擊。
自由重定向漏洞
HTTP消息頭注入漏洞
自由重定向安全隱患
自由重定向漏洞概要:
有些Web應(yīng)用中提供了能夠重定向到參數(shù)指定的URL的功能,該重定向功能就被稱為重定向器(Redieector)。
其中,能夠重定向至任意域名的重定向叫做自由重定向(Open Redirect)。自由重定向可能會(huì)導(dǎo)致用戶在不知情的情況下被帶到其他域名的網(wǎng)站,從而遭受到釣魚式攻擊(Phishing)。
為了防范自由重定向漏洞,應(yīng)該重新評(píng)估“外界能夠指定重定向目標(biāo)URL”的功能是否真的不可或缺,并盡可能將重定向的目標(biāo)固定。如果實(shí)在不能固定重定向的目標(biāo),就需要將重定向的目標(biāo)限制在允許的域名范圍內(nèi)。
自動(dòng)重定向漏洞總覽:
產(chǎn)生地點(diǎn):
能夠重定向至外界指定的URL的地方。
影響范圍:
影響范圍并非僅限于Web應(yīng)用中的某個(gè)頁(yè)面,通過(guò)釣魚式攻擊被竊取重要信息后,Web應(yīng)用的用戶就會(huì)遭受損失。
影響類型:
將用戶誘導(dǎo)至釣魚網(wǎng)站,使其輸入重要信息。
冒充設(shè)備驅(qū)動(dòng)程序或更新補(bǔ)丁來(lái)散布病毒。
影響程度:
中~大
用戶參與程度:
很大,點(diǎn)擊鏈接并且輸入信息。
對(duì)策概要:
固定重定向目標(biāo)
采用白名單機(jī)制,將重定向目標(biāo)限定在允許的域名范圍內(nèi)。
安全隱患的產(chǎn)生原因:
自由重定向漏洞產(chǎn)生的原因有以下兩點(diǎn)。
重定向的目標(biāo)URL能夠由外界指定。
沒有對(duì)重定向的目標(biāo)域名進(jìn)行校驗(yàn)。
以上兩點(diǎn)是AND條件,也就是說(shuō)只有同時(shí)滿足這兩點(diǎn)時(shí)才會(huì)形成自由重定向漏洞,因此,只要使其中一項(xiàng)無(wú)法滿足,也就消除了安全隱患。
解決對(duì)策:
自動(dòng)重定向漏洞的根本性防范策略有以下三項(xiàng),實(shí)施時(shí)任選其一即可。
固定重定向的目標(biāo)URL
使用編號(hào)指定重定向的目標(biāo)URL
校驗(yàn)重定向的目標(biāo)域名。
HTTP消息頭注入
HTTP消息頭注入概要:
HTTP消息頭注入漏洞是指在重定向或生成Cookie等基于外部傳入的參數(shù)輸出HTTP響應(yīng)頭時(shí)所產(chǎn)生的安全隱患。輸出響應(yīng)消息頭時(shí),攻擊者通過(guò)在參數(shù)中插入換行符,就可以在受害人的瀏覽器上實(shí)現(xiàn)如下操作:
任意添加下響應(yīng)消息頭
偽造響應(yīng)消息體。
HTTP請(qǐng)求報(bào)文格式:
在HTTP請(qǐng)求頭部中,每行用換行來(lái)隔開,一個(gè)空行后表示后面為正文內(nèi)容。
針對(duì)HTTP消息頭注入漏洞實(shí)施的攻擊就叫做HTTP消息頭注入攻擊。
響應(yīng)頭中的換行符有特殊意義。?如果在輸出過(guò)程中南沒有對(duì)外界指定的換行符進(jìn)行處理,就會(huì)導(dǎo)致HTTP消息頭注入漏洞的產(chǎn)生。
Web應(yīng)用中若存在HTTP消息頭注入漏洞,就會(huì)造成如下影響。
生成任意Cookie
重定向至任意URL(重定向至外部網(wǎng)站)
更改頁(yè)面顯示內(nèi)容(顯示偽造頁(yè)面)
執(zhí)行任意JavaScript而造成與XSS同樣的損害。
換行符(%0D%0A)。
Apache從CGI腳本中南接收的消息頭中如何有多個(gè)Location消息頭,Apache就會(huì)只將最后一的Location消息頭作為響應(yīng)返回,因此,原來(lái)的超重定向目標(biāo)就會(huì)作廢,而被換行符后面指定的URL取而代之。
HTTP消息頭注入也會(huì)將其稱為CRRF注入或者HTTP響應(yīng)截?cái)喙簟?/p>
HTTP注入安全隱患的產(chǎn)生原因:
HTTP響應(yīng)頭信息能夠以文本格式逐行定義消息都,也就是說(shuō)消息頭之間互相以緩和符相隔。而如果攻擊者惡意利用該特性,在指定重定向目標(biāo)URL或者Cookie值的參數(shù)中插入換行符,且該換行符又被直接作為響應(yīng)輸入的話,就會(huì)產(chǎn)生HTTP消息頭注入漏洞。
解決對(duì)策:
對(duì)策1:不將外界參數(shù)作為HTTP響應(yīng)消息頭輸出:
絕大多數(shù)情況下,經(jīng)過(guò)重新進(jìn)行設(shè)計(jì)評(píng)估后,都能夠做到不將外界參數(shù)作為HTTP響應(yīng)消息頭輸出。Web應(yīng)用中會(huì)用到輸出HTTP響應(yīng)消息頭的典型功能為重定向和生成Cookie,而只要遵循以下方針,就能大幅度減少直接將外界參數(shù)作為消息頭輸出的機(jī)會(huì)。
不直接使用URL指定重定向目標(biāo),而是將其固定或者通過(guò)編號(hào)等方式來(lái)指定。
使用Web應(yīng)用開發(fā)工具提供的會(huì)話變量來(lái)移交URL
因此,在設(shè)計(jì)階段就應(yīng)該盡量不把外界參數(shù)作為HTTP響應(yīng)消息頭輸出。而如果無(wú)論如何都必須將外界參數(shù)輸出到HTTP響應(yīng)消息頭中的話,可以通過(guò)如下方式來(lái)處理。
由專門的API來(lái)進(jìn)行重定向或生成Cookie的處理:
CGI腳本中能夠使用print等語(yǔ)句直接記述HTTP響應(yīng)頭,但是使用這種方法需要嚴(yán)格遵守HTTP和Cookie等標(biāo)準(zhǔn)規(guī)格,否則就可能會(huì)導(dǎo)致安全隱患等Bug產(chǎn)生。
所以可以使用各種編程語(yǔ)言提供的API來(lái)處理。

對(duì)策2:檢驗(yàn)生成消息頭的參數(shù)中的換行符:
針對(duì)換行符的處理方法右如下兩種。
URL中含有換行符就報(bào)錯(cuò)
將Cookie中的換行符進(jìn)行百分號(hào)編碼