安全なwebアプリケーションの作り方 158-183
- 🍪などにセッションidを記憶させて、これをキーにしてひっぱってくるセッション管理機構が主流
- セッションハイジャック
- セッションIDを悪用してなりすますこと!
- セッションIDの推測:連番とか、OSSで生成ロジックが公開されてるとかはヤバイ。でも時間かけて解読される可能性はある。←これどれでもそうだよね?それにどれぐらい時間かけさせるかがセキュリティのキモなんじゃないの?
- セッションIDの盗み出し:🍪属性不備(前やった)/ネットワーク経由/XSSなどの脆弱性/プラットフォームの脆弱性/Refererから(前やった)
- →いやこれ多すぎじゃね? XSS/HTTPヘッダインジェクション/URLに埋め込みとかが盗む典型っぽい👿
- セッションIDの強制:前やったけどよくわかってないかも。セッションID固定化攻撃!あとで対策とか読む。
例えば、下記のURLのように、明示的にPHPSESSIDパラメータを付けてリクエストを送ってみる。
http://foo/bar.php?PHPSESSID=3333
すると、このリクエストに対する応答のヘッダには下記の内容が含まれる。
Set-Cookie: PHPSESSID=3333; …
つまり、ブラウザから与えた値がセッションIDとして採用されてしまう。
攻撃者は上記のセッションIDを仕込んだハイパーリンクをクリックさせることによって、被害者を罠にかけることができる。このセッションIDが使われたままユーザがログイン手続きを行うと、攻撃者もそのユーザのプライベートなページを見て回る機会を得る。
- なるほどなぁ、これはすごい納得出来たかも
- セッションハイジャックの原因は多様で個別対応する👼
- 推測可能なセッションID
- 自分で作らない!!!実績ある言語などが提供しているものを使うべき!!!暗号アルゴリズムと一緒
- (1) 攻撃対象からセッションIDを集める (2) 規則性の仮説をたてる (3) 推測したものを試す
- ユーザID/メアド/リモートIPアドレス/日時/乱数を生成に使う場合が多い。組み合わせとかエンコードとかハッシュ値されることもある。
- ユーザIDと日時は外部から推測可能なので🙅
- セッション取れるからなりすましは出来るけど、パスワードとかはわからないので、再認証要求とかである程度被害軽減出来る(前やった!)
- 現実的で効果的な対策:あらかじめ提供されているセッション管理機構使え!!!
- どうしても作らないといけない場合は暗号ロン的擬似乱数生成器とかで、十分な桁数のセッションIDを生成する
- 自作するときはSQLインジェクションとか、ディレクトリ・トラバーサル脆弱性にも気をつけよう! ディレクトリ・トラバーサルと対策 | Webセキュリティの小部屋
- URL埋め込みのセッションID
- セッションIDの固定化
- さっきの記事の通り
- ログイン後にセッションIDを変更するとかで攻撃者にわからなくさせる
- いま気付いたけど、ログインIDというか認証情報とセッションID誤認してたかも。全然違うわ
- 認証とか関係なしに、たとえばユーザ登録とかの場面でもこの攻撃出来て、ユーザが入力した時点でサーバの🍪に残るから、別のところでガン待ちしてれば情報が盗める。
- ただなりすましして権限使ってるわけじゃないから、情報漏えいだけで防げる………とも言える
- 知らないセッションIDを受け入れる設定でも受け入れない設定でも、結局適当なの作ってそれつかって攻撃すればいいから、攻撃し放題😢
- URLじゃなくて🍪に情報保存してても、ブラウザとかwebappに脆弱性があれば攻撃出来る。前やった!
- クッキーモンスター問題:ドメイン属性が制限されなかったりするやつ クッキーモンスター問題とは | 日立ソリューションズの情報セキュリティブログ
- XSS
- HTTPヘッダインジェクション:まあちゃんとURLエンコードしましょうみたいなやつ 【HTTPヘッダインジェクション】の仕組みと対策のまとめ記事
- 脆弱性が生まれる原因っていっぱいあるんだけど、全部対策するのは不可能??だし修正予定もなかったりするから(!!!IE!!!)、これはもう許容して、ハイジャックされないように気をつけるのがよい。認証の後セッションID変更するとか!
- ものによっては明示的に変更できないので、トークンを🍪とセッション変数両方に記憶→比較→同じならおk、みたいな感じ
- これが外部に出るタイミングはログイン時の🍪生成のときだけなので、攻撃者はわからないので防げる。
- トークンは予測困難性とかが必要で、秘密の国のアリスでやったようなアレが必要
- ただ、↑のはログイン後の対策で、ログイン前の対策ではない。ログイン前はhiddenパラメータで値を回すのが現実的!
- セッション管理機構を自作するな
- クッキーにはセッションID保存しろ、情報保存するな
- 認証成功したらセッションID変更しろ
- 認証前はセッション変数に情報保存するな