2011-08-12 7 views
2

私の会社は、特定のアプリケーションに関するすべてのセキュリティ問題を解決するタスクを私に与えました。セキュリティトライムは、クロスサイトスクリプティングエラーを報告しました。エラーは、次の入力フィールドにある:隠し入力によるクロスサイトスクリプティング

<input type="hidden" name="eventId" value="${param.eventId}"/> 

セキュリティからの報告は非常に詳細ではなかったが、彼らは次の悪質なコードを含む上記のタグを持つページにPOSTリクエストを作ることができると言う。

eventId=%22%3e%3csCrIpT%3ealert(83676)%3c%2fsCrIpT%3e 

とページをリロードつまり、それは次のようになります:

<input type="hidden" name="eventId" value=""><sCrIpt>alert(83676)</sCrIpt></value> 

私は「ハッカーなる」と脆弱性を表示しようとしています。しかし、私は彼らがそこにそのスクリプトを取得する方法を把握することはできません。私は彼らがフォームのGET要求のURLパラメータとしてそれを含めると推測していますが、自分でそれをやろうとすると403エラーが発生します。どのようにして脆弱性が表示されるのか誰にでも分かりますか

私は、このサイトに多数のXSS質問があることを知っていますが、このトピックには当てはまりません。

+0

方法それをURLに追加しましたか?他のパラメータはどこにありますか? – Erlend

答えて

3

だから、私はなぜ、私のオリジナルの勘違いが正しいのか分かりません。スクリプトはURLパラメータとして置くことができます。しかし何らかの理由で、これは私たちのステージングサイトでは機能しませんでした。アプリケーションをローカルで実行する場合のみ。私がなぜわからないが、これは(ローカルでのみ)動作します:

http://localhost:8080/myUrl/MyAction.do?eventId=%22%3e%3csCrIpT%3ealert(83676)%3c%2fsCrIpT%3e 

はそれを行うには、警告ボックスがポップアップ表示されます。私はJSTL関数を使って修正しようとしています。

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
... 
<input type="hidden" name="eventId" value="${fn:escapeXml(param.eventId)}"/> 
0

問題を解決するには、valueAttribute内に値を挿入する前に値をHTMLAttributeEncodeする必要があります。 HTML属性のエンコードを行う方法については、OWASP ESAPIまたはMS AntiXSSを参照してください。 攻撃文字列がURLエンコーディングであることを見て、GETパラメータが妥当と思われるので、それを含めると思います。

1

[TamperData][1]アドオンをFirefoxのブラウザにインストールすると、提出前にデータを編集できるようになります。それがPOSTかGETのどちらかであるかどうかは関係ありません。

これを使用すると、hidden fieldseditedになります。

0

私はOWASP ESAPI APIを使用しました。これは、従来のjspにはJSTLが利用できなかったためです。これは私が使用したものである:

<input type="hidden" name="dataValue" value="<%=ESAPI.encoder().encodeForHTMLAttribute(dataValue)%>"> 
あなたはまた、のように私も必要request.Parameterを()、フィルタリングするためにAPIを使用することができます

String userURL = request.getParameter("userURL") 
boolean isValidURL = ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); 
if (isValidURL) { 
    <a href="<%=encoder.encodeForHTMLAttribute(userURL)%>">link</a> 
} 

と:

String name = (String) request.getParameter("name"); 
name = ESAPI.validator().getValidInput("name ", name , "SafeString", 35, true); 
関連する問題