クロスサイトスクリプティング(XSS)とは?対策は?例を使って分かりやすく解説!
こんにちは。もちゃじです。
シリーズ三大脆弱性、3回目の今回は、クロスサイトスクリプティング(XSS)について解説します。超メジャー級の脆弱性。なんとなく名前を聞いたことがある人、そんなもん知らん、な人、一緒に勉強していきましょう。
余談ですが、担当もちゃじは初めてこの字面を見た時、スイーツを想像しました。「プティング」を「プディング」と見間違えたんですね。どこまでもカタカナに弱いもちゃじ……。
スクリプティングの「スクリプト」って?
まず、クロスサイトスクリプティング(長いので、次からXSSと表記しますね)について解説する前に、スクリプトを知っておかないと話が進みません。英語の意味のスクリプト(脚本、台本)ではなさそうですね。
英単語とIT用語は少し違うっていうあるある。用語の意味は、いちいち確認するのが良さそうです。案の定もちゃじは、ふんわりとした理解だったため勉強中も???ってなってました。そうならないように、先にスクリプトについて説明しますね。
スクリプトとは、簡単にいうと「簡易なプログラミング言語」のことです。
一般的なプログラミング言語の流れ
① コンピューターさんにしてもらいたい処理(ソースコード)を書いたら
② コンピューターさんが分かる言葉に変換(コンパイル)し、
③ ②の内容に従って、コンピューターさんが実行する
スクリプト(簡易なプログラミング言語)の場合
① コンピューターさんにしてもらいたい処理(ソースコード)を書いたら
② コンピューターさんが分かる言葉に変換(コンパイル)し、
③ ①の内容に従って、コンピューターさんが実行する
おお、めっちゃ簡単ですやーん。
難しいことはさておき(突っ込みがある場合は、もちゃじに分かるように教えてくださるとうれしいです)、スクリプトはソースコードがそのまま実行される=「人間がそのまま理解できる」んですね。これは分かりやすいし使い勝手がいい! ということは、悪さをするにも使い勝手がいいってこと……うん。
まあ、簡易な言語と言われていますが、複雑な処理だってできるんですよ、スクリプトは。例えば、JavaScriptやPHP、Perlもスクリプト言語です。
クロスサイトスクリプティングって?
さて、それを踏まえて本題のXSS。これは、Webサイトを悪用して、それを見た訪問者が被害にあってしまう攻撃、または攻撃されてしまう脆弱性のことです。複数のサイトをまたいで(クロスサイト)、スクリプトによって攻撃(スクリプティング)されます。(実際の攻撃はクロスサイトに限らないそうなので、実はちょっと曖昧っていうのはここだけの話)
XSSの仕組みを簡単にいうと
①悪意を持った人がWebサイト(掲示板など、訪問者が入力した内容を表示している)にイタズラする(スクリプトを仕込む)
②訪問者がWebサイトを閲覧する
③訪問者が被害に遭う
XSSの仕組みについては、こちらの記事で説明しています。先にご覧いただくのがおすすめです。
スクリプトによる攻撃って?
「スクリプトを仕込むこと」が、いまいちピンと来ないもちゃじ。お付き合いくださいね。
悪い人が「XSSの脆弱性があるWebサイト」にスクリプトを仕込みます。このWebサイトは誰でも書き込みができる掲示板としましょう。ブログやYouTube、Twitterなど、コメントが入力できますよね、ああいう場所のイメージです。
そのコメント入力欄にスクリプトを仕込みます。
簡単にいうとこのようなスクリプト。
<script>罠サイトに誘導してやるぜ</script>
これを書き込んで投稿すると、サーバーさんに保存されます。
もちゃじがその掲示板を見ると、サーバーさんがスクリプトをそのまま表示します。XSSの脆弱性があるので、スクリプトの処理が実行されてしまいます。
この悪い人が書いたスクリプト
<script>罠サイトに誘導してやるぜ</script>
掲示板上では、例えばこのようなウインドウに見えます。
OKボタンを押してしまうと、あらそこは罠サイト。掲示板サイトにそっくりに作られたサイトなので、もちゃじは気付かず。「ふむふむ、掲示板を見るためにはアンケートに答えるのね」と情報を入力する、という流れです。
罠サイトに来させてさえしまえば、あとは悪い人の独壇場です。罠サイトでパスワードを入力させたり、個人情報を入力させたりするなど手段はたくさんありますね。
ちなみに、真面目に「口コミ見るために、アンケートに答えてね OKボタン」をスクリプトで書くとこうなります。
<script>alert('口コミを見るために、アンケートに答えてね。'); location.href = "https://www.罠サイト.com";</script>
クロスサイトスクリプティング脆弱性の原因
なぜWebサイトでXSSの被害に遭ってしまうかというと、先ほどの例のように不正なスクリプトを入力できて、しかも実行できてしまう状態になっているからです。
例えば
- 入力フォームにスクリプト(HTMLのタグやJavaScriptなど)が入力された場合、内容をそのまま反映・処理してしまう(上の例ですね)
- Webサイトが入力値を制限していない
なるほど。攻撃できる状態になっているから、攻撃される。そりゃそうだ。
注意が必要なWebサイト
あらゆるサイトで注意が必要なのは大前提として、特に注意が必要なサイトは、ログイン画面や個人情報の入力画面などを持つサイトです。もうお気付きかと思いますが、スクリプトを仕込める場所があるからなんです。
XSSの脆弱性が起こりやすいとされているのは
- 会員登録やアンケートなど、入力内容を確認させる表示画面
- エラー表示
- 掲示板やブログなどコメントを反映できる機能
なんですって。
やはり、キーは「入力させるところ」なんですね。
要注意! XSSで想定される被害
攻撃の性質上、被害はWebサイトの改ざん、個人情報や機密情報の漏えいなどがあります。簡単に攻撃の流れと被害を見てみましょう。
攻撃の流れは一緒です。仕込まれるスクリプトによって被害が異なります。
偽サイトによるフィッシング詐欺
①推しのサイトに悪い人がスクリプトを仕込みます
②もちゃじが推しのサイトを見ると、悪い人が仕込んだスクリプトが動きます
③「推しの特別上映イベントチケットはこちら」と書かれたウインドウが開き、もちゃじはワクワクして進む(これが罠サイトへの誘導)
④もちゃじ、罠サイトにアクセスしてしまい、個人情報を入力してしまう
推しの特別上映イベントチケットがあったらクリックしちゃいますよー。口座番号とネットバンキングのパスワード、求められたら入れちゃいますよー。だって、本物そっくりなんですよ?ううう。
そうしてもちゃじの口座番号やらネットバンキングのパスワードやら、悪い人の元へ。
マルウェアに感染
①推しのサイトに悪い人がスクリプトを仕込みます
②もちゃじが推しのサイトを見ると悪い人が仕込んだスクリプトが動きます
③「推しの映画裏話はこちら」と書かれたウインドウが開き、もちゃじがウキウキ進む
(これが罠サイトへの誘導)
④もちゃじ、罠サイトにアクセスしてしまい、マルウェアに感染してしまう
裏話があったら知りたいですよー。クリックしちゃいますよー。
もちゃじ、まんまとマルウェア感染。
セッションハイジャック
①推しのサイトに悪い人がスクリプトを仕込みます
②もちゃじが推しのサイトを見ると悪い人が仕込んだスクリプトが動きます
③「推しの今だけ限定グッズ」と書かれたウインドウが開き、もちゃじがドキドキしながら進む(このとき推しサイトの裏側でこっそりスクリプトが動作して、推しサイトのCookieに保存された情報が取得されてしまう。そして悪い人に送信)
④もちゃじ、罠サイトにアクセスしてしまうが、もちゃじは推しサイトのCookieに保存された情報を不正に取得されたことに気付かない
⑤悪い人が、もちゃじのCookieに保存された情報を使って、もちゃじとして推しサイトにログインします。もうやりたいほうだい
だから、「今だけ」とか「限定」とか書かれてたらクリックしてしまいますってー。
もちゃじのCookie、悪い人にダダ漏れ。
これらの例を見てみると、もちゃじは全部まんまとクリックして、いろんな被害に遭ってしまいます。
もちゃじの被害では規模が小さすぎてなんだか恐ろしさが伝わらないので、企業で考えてみると…….
企業による個人情報や機密情報の漏えい、Webサイトの改ざんは、Webサイトの停止や機会損失、信用の失墜につながります。そして損害賠償やお見舞い金も発生する恐れあり。なにより風評被害の恐れもあるんですよね、超メジャー級の脆弱性だけに。
知名度がありすぎるので、実際にXSSによる被害がなかったとしても企業イメージを低下させてしまい、顧客離れや売り上げの低下、株価の下落などにつながってしまいます。
ダメージ大きすぎるやろ! と、心のおいでやす小田が叫ぶ。
対策
先人の教訓のおかげで、今では原因も分かり、効果的に解決できる方法もあるようです。
先ほど出てきたXSS脆弱性の原因には、
- 入力フォームにスクリプト(HTMLのタグやJavaScriptなど)が入力された場合、内容をそのまま反映・処理してしまう→反映させないようにしてしまえばいい
- Webアプリケーションが入力値を制限していない→制限してしまえばいい
ということで、以下に対策を五つ紹介します。
1. 根本的解決! エスケープ処理
スクリプトを反映させないようにしてしまえ、の筆頭です。
具体的には、スクリプトによく使われる特殊文字を「ただの文字」として認識させる処理を行います。サーバーさんに「&」の文字は、「&」に置換して表示するんだよ、と言い含めておく。よく使われる「&」以外にも四つあるから、それらもそれぞれお願いね、と。
置換の例
& → &
< → <
> → >
” → "
‘ → '
これをすることで、「<」「>」などはHTMLタグとして識別されなくなるので、「<script>」みたいなのがあっても処理されることなく、この文字がそのままブラウザ上に表示されるようになります。
先ほどもちゃじはうっかりウインドウをクリックしてしまいましたが、エスケープ処理をするとウインドウ(URLとか)がそもそも出てこない!
おおお。そうかー。悪意のあるスクリプトなど、らしきものが表示されても勝手に実行されるようなことはなくなります。素晴らしいじゃないですか!
2. 制限してしまえ! 入力値
不正なスクリプトが挿入されないように、入力欄にサーバー側で制限をかけるというもの。例えば、パスワード入力欄には「全角英数字8文字」、電話番号は「数字のみ」などに制限してしまえば、制限をかけた入力欄からスクリプトを使っての悪さはできません。
3. はじいてしまえ! スクリプトっぽいもの
<script>…</script>が入力されたら、いい内容か悪い内容かサーバーさんは判断ができません。そのため、もう一律にはじいてしまえ、というもの。
4. あなたはOK! ホワイトリスト方式
URLの出力は、「http://」と「https://」から始まる文字列のみを許可すようにする。リンク先のURLが例えば「javascript:」などから始まると、スクリプトが埋め込まれてしまう恐れがあるんですって。
もちゃじはURLといえば「http始まり」と思っていたので、IT世界の表層にもいないことを痛感しました。余談ですが。
5. 有料だけど! WAFの設置
WAF(Web Application Firewall)はWebサーバーを守ってくれます。ファイアウォールが突破されてしまってもWAFさんが守ってくれます。XSSの攻撃にも有効とされています。
中にはWAFがついているレンタルサーバーや、自分でOSS設計して導入する手もあるみたいなんです。ここはもちゃじの理解がまだ追い付いていないのですが、全部が全部WAFは有料っていうわけでもないみたいです。勉強しなきゃなー。
まとめ
三大脆弱性の一つであるXSSとは、「スクリプトを使用して、複数のサイトにまたがって攻撃されてしまう状態のこと(脆弱性)、またはその攻撃」のことでした。その被害は「個人情報・機密情報の漏えい」「Webサイトの改ざん」など、ユーザーにとってダメージが大きすぎるものでした。
対策としては、「エスケープ処理」「入力値の制限」「ホワイトリスト方式」「WAFの設置」などが有効とされています。メジャーな脆弱性なのでなんだか恐ろしいもののようにも思えますが、紐解いていくと有効な対策があることも分かりました。
Webセキュリティを担う皆さんに頭が下がる思いです。
文章だけじゃよく分からないという方に向けて、XSSのデモ動画をご用意しましたので、ぜひご覧ください。
ここで唐突な宣伝ですが、弊社信興テクノミストはセキュリティ診断を行っています。
https://web-scan.jp/
だから何だって話なのですが、うん?セキュリティ診断?と気にかかった方はサイトにお越しくださいね。
今回出てきた用語
プログラム | PCに対する指示をまとめたもの。「この条件で、こうしてね、こうなったら、これをしてね」のような。 |
コンパイル | 人間語で書かれたプログラムの元ネタ(ソースコード)をコンピューターが分かる機械語(バイナリコード、0と1で書かれる)に変換すること |
フィッシング詐欺 | 偽物のWebサイトに誘導し、個人情報などを入力させて情報を盗む詐欺 |
あなたのWebサイトも、脅威に対する「安心」を手に入れませんか?
ふう、書き終えた
『オッドタクシー』映画も公開されたので見たいな〜と思っていたら、もちゃじの住んでる地域では今のところ5月中旬の公開らしいです。待ち遠しや。
ライター/もちゃじ
IT業界に縁なく秘書畑をさすらい、前職はインドで社長秘書。ほぼ日本語とパッションのみで乗り切ったずうずうしさはスキルの一つか。完全なインドア派ながらたまにふらりと旅に出る。行き場のない母性を持て余し、友人の犬を溺愛するもほえられる。体が硬く、インドでヨガティーチャーに笑われたことに深く傷つく一面も。
ITド素人の私がWebセキュリティについて学び、レベルアップしていく(予定です)様子をお届けします。学びを発信することで、少しでもWebセキュリティに関する「難しそう」というイメージが下がり、苦手意識のある方たちに届いたらうれしいです。