「掲示板の機能に、XSS(エックスエスエス)の脆弱性が見つかりました」
セキュリティ会社からの報告書に踊る、この3文字。私は「エックス……エス……エス? なんだか、洋服の超極小サイズ(XSS)のことかな? データが小さすぎて消えちゃったのかな?」と、不思議な想像をしていました。
とりあえず 「小さくて可愛いですね!」 と微笑んでみましたが、周囲からは「……いや、ユーザーの情報を盗むための罠のことだよ」と呆れられ、またしても「ファッション脳」な勘違いに赤面する羽目に……。
これ、実はあなたが普段見ている「普通のサイト」を、悪い人が勝手に「罠だらけのサイト」に作り替えてしまう、とっても厄介な攻撃のことです。今回は、お店に置かれた 「偽の案内板」 に例えて、その正体をやさしく解説します!
XSSとは? 一言でいうと「サイトの一部を書き換えて、利用者に『罠』を仕掛ける攻撃」
結論から言うと、XSS(Cross-Site Scripting:クロスサイトスクリプティング)とは、「Webサイトの脆弱性を利用して、悪意のあるプログラム(スクリプト)を埋め込み、それを閲覧したユーザーのブラウザ上で実行させる攻撃」 のことです。
街の 「掲示板」 に例えてみましょう。
- 普通のサイト:お店の「今日のメニュー」が書かれた掲示板。
- XSS(攻撃):「悪い人が、夜中にこっそり掲示板の文字を書き換える」。
- 被害:あなたが「おいしそうだな」とその掲示板を読むと、実はそこに 『この紙を読んだ人は、財布の中身を隣のゴミ箱に入れてください』 という魔法の暗示(スクリプト)が隠されていて、あなたの手が勝手に動いてしまう。
犯人は、Webサイトそのものを壊すのではなく、サイトを訪れた「あなた(ユーザー)」を狙います。掲示板の「名前を入力する欄」などに悪い命令を書き込んでおき、後からそれを見た人の情報を、こっそり犯人の元へ送りつけさせるのです。
ビジネスの現場でXSSという言葉が出る場面
SNSの運用や、ユーザーが投稿できるサイトの管理シーンで頻繁に登場します。
1. 「コメント欄にXSSの対策(エスケープ)が漏れているよ。至急修正して」
意味:
「掲示板に『悪いプログラム』をそのまま書き込める状態になっているから、書き込まれた文字をただの『絵』として扱うように加工して、魔法が発動しないようにして!」ということです。
2. 「XSSによって、ユーザーのCookie(預かり証)が盗まれてしまった!」
意味:
「サイトに仕掛けられた罠のせいで、お客様が持っていた『お店の会員証(Cookie)』が勝手にコピーされて犯人に渡ってしまい、犯人がお客様のフリをしてログインできるようになっちゃったよ」ということです。
3. 「信頼できる大手サイトでも、XSSの隙間があると偽の画面に飛ばされるよ」
意味:
「お城(サイト)自体は立派でも、案内板(一部の表示)が偽物にすり替えられると、知らないうちに『偽の銀行窓口』へ連れて行かれちゃうから、油断できないんだよ」ということです。
SQLインジェクションとXSSの違い
「どっちも情報を盗むんでしょ?」という疑問。狙っている「相手」で比較しました。
| 比較ポイント | SQLインジェクション | XSS |
|---|---|---|
| 狙う相手 | サイトの金庫 (サーバー) | サイトの利用者 (あなた) |
| たとえ話 | 金庫番を騙してお宝を出す | 案内板を書き換えてお客を騙す |
| 被害 | データが丸ごと盗まれる | 個人情報やパスワードが盗まれる |
「会社を直接狙う」のがSQL、「会社のふりをして客を狙う」のがXSS、と覚えましょう!
まとめ
この記事のポイントは次のとおりです。
- XSSは、サイトに「悪いプログラム」を埋め込んでユーザーを襲う攻撃
- ユーザーの「預かり証(Cookie)」を盗んで、なりすましログインをするのが目的
- ユーザー自身には「攻撃を受けている」という自覚が全くないのが怖いところ
今すぐできる確認方法
あなたが「罠」にかからないために、以下のことを覚えておきましょう。
- 「エスケープ処理」という言葉: エンジニアが「エスケープしたから大丈夫」と言っていたら、「あ、悪いプログラムを無効化したんだな」と理解する。
- 怪しいURL: SNSなどで「http://〜」と変な記号が並んだリンクが流れてきたら、「あ、これXSSの罠かも?」と疑ってみる。
- ブラウザの保護: 最新のブラウザ(Chromeなど)は、ある程度のXSS攻撃を自動で察知して防いでくれます。「常に最新」にしておきましょう!
「XSS」という言葉を知るだけで、インターネットが「100%安全な場所」ではなく、誰かが「罠」を仕掛けているかもしれない「少し注意が必要な、でも正しく守れば楽しい場所」に見えてきませんか?