web-dev-qa-db-ja.com

HTTPヘッダーまたはクエリパラメーターを使用してHTTP動詞トンネリングの使用を無効にする方法

攻撃者の要求は、GETやPOSTなどの信頼できるHTTP動詞を使用しますが、X-HTTP-Method、XHTTP-Method-Override、X-Method-Overrideなどの要求ヘッダー、または_methodなどのクエリパラメーターを追加して、制限付き動詞を提供しますPUTやDELETEなど。このような要求は、実際のHTTP動詞の代わりに要求ヘッダーの動詞を使用して、ターゲットアプリケーションによって解釈されます。

これを制限するために私が考え出したのは、次のエントリをweb.xmlに追加することです。

<security-constraint> 
    <web-resource-collection> 
        <web-resource-name>WhiteList_Http_Verbs</web-resource-name> 
        <url-pattern>/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
        <http-method-omission>POST</http-method-omission>
    </web-resource-collection> 
    <auth-constraint/>
</security-constraint>

これらのエントリによると、私のアプリケーションはすべてのURLパターンに対してGETおよびPOST=リクエストのみを許可し、他のすべてのHTTPメソッドを制限します。

セキュリティ制約は、省略で指定されたメソッドを除くすべてのメソッドに適用され、制約は、制約のパターンに一致するリソースにのみ適用されます。

私の質問:

  1. この場合、それはメソッド/動詞HEAD上記の特別なリクエストヘッダーを介して)を防ぐのでしょうか?

  2. これらのエントリは、X-HTTP-Method、XHTTP-Method-Overrideなどのヘッダーを使用した動詞トンネリングの使用を無効にしますか?

  3. または、これが適切な修正ではない場合、この問題を防ぐために何をすべきですか?

2
Afgan
  1. 構成例では、この構成を持つサーバーが動詞をまったく受信していると想定して、HEAD動詞の使用をブロックする必要があります(たとえば、HEADリクエストを偽装する奇妙なプロキシ設定がある場合GETを呼び出してから本体を削除すると、何の効果もありません)。

  2. いいえ、他のヘッダーは引き続き存在します-サーバーは、他のヘッダーがアプリケーションによって動詞として扱われることを知りません。この方法で渡された他のメソッドの使用を防止したい場合、最良のオプションは、アプリケーションがHTTP動詞として解釈できるヘッダーを削除することです。アプリケーションによっては、一部の機能が壊れる可能性があります。削除機能に動詞を渡すこのメソッドを使用したり、レコードの変更を許可したりするアプリケーションを見てきました。

あなたの説明から、問題はHTTP動詞の使用にあるのではなく、アプリケーションがそれらに関連するアクションの実行を許可する方法にあるように思われます。アプリケーションについてこれ以上知識がないと言うのは難しいですが、アクションを実行する特定の方法をブロックすることは、適切な承認が提供されない限り、アプリケーション内でアクション自体をブロックするよりも効果的でない可能性があります。

2
Matthew