XSS入門:反射型・蓄積型・DOM型と対策
DOM型XSS(DOM Based XSS)
この回でやること
DOM型XSS(DOM Based XSS)を、サーバーを通らずブラウザ内のJavaScriptが文字列をHTMLにする形として見ます。反射型・蓄積型との違いを扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
DOM型XSS(DOM Based XSS)は、ブラウザ内のJavaScriptが利用者の値をHTMLとして書き出すときに起きる形です。反射型・蓄積型との違いは、文字列がどこでHTMLになるかです。
最後まで読めば、DevToolsのどの画面を開けばこの型の穴が見えるかが分かります。
サーバーを通らずに起きる
DOM型は、ブラウザの中で動くJavaScriptが、利用者の操作できる値を読み、それをHTMLとして書き出すときに起きます。前の2回との違いはここです。反射型・蓄積型ではサーバー側でHTMLに文字列が入りました。DOM型では、サーバーが返すHTMLは固定で、そのあとブラウザ内のJSが文字列をHTMLに変えます。文字列がHTMLになる場所が、サーバーからブラウザへ移っています。
練習用のショップの商品ページに、URLの # 以降を読んで「おすすめ」を差し込むJSがあるとします。
JavaScript
const tag = location.hash.slice(1);
box.innerHTML = "おすすめ " + tag;location.hash は利用者がURLで自由に決められます。# に画像タグを使った細工を入れると、innerHTML がそれをHTMLとして書き出し、読み込み失敗をきっかけにスクリプトが動きます。
Networkを見ても見つからない
DOM型が厄介なのは、サーバーの応答が正常なままだという点です。# 以降はサーバーへ送られないことも多く、応答本文をいくら読んでも攻撃コードは出てきません。
反射型・蓄積型は応答本文に痕跡が残りますが、DOM型は残りません。DevToolsのElementsで組み上がった後のDOMを見て、Sourcesで innerHTML や document.write に利用者由来の値が渡っていないかを読みます。探す場所が、応答からブラウザ内のコードへ移ります。
見つけて直す
練習用のショップで、URLの # に <b>test</b> を入れて開き、おすすめ欄が太字になるかを見ます。太字ならDOM型の穴です。直す方向は、innerHTML で書き出すのをやめ、文字として出す textContent に替えることです。具体は安全なDOM APIの回で扱います。試すのは自分が権限を持つ練習用の環境だけにします。