XSS入門:反射型・蓄積型・DOM型と対策
反射型XSS
この回でやること
反射型XSSを、検索欄に送った文字がその応答に跳ね返って解釈される形として見ます。細工したURLを踏ませて成立することと、直す向きを扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
反射型XSSは、リクエストで送った文字列がその応答HTMLにそのまま埋め込まれ、タグとして解釈される形です。3つの型の1つ目で、題材は練習用のショップの検索欄です。
読み終えるころには、検索欄に何を入れて応答のどこを見れば、この形の入口を確かめられるかが分かります。
送った文字が、その応答に跳ね返る
反射型は、リクエストで送った文字列が、そのリクエストの応答HTMLにそのまま埋め込まれて解釈される形です。サーバーには保存されません。1回のやり取りの中だけで完結します。
検索欄は /search?q=... に問い合わせ、応答に検索語を出します。
HTML
<h2>「red shoes」の検索結果</h2>q に red shoes を入れれば上のようになります。ここに q としてスクリプトのタグを入れると、応答はこうなります。
HTML
<h2>「<script>...</script>」の検索結果</h2>q の中身がタグとして解釈され、書いたスクリプトが動きます。
どうやって被害者に届くのか
保存されないので、攻撃者は被害者にそのURLを踏ませる必要があります。攻撃コードを q に仕込んだリンクを作り、メールやSNSで送って開かせます。被害者が踏むと、そのサイトのページとして攻撃者のJSが動きます。ログイン中なら被害者として要求を送れますし、Cookieが読めればそれを読み出して外部へ送ることもできます。
反射型は保存されないぶん、被害者が細工されたURLを開いた瞬間だけ成立します。だれでも一律に、ではなく、リンクを届けて踏ませた相手が対象です。ここが次回の蓄積型との分かれ目になります。
見つけて直す
練習用のショップの検索欄に <b>test</b> と入れ、結果の見出しで太字になるか、文字のまま出るかを見ます。太字なら q がHTMLとして解釈されています。DevToolsのNetworkで応答本文を開くと、送った q がそのまま入っているのが読めます。直す方向は、q を見出しに出す瞬間に、文脈へ合わせて不等号などを変換することです。具体は出力エスケープの回で組み立てます。試すのは自分が権限を持つ練習用の環境だけにします。