Works by

Ren's blog

@rennnosuke_rk 技術ブログです

セッションに係る脆弱性とその対策① - セッションハイジャック

前日の記事では、ユーザがHTTPリクエストにパラメータを乗っける代わりに、セッションを活用する記事を書いた。 セッションを利用することで、クライアントが任意のデータを送信し、それに対応するデータの取得を防止できる(なりすましを防げる)。 但し、セッションを利用するサービスを運用する上で頭に入れておくべき有名な脆弱性があるので、復習を兼ねてメモ。

セッションを利用したパラメータの取得

今回も、オンラインショッピングサイトを例に取る。


f:id:rennnosukesann:20180206000502p:plain

クライアントはサーバに対して「カート情報を取得する」HTTPリクエストを送信する。サーバはクライアントからのリクエストを受け取った時、ユーザとのセッション情報からセッションIDを取得、セッションIDから対応するユーザIDを(予め用意したユーザIDテーブルなどから)取得しDBを叩く。

この仕組みによって、直接通信経路上でユーザIDがやり取りされない。また悪意あるユーザが第三者ユーザのIDを送りつけ、第三者のカート情報を取得することも防ぐ。

セッションハイジャック

セッションハイジャックとは、悪意ある第三者が、サービスを利用するユーザのセッションID盗む・推測し、そのIDを使って正規のユーザになりすます攻撃を指す。

ユーザIDが指定できなくとも、セッションIDがクライアント・サーバ間でやり取りされているので、結局元々あったなりすましの脆弱性がセッションIDのやり取りにすり替わったという話。

ユーザIDの場合、設計上整数値などわかりやすい値で扱われることが多いため、すぐに推測されやすい。 一方で、セッションIDはハッシュ値とすることで、推論によるセッションID偽装の可能性をユーザIDよりも低く抑えられる。

但し、一つのクライアントが常に同じユーザIDを使い続けていたり、ハッシュ値を使わず連番や生年月日を使ってしまうと、 当然推測が容易になってしまう。

また、通信経路の暗号化がなされていない場合、プレーンテキストが丸見えなため、セッションIDが盗まれやすくなってしまう。

セッションが盗まれることによるリスク

セッションIDが盗まれることで、悪意ある第三者がサービスのユーザの情報を盗み見ることができる。またログインをセッションを利用して行う場合、認証無しでアカウントを利用できる。例えば上記サービスであれば、メールアドレスや住所、電話番号等の個人情報の窃取や、実際に買い物をしてしまうことさえ可能になる。

セッションハイジャック対策

セッションハイジャックのヒガイを防ぐためには、セッションIDが漏洩しないこと、そして推測されないことが必須である。 セッションIDの漏洩を防ぐには、クライアント・サーバ間の通信の暗号化が必須である。また推測を防ぐためには、 簡易なセッションIDを使うのをやめ、ハッシュ値などの推測しにくい値をセッションIDとして使用するとよい。

まとめ

セッションフィクセーションなど、他のセッションに関する脆弱性についてもメモっておきたい。

TODO

  • 具体的なセッションID盗聴防止対策・推測防止対策