web-dev-qa-db-ja.com

POSTリクエストに対するWebサーバーからの典型的な応答は何ですか?

POST=リクエストを送信した後、私のWebサーバーは200 OKを返しますが、セキュリティチームによると、それは良い考えではないようです。

機密情報のキャッシュを回避するために、302「オブジェクト移動」を返す必要があります。

「POSTリクエストを通じてフォームが機密データを送信する場合、サーバーはユーザーを別のページにリダイレクトするために302「オブジェクト移動」応答を返す必要があります。これにより機密情報のキャッシュが回避されます。」

私にとって、HTTPステータスコードを返すのは、実際には、Webアプリケーションと、それが使用しているフレームワーク、およびその設計方法次第です。

すべてのPOSTリクエストの結果が302になるかどうかがわかりません。リダイレクトを行う代わりにWebサイトにログインすると、200 OKが返されます。

POST SSLを介したリクエストを介して実行している限り、問題は発生していません。これについて教えていただけますか?

3
DoodleKana

質問は、選択されたHTTP応答メソッドを扱うように見え、それがキャッシングに影響を与えます。その質問に対する答えについては、以下の「POSTキャッシング」を参照してください。

コメントによるOPの明確化は、セキュリティチームがブラウザがフィールドフォームに入力された値を記憶することに関係していることを示唆しているため、「戻る」または「オートコンプリート」の使用にアクセスできます。これは、サーバーが発行することを選択したHTTP応答とはまったく無関係です。リダイレクトを使用しても、情報に戻るために必要な「戻る」クリックの数が増えるだけです。

HTMLフォームのオートコンプリート属性 および HTML入力オートコンプリート属性 は、ブラウザに入力された値を記憶しないよう要求するために使用されます。ただし、これらは禁止事項ではなく要求です。ブラウザは好きなことをすることができ、これらのタグを無視または誤って解釈し、興味のあるものはすべて対象から除外することが知られています。たとえば、Chromeには、 "off"が機能しないが "false"が機能する というものがあります

だから-それを助けるためにあなたができることはあるが、それを制御することはできない。そして、200ではなく302はそれらの1つではありません。


POSTキャッシング

A POST 200応答の場合、応答内の追加のHTTPヘッダーが明確に要求しない限り、キャッシュされません。 を参照してください。POST HTTPのメソッド? StackOverflowから; RFC 2616 の引用を引用するには:

9.5投稿

...

このメソッドへの応答は、適切なCache-ControlまたはExpiresヘッダーフィールドが応答に含まれていない限り、キャッシュできません。ただし、303(その他を参照)応答を使用して、ユーザーエージェントにキャッシュ可能なリソースを取得するように指示できます。

あなたのセキュリティチームは良い考えを持っていましたが、HTTPのアーキテクトが最初に同じ良い考えを持つことができたかどうかを尋ねることに失敗しました。

実際には、これは POST form submission -itへの応答であるページをリロードしようとするとブラウザがプロンプトを表示する理由ですブラウザが元の応答をキャッシュしなかったため、リクエストがサーバーに再送信されることを通知します。

IE resubmission warning

4
gowenfawr

セキュリティチームから報告された調査結果は有効であると私は理解しています。私も手動のアプリケーション評価でこれを確認したので、彼らが報告した可能性のあるシナリオについて説明します。

シナリオ1:たとえば、アプリケーションのログインページ、あるいはクレジットカードのアプリケーションフォームを取り上げます。すべてのフォームフィールドに入力し、[送信]ボタンをクリックすると、クライアントはPOSTリクエストでその機密データをサーバーに送信します。サーバーの応答が「200 OK」の場合、ブラウザはPOSTデータをブラウザのメモリに保持して、リプレイ攻撃を可能にします。以前の応答で述べたように、「戻る」ボタン、次に「進む」、次に「更新」を押すと、ブラウザが機密のPOSTデータを再送信します。多くの場合、以前に送信したデータを再送信しようとしていることを知らせるポップアップメッセージがブラウザーから表示されます。

シナリオ2:同じデータがPOSTリクエストを介してサーバーに送信されます。今回は、サーバーは300タイプのステータスコードで応答します。これは、次のページが何であるかにクライアントを送信する302リダイレクトである可能性があります。ただし、300タイプの応答を受け取ったクライアントブラウザは、POSTされたデータをブラウザのメモリに保持またはキャッシュしません。戻る、進む、更新の実験を繰り返すことはできず、以前にPOSTされたデータが再生されることを期待できます。これはすべてサーバーの応答に依存します。

