根據(jù)參考鏈接中的的歷史剖析:
(1)PHP 5.1.2以下版本必定存在問題。使用(urlencode結(jié)果為%0d%0a)就可以構(gòu)造CRLF攻擊。Bug#60227是以5.1.2版本為分界的,此處采納但本人未驗(yàn)證。
(2)5.1.2 <= php < 5.3.11、5.4.0 <= php < 5.4.1(redhat討論給出的版本范圍)可以繞過內(nèi)建防御。Stefan Esser大牛說只需要(urlencode結(jié)果為%0d)換行即可在Chrome和IE上生效,有時(shí)要配合使用空格(urlencode結(jié)果為%20)?
(3)已經(jīng)完全修復(fù)的版本是從5.3.11和5.4.1開始(redhat討論給出的版本范圍)?本人沒確認(rèn)。
在360網(wǎng)站安全檢測上,這個(gè)漏洞權(quán)重較高,屬高危(http://webscan.#/vul/view/vulid/129 )。但個(gè)人不是很認(rèn)可,因?yàn)椋?
(1)實(shí)際來看和業(yè)務(wù)太緊密,大多不好利用,和“高?!钡目臻g有差別。
(2)5.1.2 <= php < 5.3.11、5.4.0 <= php < 5.4.1(redhat討論給出的版本范圍)的內(nèi)建防御雖然不完全,但已經(jīng)不允許組合使用(php會(huì)報(bào)錯(cuò)從而執(zhí)行不下去)。只使用繞過雖然能控制CSP(Content Security Policy)Header選項(xiàng)或者設(shè)置cookies影響業(yè)務(wù)可用性,但試來試去就是做不到某些教程中的顯示釣魚內(nèi)容或者執(zhí)行腳本(http://www.javaarch.net/jiagoushi/847.htm )——瀏覽器似乎直接Location跳轉(zhuǎn)走了,即使為空也不顯示頁面內(nèi)容,導(dǎo)致無法顯示釣魚內(nèi)容或者執(zhí)行腳本,結(jié)果預(yù)期攻擊失敗,達(dá)不到效果......
另外其演示鏈接“r=%0d%0a%20SomeCustomInjectedHeader%3Ainjected_by_wvs”(參數(shù)r用于header跳轉(zhuǎn)中的Location字段),經(jīng)過測試即使是不完全內(nèi)建防御(比如php 5.2.x)也會(huì)過濾掉%0d%0a(就是),只剩下空格,結(jié)果這行header實(shí)際上沒有任何換行,那這種情況下是否還能攻擊生效,個(gè)人表示懷疑(實(shí)測沒發(fā)現(xiàn)成功)。
檢測網(wǎng)站還給出一個(gè)字符過濾修復(fù)的建議方案,但資源消耗比較大且不合理。這里主要是將它里面的多次正則直接合并為一個(gè),并做成函數(shù)供開發(fā)按需調(diào)用過濾,而不是在所有GET/POST等輸入?yún)?shù)都過濾——如果這樣做的話好多存在換行的需求等業(yè)務(wù)會(huì)出現(xiàn)問題,比如寫文章無法換行等。
function fix_http_header_inject($str){
if(empty($str)){
return $str;
}
return trim(strip_tags(preg_replace('/( |\t|\r|\n|\')/', '', $str)));
}
//echo fix_http_header_inject(urldecode("asdfdas%0d%0a%20asdfdas%0d%0a%20asdfdas%0d%0a%20asdfdas%0d%0a%20"));