2013-05-08 311 views
4

最近的FindBugs後(FB)運行報告說有:安全 - HTTP響應拆分漏洞下面的代碼觸發它:如何解決與ESAPI的HTTP響應拆分漏洞

String referrer = req.getParameter("referrer"); 
if (referrer != null) { 
    launchURL += "&referrer="+(referrer); 
} 
resp.sendRedirect(launchURL); 

基本上「 referrer的http參數包含一個url,當點擊我們的應用程序中的後退按鈕時,瀏覽器返回。它作爲參數附加到url。經過一番研究,我知道我需要清理引薦網址。更多的研究後,我發現esapi項目,該項目似乎提供了這樣的功能:

//1st canonicalize 
import org.owasp.esapi.Encoder; 
import org.owasp.esapi.Validator; 
import org.owasp.esapi.reference.DefaultEncoder; 
import org.owasp.esapi.reference.DefaultValidator; 
[...] 
Encoder encoder = new DefaultEncoder(new ArrayList<String>()); 
String cReferrer = encoder.canonicalize(referrer); 

不過,我並沒有弄清楚如何檢測例如jscript代碼或其他不屬於引薦網址的內容。那麼我怎麼才能用esapi來實現呢?

我想:

Validator validator = new DefaultValidator(encoder); 
validator.isValidInput("Redirect URL",referrer,"HTTPParameterValue",512,false); 

然而,這是行不通的。我需要的是這會導致功能:

http://www.google.com(OK)

http://www.google.com/login?dest=http://google.com/%0D%0ALocation:JavaScript的:0D%0A%0D%%0Aalert(document.cookie中)(不正常)

還是可以調用以下語句嗎?

encoder.encodeForHTMLAttribute(referrer); 

任何幫助表示讚賞。

回答

6

這裏是我的最終解決方案,如果有人有興趣。首先我規範化,然後URL解碼字符串。如果存在一個CR或LF(\ n \ r),我只是將\ n或\ r開頭的潛在'攻擊'字符串的其餘部分剪掉。

String sanitize(String url) throws EncodingException{ 

    Encoder encoder = new DefaultEncoder(new ArrayList<String>()); 
    //first canonicalize 
    String clean = encoder.canonicalize(url).trim(); 
    //then url decode 
    clean = encoder.decodeFromURL(clean); 

    //detect and remove any existent \r\n == %0D%0A == CRLF to prevent HTTP Response Splitting 
    int idxR = clean.indexOf('\r'); 
    int idxN = clean.indexOf('\n'); 

    if(idxN >= 0 || idxR>=0){ 
     if(idxN>idxR){ 
      //just cut off the part after the LF 
      clean = clean.substring(0,idxN-1); 
     } 
     else{ 
      //just cut off the part after the CR 
      clean = clean.substring(0,idxR-1); 
     } 
    } 

    //re-encode again 
    return encoder.encodeForURL(clean); 
} 

理論上我能有後來證實針對其在ESAPI.properties定義的「HTTPParameterValue」正則表達式的值,但它並沒有像在HTTP冒號://我沒有進一步調查。

和測試之後多了一個句話:時下大多數現代瀏覽器(Firefox> 3.6,Chrome瀏覽器IE10等)檢測這種脆弱性和不執行代碼...

+0

計算'encodeForURL(decodeFromURL(url))'可能會破壞你的URL。 – maurizeio 2015-12-26 20:31:31

1

我會建議白名單方法,其中您檢查referrer字符串只允許字符。正則表達式將是一個不錯的選擇。

編輯:

org.owasp.esapi.reference.DefaultEncoder正在使用你是不是真的編碼任何東西。查看方法encodeForHTMLAttribute(referrer)here at grepcode的源代碼。一種典型的URL編碼(編碼回車和換行)too wont help

所以前進的道路是設備一些驗證邏輯,檢查有效的字符集。這裏是another insightful article

+0

是的,但,這就是爲什麼我想要的使用esapi(至少我雖然如此)對我來說... – Lonzak 2013-05-08 12:42:13

+0

你使用'org.owasp.esapi.reference.DefaultEncoder'嗎? – Santosh 2013-05-08 12:54:48

+0

是的。 (我在上面添加了進口.CP代碼) – Lonzak 2013-05-08 15:17:25

1

我認爲你有正確的想法,但正在使用不適當的編碼器。引薦[原文]標頭值是一個真正的URL,而不是HTML屬性,所以你真的想用:

encoder.encodeForURL(referrer);

-kevin

+0

是的你是對的 - encodeForURL是使用的正確方法 – Lonzak 2013-05-16 07:16:50