Burpなどのローカルプロキシにアクセスできる場合は、これを自分でテストできます。プロキシを指すようにブラウザを設定します。脆弱なWebページにアクセスします。フィールドに入力して送信を押し、プロキシツールで送信されたリクエストを確認します。 POSTリクエストのデータセクションに機密データを含むさまざまなフォームフィールドが表示されます。サーバーの応答が「200 OK」であったとすると、次のステップに進みます。ブラウザで、[戻る]ボタンを押し、次に転送して更新します。以前に送信したデータを再送信することを警告するポップアップメッセージをブラウザから取得する必要があります。 OKを押します。次に、プロキシツールで最後のリクエストを確認します。 POSTリクエストと以前の同じ機密データが再送信されます。今、POSTされたデータへの302リダイレクトを返すWebサイトでこれと同じ実験を試してください。投稿されたデータをブラウザで再生することはできません。

それで、あなたが尋ねるかもしれないリスクまたは脅威は何ですか?何よりもまず、リプレイ攻撃です。最大の懸念はマルウェアであるはずです。 2番目に大きい脅威ベクトルは共有デバイスです。問題は、マルウェアまたはデバイスにアクセスできる人物がリクエストを「再生」し、POSTリクエストで送信された機密データを見ることができることです。マルウェアはブラウザのメモリから直接データを読み取るだけです。 POSTリクエストを再度表示するには、ツールを使用する必要があります。

***いくつかの警告:

* Autocomplete = offを使用すると、フォームフィールドストレージコンテナーにデータが保存されなくなります。これは独立しており、この問題には関係ありません。ただし、機密情報を受け入れるフォームフィールドでは、オートコンプリートを「オフ」に設定することをお勧めします。マルウェアは頻繁に保存されたフォームフィールドデータを頻繁に探して読み取りますが、これにはジューシーな情報が含まれているためです。

**キャッシュ制御ヘッダーを使用しても、ディスクにキャッシュされるページ(インターネットの一時ディレクトリ)のため、この問題には関係ありません。この場合も、キャッシュ制御ディレクティブを使用して、機密データがシステムにクリアテキストで格納されないようにする必要があります。

*** jsonリクエストでPOSTされたデータに対する「200 OK」応答は問題ではありません。サーバーが「200 OK」で応答したときにリプレイアタックを実行できない場所を考えることができるのは、私の頭の上の唯一のシナリオです。

お役に立てれば。攻撃経路の制限により、これは高評価の脆弱性としてリストされていないと思います。しかし、セキュリティオニオンの数え切れないほどの層の1つだけです!

1
Josey Wales

この問題を聞いたことがありますが、これは多くのWebアプリケーションでライブHTTPヘッダー拡張を使用して確認できるものです。実際には、ステータスコードとして200ではなく302を返します。ただし、組み合わせて使用​​する必要がある他のコントロール HTTP cache-control headers もあります。

SSLについて。転送中の資格情報を監視することで追加のリスクがないという点に言及するとき、あなたは正しいです。このソリューションが解決する問題は、初期の段階であるブラウザ自体です。 Webアプリケーションからログアウトし、戻るボタンを押して再ログインできる時期がありました。ブラウザキャッシュに認証資格情報が含まれ、再認証されたため、Webアプリケーションがセッションを破棄した場合でも、これは機能しました。したがって、これが解決する問題は、ブラウザを使用して誰も、以前に使用およびキャッシュされた資格情報で認証できないことです。

1
Zonk

別のサイトへのリダイレクトでは、フォームに入力されたデータをブラウザが忘れることはありません。履歴に戻った場合でも、再提出できます。機密データからブラウザを「クリア」しようとすると、とにかく疑わしいでしょう。攻撃者はこれらのデータにアクセスするためにブラウザの奥にいる必要があり、この場合、攻撃者はデータが入力されたときにすでにデータをキャプチャしている可能性があります。ページへの送信、またはサーバーへの送信。

1
Steffen Ullrich

他の回答で述べたように、リダイレクトでPOSTに応答しても、フォームの内容が記憶されないようにすることはできません。ただし、別の問題は解決されます-サーバーが200 "OK"の場合、ユーザーがページのリンクをクリックしてから[戻る]ボタンをクリックすると、ブラウザはフォーム全体を通知なしで再送信する場合があります。サーバーがPOSTにリダイレクトして返信した場合、その後、これは発生しません(ブラウザはリダイレクト先のページを再読み込みします)。

0
Brilliand