親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

XSSってどうやって仕込まれる?


XSSについて

このページを閲覧している方ならご存知とは思いますが、まずはXSSについて超簡単に説明します。

この事象は入力フォームがある画面が狙われるものですが、Javascriptのタグを攻撃者によって画面上に埋め込まれ、ユーザ情報やcookieのセッションが盗まれたり(セッションハイジャック)するセキュリティの脅威です。
inputのtextやtextareaに対策を施さないと発生してしまいます。

以下のページが参考になりますね。

情報処理推進機構:情報セキュリティ:脆弱性関連情報の取扱い:知っていますか?脆弱性 (ぜいじゃくせい)/2. クロスサイト・スクリプティング

どうやってタグを入れられる?

XSSは不正なタグを混入されることで発生する脅威ですが、そもそもどのように混入されるのでしょうか?

サーバ情報を盗まれてソースを書き換えられて起きるのでしょうか?
もしソースを書き換えられるくらいであれば、DBにもアクセスできるでしょうし、わざわざこんな回りくどいやり方はしませんよね。

方法としては、GETパラメータにスクリプトを入れる方法やスクリプトをPOSTさせる方法があります。



GETパラメータにスクリプトを入れる方法

Webアプリケーションの設計にもよる部分なのですが、例えばフリーワード検索ができる検索画面を考えてみましょう。
今回は居場所というワードで検索するとして、GETパラメータの「freeWord=%5B"居場所"%5D」の箇所に検索したフリーワードが入る仕様になっているとします。

ここに、

freeWord=%5B"<script>alert('テスト')</script>"%5D

のようにスクリプトが混入されたらどうでしょうか?
上記のページでは対策をしているので何も起きませんが、何も対策を施していないサイトであれば、普通に「テスト」と表示されるアラートが出てきてしまいます。

でも攻撃者が自分でそんなスクリプトを入力しても、有用な情報は得られないんじゃない?と思われるかもしれませんが、実際にこのスクリプトが入力された状態でアクセスするのは、攻撃者ではなくサイトのユーザになるのです。
しかもこんな簡単がスクリプトを埋め込むわけではありません。

具体的な例としては、攻撃者がフリーワード欄にスクリプトが入っているリンクを用意し、適当なサイトに貼っておくのです。
何も知らないユーザがそれをクリックすると、スクリプトが埋め込まれた状態で遷移することになり、悪意のあるスクリプトが実行されてしまいます。

もしユーザが遷移先のサイトにログインしたままの状態で、cookieを取得するようなスクリプトが埋め込まれていたらどうでしょう?
cookieにはセッション情報が格納されている場合があるので、セッションが抜き取られてしまいます。(いわゆるセッションハイジャック)

また、個人情報を入力するようなページで、他のページに入力値をPOSTするようなスクリプトを埋め込まれてしまったらどうでしょう?
個人情報があっさり取られてしまいますね。

POSTでスクリプトを埋め込まれる方法

次にPOSTでの埋め込み方法ですが、掲示板サイトを想像してみてください。
一般的な掲示板サイトでは、入力した文章は即掲示板に表示されますよね。

例えば以下のようなスクリプトをコメントとして入力した場合も、即スクリプトが表示されます。

<script>alert('テスト')</script>

何も対策がされていないサイトだと、そのスクリプトが実行されてしまうため、今後その掲示板にユーザが訪れる度に悪意のあるスクリプトが実行されてしまうのです。
今回の場合だと、開くたびに「テスト」というスクリプトが表示されますね。

これも上記のようにセッションハイジャックや個人情報の取得などに繋がる可能性があるので要注意です。



まとめ

GETの場合とPOSTの場合のそれぞれでXSSの説明はしましたが、あくまで一例にしか過ぎません。
とにかくユーザがinputやtextareaで何かを入力できるサイトは要注意です。

サーバサイドでもフロントエンドでも、最近のフレームワークを使えば基本的な対策は既にしっかりされているものが多いので、対策を入れるのを忘れてしまいがちになってしまいますが、本来のフレームワークの使い方と外れるような実装を一部使用する場合、未だに脅威は残ります。
例えばSPAサイトなのに一部サーバサイドレンダリングするような使い方とか...

対策方法については、また別で書こうと思いますが(ググればいっぱい出てきますw)、自分が運営しているサイトでこのような被害があると大事になりかねません。
サイト制作時には必ず対策が必要な脅威です。