XSS入門:反射型・蓄積型・DOM型と対策
XSSのソースとシンクを見つける
この回でやること
XSSのソースとシンク、つまり文字が入ってくる場所と、HTMLやJSとして解釈される場所を一覧にし、経路を逆にたどって探す手順を身につけます。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
ソースとシンクは、利用者の文字が入ってくる場所と、その文字がHTMLやJSとして解釈される場所を指す言葉です。この回は3つの型に共通するこの2つを一覧にし、つなぎ目を探す手順に組み直します。
読み終えるころには、DevToolsのどの画面で何を検索すれば経路を追えるかを、手順として言えるようになります。
ソースとシンク
ソースは、利用者が中身を左右できる入口です。検索欄の q、URLのパスや #、フォームの入力、Cookie、保存されたレビュー本文、別のAPIから返るJSONなどが当たります。
シンクは、渡した文字列がHTMLやJavaScriptとして解釈される出口です。innerHTML、document.write、要素の属性への出力、<script> の中、eval などが当たります。
XSSは、あるソースからあるシンクまで、文字が文脈に合わせて変換されずにつながったときに起きます。前回までの3つの型は、このソースとシンクの組が違うだけです。反射型は検索語から応答本文へ、蓄積型はレビュー本文から表示へ、DOM型は location.hash から innerHTML へ、という具合です。
探し方の手順
つなぎ目を見つける手順は次のとおりです。
- 画面のどこに、利用者由来の文字が出ているかを挙げる
- それが本文の中、属性の中、JSの中のどれとして出ているかを見る
- ソースからその出口まで、文脈に合わせた変換が挟まっているかを確かめる
出口から逆にたどるのが速いです。危ない語を探すのではなく、利用者由来の文字が変換されずに解釈される場所を探します。
<script> という文字列を禁止語として探しても、<img> の属性や javascript 形式など別の書き方はいくらでもあります。探すのは語ではなく、ソースからシンクまで変換が挟まっていない経路です。SQLインジェクション編で、危ない語ではなく連結の形を探したのと同じ見方です。
手を動かす
練習用のショップで、検索欄やレビューに自分にしか分からない印を入れ、DevToolsのElementsでその印がどのタグの中に出るかを検索します。次にSourcesで innerHTML や document.write を検索し、そこへ利用者由来の値が届いていないかを読みます。ソースとシンクを表に書き出すと、点検の抜けが減ります。