web-dev-qa-db-ja.com

「クエリで受け入れられるボディパラメータ」の脆弱性への対処

ヒューリスティックにより、クエリ文字列パラメーターをフォーム値として処理していると判断されたため、脆弱性評価に失敗しました(「本文パラメーター」という単語を使用していました)。

MVC(テクノロジー)は他のフレームワークと同様に、ルールに基づいてGETとPOSTをルーティングします。GETで実行されるメソッドは基本的にフォームから切り離されているため、これは誤検知であると思います。

また、AppScanは、「テスト応答」が「元の応答」に類似していることに基づいてこの失敗を判別したことを示しているようです。この問題を理解または解決するための情報をオンラインで見つけることができません。

4
Sprague

この脆弱性は「低い」と見なされ、 [〜#〜] cvss [〜#〜] スコア5.0です。ペンテストは既存のページを受け取り、送信の動詞を変更するだけで、フォームのペイロードをクエリ文字列に渡します。 Webサイトでエラーが発生した場合、または通常とは異なるページが表示された場合は、PASSです。 Webサイトが通常のページに実質的に類似しているページを返す場合、それはFAILです。

POSTリクエストのハンドラーは、さまざまな緩和策を備えていることがよくあります。たとえば、CSRFはGETではなくPOSTに実装されることがよくあります。動詞を変更することにより、攻撃者はチェックを回避できる可能性があります。これが問題であるかどうか知りたい場合は、 一般的な脆弱性データベース、ここ に例があります。

ActionName 属性を使用してGETおよびPOSTを別のメソッドにマップし、メソッドに別のフィルター(例:POST)がある場合、実際に脆弱性を持つ可能性があります。 AuthorizeAttribute があり、GETにはありません)。これはかなり深刻な見落としであり、この問題を閉じる前に修正する必要があります。

一方、この種のテストでは、特に投稿されたコンテンツがユーザーエクスペリエンスに直接影響を与えないページでは、誤検知が発生する可能性があります。

MVCサイトのこのレポートを見つけた場合は、アクションメソッドに動詞の制限があることを確認してから、アイテムを「誤検出」としてマークし、理由についてあまり考えずに次に進みます。 OPが説明したこと。

動詞の制限がない場合は、( HttpPostAttribute を使用して)追加するか、ページ/ハンドラーが機密性が低い、または脆弱性が低い理由を正当化する必要があります。 GETを介してアクセスした場合。

2
John Wu

この脆弱性は「低い」と見なされており、CVSSスコアは5.0です。ペンテストは既存のページを受け取り、送信の動詞を変更するだけで、フォームのペイロードをクエリ文字列に渡します。 Webサイトでエラーが発生した場合、または通常とは異なるページが表示された場合は、PASSです。 Webサイトが通常のページに実質的に類似しているページを返す場合、それはFAILです。

MVCを使用している場合は、安全な各メソッドに属性[HttpGet]または[HttpPost]を追加できます。つまり、GETとして要求され、メソッドにHttpPostとしてタグ付けした場合、このメソッドは応答しません。

0
Frank Marin

「身体パラメータ」は、少なくとも一般的ではない用語です。特定のフレームワークの用語であれば、それは完全に間違っているわけではありません。一般的なウェブ開発では、そのようなことはありません。

ここにセキュリティ上の欠陥があり、攻撃者はフォームに埋め込まれたSQLクエリをここに与えることができます。たとえば、次のようなクエリを想像してください。

SELECT 1 FROM users WHERE user='$_GET[user]';

攻撃者が文字列を与えた場合

anything'; UPDATE users SET password='cr4ck';

ユーザーフィールドに、スクリプト化されたGETまたはPOST=要求によって、すべてのパスワードを「cr4ck」に変更できます。

保護は非常に簡単です。ブラウザからデータベースに送られるものはすべてsql-quotedにする必要があります。使用しているフレームワークがこれを実際に好まない場合は、それほど簡単ではありません。たとえば、実際のSQLクエリが実行されるまで、コード内のすべての場所で変数を50回再生します。