XSS入門:反射型・蓄積型・DOM型と対策
蓄積型XSS(格納型)
この回でやること
蓄積型XSS(格納型)を、商品レビューに保存された文字が見た人すべてのブラウザで動く形として見ます。管理者まで巻き込む理由と直し方を扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
蓄積型XSS(格納型)は、送った文字がサーバーに保存され、あとでその画面を開いた人のブラウザで解釈される形です。題材は練習用のショップの商品レビュー欄です。
この回を終えると、レビュー1件がどこまで届き、だれの権限で動くのかを追えるようになります。
保存され、見た人全員で動く
蓄積型は、攻撃者の文字列がいったんサーバーに保存され、その画面を開いた利用者のブラウザで解釈されます。レビュー欄に書き込んだ本文は、投稿後にその商品ページを開く人すべてに表示されます。ここに文字ではなくスクリプトを書けば、開いた人全員のブラウザで動きます。
HTML
<div class="review"><b>test</b></div>レビュー本文に <b>test</b> と書いて保存し、ページを開き直すと太字で出ます。太字になったなら、レビュー本文がHTMLとして解釈されています。
反射型より広く、深く届く
前回の反射型は、リンクを踏ませた相手だけが対象でした。蓄積型は、URLを踏ませる必要がありません。保存された1件が、その商品ページを開く人すべてに届きます。
さらに、店の注文やレビューを確認する admin も、その画面を開けば同じスクリプトを踏みます。tanaka が書いた1件が、管理画面を見た admin のブラウザで admin の権限で動く、ということが起こり得ます。届く範囲が広く、巻き込む相手の権限も高くなりがちです。
スクリプトは、書いた人の権限ではなく、それを開いた人のブラウザで、その人の権限で動くからです。保存した本人が弱い権限でも、閲覧した側が強ければ、強いほうが動きます。
見つけて直す
練習用のショップでレビューに <b>test</b> を投稿し、別のアカウントで同じ商品を開いて再現するかを見ます。再現すれば蓄積型の穴です。直す方向は、保存する文字はそのまま保存しておき、表示するその瞬間に文脈へ合わせて変換することです。保存の段で文字を取り除くと、価格 < 3000 のような正規のレビューまで壊れます。試すのは自分が権限を持つ練習用の環境だけにします。