2

私は WebApp プログラミングが初めてで、javax.servlet.http.HttpSession.getAttribute()インターフェイス メソッドを呼び出して取得したデータを検証しないことのセキュリティへの影響を理解しようとしています。この潜在的な脆弱性にフラグを立てたセキュリティ コード スキャナを使用しています。

原則として、信頼されていないソースから取得したデータを常に検証する必要があることはわかっていますが、セッションの内容が信頼できない理由が理解できないと思います。HttpSession.setAttribute()これは、データをセッションに追加できる唯一の方法は呼び出すことであり、同じアプリケーションのスコープ内にある信頼できるコードのみがそれを実行できるはずであるという私の (おそらく不当な) 仮定に基づいています。

私が本当に求めているのは、攻撃者が HttpSession から取得したデータの検証に失敗したアプリケーションをどのように悪用するかということです。実装が不明であり、セッションの内容が (セッション ID を除いて) HTTP 要求のデータから何らかの方法で構築されていないため、改ざんの対象となることを保証できないためですか? それとも、セッションの内容を信頼するということは、セッション ID を暗黙的に信頼することを意味するためでしょうか。(ただし、そのためには、攻撃者は侵害されたデータを含む別のセッションを作成する何らかの手段を持っている必要があるようです)。

セッションのコンテンツがリクエストのデータから構築されていないと仮定すると、この脆弱性が悪用される唯一の方法は、攻撃者が不正なセッションを作成できる別の脆弱性がある場合ですか? たとえば、実行可能コードをアップロードし、サーバーにそれを実行させ、キャプチャして再生されるセッション ID を返すようにしますか?

どうも

4

3 に答える 3

0

フォームからもセッションにデータを追加できます。リクエストは、必ずしもフォームからではなく、別のサーブレット/アプリケーションから送信される場合があります。SQL インジェクション用の SQL ステートメントをフォーム/サーブレットに設定し、それをサーブレットに転送するのは簡単です。これは私が考えることができる単なる可能性です。そうは言っても、セッション属性の検証を思い出したことはありません...これまでに!

于 2012-11-16T19:07:23.807 に答える
0

HttpSession に信頼できないものを何も入れない限り、HttpSession のデータを検証する必要はありません。HttpSession は、要求時に webapp 用に作成され、サーブレットまたは JSP のいずれかに追加したもののみを含める必要がありますが、追加のフレームワークを使用している場合は間接的である可能性があります。

個人的には、取り出したときに後で再度検証する必要があるものを HttpSession に入れないようにします。単純なサーブレット コンテナー環境では、セッションを更新するのは独自のコードだけになります (タイムアウトした場合にコンテナーがセッションを自動的に削除する場合を除く)。

自動的に HttpSession に何かを追加するフレームワークを使用しておりそれらがサニタイズされずにユーザーから直接提供された可能性がある場合を除き、問題はありません。あなた自身のコードが現在、信頼できないものを HttpSession に入れている場合は、それを行わないように変更します。

この点に関して、JSP は違いがないことに注意してください。JSP、コンパイルされるとサーブレットになります。サーブレットが HttpSession に入れるものを信頼するなら、JSP がそれを使って行うことも信頼できるはずです。(結局のところ、それらはあなたのJSP です。)

Re 「実装が不明であり、セッションの内容が (セッション ID を除いて) HTTP 要求内のデータから何らかの方法で構築されていないため、改ざんの対象となることを保証できないためですか?」. サーブレット仕様には、これを強制または許可するものは何もありません。いいえ、これは理由ではありません。

「それとも、セッションの内容を信頼するということは、セッション ID を暗黙的に信頼することを意味するためでしょうか。これは侵害され、間違ったセッションを指している可能性があります。」「間違ったセッション」についてはわかりません。ただし、(意図したユーザー以外の) 誰かがセッション ID (JSESSIONID) を取得すると、そのユーザーは本質的意図したユーザーになり、ユーザーが実行できることはすべて (問題の Web アプリケーションの機能内で) 実行できます。これは、侵害されたデータがセッション、データベースなどから来ているかどうかに関係なく当てはまります。

一般的なサーブレット/MVC/JSP アプローチは、ユーザーを (何らかの手段で) ログインし、その時点で、そのユーザーの最小限の表現を含む HttpSession をユーザーに作成することです (たとえば、ユーザー ID、名前などを含む UserLogin POJO、等)。それ以降、webapp はこの情報が有効であることを信頼し、それを使用してユーザーを識別します。たとえば、HTTP 要求が JSESSIONID とともに到着し、HttpSession にマップされ、セッション内のデータ (UserLogin POJO) にマップされ、要求元を識別します。 webapp 内から基礎となるシステムへの呼び出し (データベース呼び出しなど) を行うときのユーザー。HttpSession および UserLogin セッション データがない場合、ユーザーがログインしていないことを示します。これは Web アプリケーションでは非常に一般的であり、JSESSIONID とそれがマップする HttpSession を信頼できるかどうかに依存します。

ところで (誰かが上記の JSP について言及したので) 私は JSP がセッションに触れる webapp を書きません - MVC ベースのサーブレットによって提供されたデータをレンダリングするように JSP を制限します。

(選択肢があれば、JSP をまったく使用しません。JSP はかなり扱いにくく、構文が見苦しく、他にも多くの制限があります。たとえば、JSP を使用して、HTML ページではなく電子メールのテンプレートを作成してみてください。 、たくさんのフープを飛び越えることなく。Velocity などの使用を検討してください。)

于 2013-07-31T12:54:29.473 に答える
0

おそらくユーザーがデータを入力すると、ユーザーが何を入力したか、または何らかのクライアント側の検証があったかどうかを確認できないということだけだと思います。リクエストで受け取ったものに基づいてやみくもに関数を呼び出すと、セキュリティ上の問題が発生する可能性があります。たとえば、ユーザーが入力した顧客 ID の顧客情報を取得する前に、ID が有効であることと、ユーザーがデータを表示する権限を持っていることを確認してください。

于 2012-11-16T19:00:37.460 に答える