Webサイトを見ているとき、あなたのブラウザはあなたの味方でしょうか?
残念ですが、違います。
XSS(クロスサイトスクリプティング)を食らった瞬間、あなたのブラウザは敵のスパイに変わります。
昨日まで忠実だった執事が、急に強盗の手引きを始めるようなものです。
今日は、Webセキュリティの中でも特に凶悪で、かつ頻繁に起こるこの攻撃について解説します。
XSS(クロスサイトスクリプティング)とは?
一言で言えば、攻撃者があなたのブラウザを使って勝手に行動したりする攻撃です。
名前が長すぎるので「XSS」と略しています
本来なら「Cross Site Scripting」なので「CSS」と略すべきです。
しかし、Webデザインで使う「CSS(スタイルシート)」と被ってしまいます。
紛らわしいので、「Cross」を「X」と表記して「XSS」になりました。
厨二病っぽい名前ですが、単なる大人の事情です。
仕組みはシンプル。「罠の張られた掲示板」を想像してみましょう
普通の掲示板に、「こんにちは」と書き込むと、みんなの画面に「こんにちは」と表示されます。
平和です。
しかし、もしここに「これを見た人の財布を盗め」という命令文を書き込めたらどうなるでしょうか?
XSSの脆弱性(弱点)があるサイトでは、この命令文がそのまま掲示板に貼り付けられます。
そして、その掲示板を見た全員のブラウザが、その命令を実行してしまいます。
書き込んだ犯人は高みの見物です。
ウイルスとは違う。あなたのPCではなく「サイト」に穴があるのだ
勘違いしやすいですが、これはウイルス感染ではありません。
あなたのスマホやPCは正常です。
悪いのは、変な命令文をそのまま表示してしまう「Webサイト側の不始末」です。
レストランで食中毒が出たとき、悪いのは食べた客の胃袋ではなく、厨房の衛生管理です。
それと同じです。
【攻撃の仕組み】なぜブラウザは「嘘の命令」を聞いてしまうのか?
ブラウザ(ChromeやSafariなど)は、実はとても純粋で融通が利きません。
書かれていることはすべて「正しい命令」だと信じ込んでしまいます。
犯人は「scriptタグ」というの指令を使う
Webページを作るHTMLには、<script>というタグがあります。
これはブラウザにとって命令のひとつです。
ここに「画面を真っ赤にしろ」と書かれていれば赤くしますし、「ユーザーデータを外部に送信しろ」と書かれていれば、疑いもせずに送信します。
攻撃者は、このタグをいかにしてあなたの画面に紛れ込ませるか、その一点に命をかけています。
反射型XSS:メールのリンクを踏んだら即・爆発
攻撃者があなたに怪しいメールを送ります。
「プレゼント当選!詳細はこちら→http://example.com/search?q=<script>悪さしろ</script>」
あなたがこのリンクを踏むと、正規のサイト(example.com)に飛びます。
しかし、そのサイトが検索ワードをそのまま画面に表示する作りだった場合、URLに含まれていた「悪さしろ」というスクリプトが、サイトの画面から反射して、あなたのブラウザで実行されます。
蓄積型XSS:掲示板に書き込まれた「地雷」を踏む恐怖
こちらはもっとタチが悪いです。
攻撃者が、掲示板やレビューサイトにスクリプトを書き込みます。
そのスクリプトはサーバーのデータベースに保存(蓄積)されます。
あとは待つだけ。
そのページを閲覧した人全員に対して、保存されていたスクリプトが発動します。
無差別に被害が出る、まさに地雷原です。
DOM Based XSS:目に見えない場所で起きるステルス攻撃
サーバーとのやり取りなしに、ブラウザ上の処理(JavaScript)だけで完結する事故です。
最近のWebサイトは高機能なので、ブラウザの中でプログラムがバリバリ動いています。
その処理の途中で、URLの一部を不用意に読み込んで実行してしまうパターンです。
サーバーに痕跡が残りにくいため、発見が遅れることがあります。
【被害事例】XSSを食らうと、あなたのデジタルライフはこう終わる
「画面に文字が出るくらいでしょ?」と思ったあなた。
甘いです。人生が終わる可能性があります。
Cookie(クッキー)窃取:例えるならそれは「ディズニーの年パス」を盗まれるのと同じ
これが最大の被害です。
Webサイトにログインしているとき、あなたのブラウザは「セッションID」という一時的な会員証(Cookie)を持っています。
これを見せれば、IDやパスワードを入力しなくても「このセッションIDを持っているということは会員だな」と扱われます。
XSS攻撃はこれを盗みます。攻撃者はあなたのパスワードを知る必要はありません。
盗んだセッションIDを見せるだけで、あなたになりすましてログインし放題です。
なりすまし投稿:勝手に「私は詐欺師です」とツイートされる地獄
SNSでやられると致命的です。
あなたの意図とは無関係に、勝手に投稿ボタンを押されます。
犯罪予告、差別発言、怪しい商品の宣伝。
気づいたときには、あなたの社会的信用はゼロです。
偽サイトへの誘導:正規の銀行サイトを見ていたはずが、気づけば裏路地
銀行のサイトを見ているときに、XSSで「ログイン画面」を勝手に表示させます。
あなたは「お、タイムアウトしたのかな?もう一回ログインだ」と思ってパスワードを入力します。
その入力データは、銀行ではなく攻撃者のサーバに送信されます。
見た目はCSSで整えられている本物なので、騙されたことにすら気づけません。
よくある勘違い。「XSS」と「CSRF」の違いを焼き肉で解説する
セキュリティの話をすると必ず出てくる「CSRF(クロスサイトリクエストフォージェリ)」。
XSSと似ていますが、焼き肉屋で例えると違いが一発で分かります。
XSSは「操り人形」。あなたの手足が勝手に動く
攻撃者が糸を引いて、あなたの手(ブラウザ)を無理やり動かします。
自分の手でメニューを開き、自分の手で謎の肉を注文し、自分の口でそれを食べさせられます。
ブラウザ上で攻撃者が仕込んだ怪しいスクリプトが勝手に実行される(=手足が動く)のがXSSです。
CSRFは「ドッキリ注文」。あなたの名義で勝手にカルビが届く
あなたがトイレに行っている隙に、店員さんに「あそこの席の人、特上カルビ100人前だって」と嘘の注文を通します。
あなたの手足は動いていません。でも、店員さん(サーバ)はあなたからの注文だと信じて処理してしまいます。
これがCSRFです。
詳しくは別記事で解説しますが、本記事では「なるほど、そのサイトの機能ではないJavaScriptが勝手に発動してしまうのがXSSなのだな」というのがご理解いただけましたら十分です。
【対策】Web開発者がやるべき義務は「消毒」
XSSを防ぐ責任のほとんどはWebシステムを作る側にあります。
方法はシンプルです。
サニタイジング(エスケープ):有害な文字を「無害な文字」に書き換える
ブラウザが反応してしまう危険な文字を、骨抜きにします。
具体的には、<(小なり)を、<というただの記号列に変換します。フレームワークを使わない生のPHPの場合、以下のようにhtmlspecialchars関数を使用します。
htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
こうしておけば、$strにJavaScriptのコードが仕込まれていたとしても、ブラウザは「ああ、これは命令じゃなくて、ただの文字だな」と理解してスクリプトを実行しません。
これを「サニタイジング(サニタイズ)」や「エスケープ」と呼びます。
これをやっていないWebサイトは、鍵をかけずに外出する家と同じくらい危険です。
実は、意外とあります。
WAFの導入:サイトの前に立つ「屈強なガードマン」
プログラムの修正漏れを防ぐために、サーバーの手前に「WAF(Web Application Firewall)」という防御システムを置きます。
こいつは、送られてくるデータの中に「<script>」みたいな怪しい文字列がないかを常に見張っています。
怪しいスクリプトが来たら門前払い、というわけです(WAFを有効にしてても油断せず、前述のサニタイズは確実にやりましょう)。
ユーザーができることは「怪しいリンクを踏まない」だけ。だがそれが最強
悲しいことに、閲覧者側でXSSを技術的に防ぐのは困難です。
できることは一つ。
「心当たりのないメールやDMのリンクを踏まない」
原始的ですが、これが最強の防衛策です。
まとめ:XSSは「信頼」を突く攻撃。正しい知識が最強の盾になる
XSSの怖いところは、「いつも使っているサイトだから大丈夫」という油断を突いてくるところです。
インターネットは便利な場所ですが、裏路地には常にナイフを持った誰かが潜んでいます。
「ブラウザは命令されたら何でも実行しちゃうドジっ子なんだ」
そう知っておくだけで、あなたのクリックする指は今までより慎重になるはずです。
その慎重さが、あなたのデジタルライフを守ります。


コメント