4

最近の findbugs (FB) の実行後、次のことを訴えます:セキュリティ - HTTP 応答分割の脆弱性次のコードがトリガーされます:

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

基本的に、'referrer' http パラメータには URL が含まれており、アプリケーションで [戻る] ボタンをクリックすると、ブラウザはその URL に戻ります。パラメータとして 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);

ただし、リファラー URL に属さない jscript コードやその他のものなどを検出する方法がわかりませんでした。では、どうすればesapiでそれを達成できますか?

私は試した:

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

ただし、これは機能しません。私が必要としているのは、次のような関数です。

http://www.google.com (わかりました)

http://www.google.com/login?dest=http://google.com/%0D%0ALocation : javascript:%0D%0A%0D%0Aalert(document.cookie) (問題あり)

それとも、次のステートメントを呼び出すだけで十分ですか?

encoder.encodeForHTMLAttribute(referrer);

どんな助けでも感謝します。

4

4 に答える 4

7

誰かが興味を持っている場合、これが私の最終的な解決策です。最初に文字列を正規化し、次に 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);
        }
        else{
            //just cut off the part after the CR
            clean = clean.substring(0,idxR);
        }
    }
    
    //re-encode again
    return encoder.encodeForURL(clean);
}

理論的には、後で ESAPI.properties で定義されている 'HTTPParameterValue' 正規表現に対して値を検証できたはずですが、http:// のコロンが気に入らなかったため、さらに調査しませんでした。

テスト後のもう 1 つのコメント: 最近のほとんどのブラウザ (Firefox > 3.6、Chrome、IE10 など) は、この種の脆弱性を検出し、コードを実行しません...

于 2013-05-16T07:15:57.803 に答える
1

referrer文字列に許可されている文字のみをチェックするホワイトリスト アプローチをお勧めします。正規表現は良いオプションです。

編集:

あなたが使用しているクラスorg.owasp.esapi.reference.DefaultEncoderは、実際には何もエンコードしていません。encodeForHTMLAttribute(referrer) ここの grepcodeにあるメソッドのソース コードを見てください。一般的な URL エンコーディング (キャリッジ リターンとライン フィードのエンコーディング)も役に立ちません

そのため、有効な文字セットをチェックする検証ロジックをデバイスにすることになります。これは別の洞察に満ちた記事です。

于 2013-05-08T12:22:26.377 に答える
1

あなたの考えは正しいと思いますが、不適切なエンコーダを使用しています。Referer [sic] ヘッダー値は実際には URL であり、HTML 属性ではないため、実際に使用する必要があるのは次のとおりです。

encoder.encodeForURL(referrer);

-ケビン

于 2013-05-09T03:42:13.517 に答える