0 / 7
格納型XSS
攻撃者が掲示板にスクリプトを書いておき、後でその投稿を開いた被害者のブラウザで実行させようとしている場面である。このようにWebページにスクリプトを挿入して他人のブラウザで実行させる攻撃がXSSである。3種類は、そのスクリプトを挿入する側が異なる。格納型では、サーバーが保存しておいた投稿から取り出して挿入する。
例: 攻撃者が掲示板にスクリプト入りの投稿をし、後で被害者がその投稿を開く。
スクリプトを挿入する側: サーバー(保存された投稿から)
1 / 7
攻撃者: スクリプト入りの投稿をする
攻撃者が掲示板に投稿しながら、内容の欄にクッキーを盗むスクリプトを書く。サーバーはそれをコードではなく投稿の内容としてだけ受け取る。
2 / 7
サーバー: 投稿を保存
サーバーは内容を検査せず、投稿をそのまま保存する。スクリプトがサーバーに残ったが、まだ被害を受けた人はいない。
3 / 7
被害者: 投稿を開く
被害者がいつものように投稿を開くようサーバーに要求する。被害者に落ち度はない。
4 / 7
サーバー: 保存された投稿をページに挿入
投稿のページは、要求が来るたびにサーバーが新しく作る。サーバーは被害者に送るページの基本の枠(HTML)の中に、保存された投稿をそのまま挿入する。その投稿に攻撃者のスクリプトが入っているので、できあがったページにもスクリプトが入る。スクリプトを挿入する側はサーバーである。
5 / 7
サーバー → 被害者: ページを送る
サーバーが完成したページを被害者に送る。ページの中にスクリプトが入っている。
6 / 7
被害者のブラウザ: スクリプトを実行
被害者のブラウザは、ページの中でスクリプトに出会うと実行する。誰が入れたスクリプトかは分からない。サイトが送ったページの中のコードなので、サイトと同じ権限で実行される。そのため、スクリプトから読めるクッキーも読める。
7 / 7
被害者 → 攻撃者: クッキーを送る
スクリプトが被害者のクッキーを攻撃者に送る。攻撃者はそのクッキーで被害者になりすましてログインする。その投稿を開く人全員に同じことが起こる。
1 / 7
攻撃者: 悪意のあるリンクを作る
攻撃者が検索アドレスの検索語の位置にスクリプトを書いてリンクを作る。サーバーには保存せず、リンクの中に持たせておく。
2 / 7
攻撃者 → 被害者: リンクを送る
攻撃者がリンクをメールやメッセンジャーで被害者に送る。アドレスを短縮したり文字を書き換えたりすると、スクリプトは目立たなくなる。
3 / 7
被害者: リンクを押す
被害者がリンクを押すと、ブラウザがサーバーに検索を要求する。要求の検索語の位置にスクリプトが入っている。
4 / 7
サーバー: 検索語をページに挿入
検索結果のページも、要求が来るたびにサーバーが新しく作る。サーバーは被害者に送るページの枠の中に、要求で受け取った検索語をそのまま挿入する。その検索語に攻撃者のスクリプトが入っているので、できあがったページにもスクリプトが入る。要求が応答としてそのまま返ってくるので、反射型と呼ぶ。スクリプトを挿入する側はサーバーである。
5 / 7
サーバー → 被害者: ページを送る
サーバーが結果ページを被害者に送る。ページの中にスクリプトが入っている。サーバーはこの検索語を保存せず、応答にだけ使う。
6 / 7
被害者のブラウザ: スクリプトを実行
被害者のブラウザが結果ページのスクリプトを実行する。サイトが送ったページなので、被害者のクッキーも読める。
7 / 7
被害者 → 攻撃者: クッキーを送る
スクリプトが被害者のクッキーを攻撃者に送る。格納型と違い、リンクを押した人にだけ起こることである。
1 / 7
攻撃者: 悪意のあるリンクを作る
攻撃者がサイトのアドレス末尾の # の後ろにスクリプトを書いてリンクを作る。
2 / 7
攻撃者 → 被害者: リンクを送る
攻撃者がリンクをメールやメッセンジャーで被害者に送る。
3 / 7
被害者: リンクを押す
被害者がリンクを押すと、ブラウザがサーバーにページを要求する。アドレスの # より後ろは、ブラウザがサーバーへ送らない。そのためサーバーは、スクリプトがあることすら知らない。
4 / 7
サーバー → 被害者: いつものページを送る
サーバーはいつも送っているページをそのまま送る。スクリプトはない。スクリプトはサーバーに届かない # の後ろにあるので、サーバーが入力をどれだけ丁寧に検査しても、この攻撃は防げない。
5 / 7
被害者のブラウザ: アドレスの文字をページに挿入
サーバーが送ったページはすでに被害者のブラウザに届いて開いている。その中に元から入っていたJavaScriptが、アドレスの # より後ろの文字を読み取ってページに挿入する。その文字に攻撃者のスクリプトが入っているので、開いているページにもスクリプトが入る。スクリプトを挿入する側はサーバーではなくブラウザである。反射型と分かれる点がまさにここである。
6 / 7
被害者のブラウザ: スクリプトを実行
ブラウザが挿入されたスクリプトを実行する。スクリプトはサーバーを一度も通らず、アドレスから直接ブラウザのページに入った。
7 / 7
被害者 → 攻撃者: クッキーを送る
スクリプトが被害者のクッキーを攻撃者に送る。サーバーのリクエスト記録には、アドレスの # の後ろは残らない。
1 / 6
攻撃者: 同じ投稿をする
攻撃者が格納型のときとまったく同じ投稿をする。内容の欄にクッキーを盗むスクリプトが入っている。
2 / 6
サーバー: 投稿を保存
サーバーは投稿をそのまま保存する。この図では投稿がページに文字としてだけ出力されるので、スクリプトが保存されていても被害は出ない。防ぐ要は、保存するときではなくページに入れるときに文字を置き換えることである。
3 / 6
被害者: 投稿を開く
被害者がいつものように投稿を開くようサーバーに要求する。
4 / 6
サーバー: 文字を置き換えてページに挿入
サーバーは保存された投稿を被害者に送るページの枠に挿入する前に、< を < に、> を > に置き換える。そのため投稿の中の <script> が <script> になる。挿入するのは今もサーバーだが、今はコードではなく文字を入れる。
5 / 6
サーバー → 被害者: ページを送る
サーバーがページを被害者に送る。ページには <script> ではなく、<script> という文字が入っている。
6 / 6
被害者のブラウザ: 文字として表示
被害者のブラウザは < を、コードの始まりではなく < という文字として画面に表示する。スクリプトは実行されず、投稿にコードが文字のまま表示されるだけである。クッキーは攻撃者に渡らない。