≪ Today I learned.
RSS購読
    公開日
    タグ
    Security
    著者
    ダーシノ

    Cross-Site Scripting(XSS)の攻撃手法と対策

    概要

    Cross-Site Scripting(XSS)とは、URLや入力フォームを悪用しスクリプトを埋め込み、その情報を取得した他のユーザーのブラウザ上で実行させる攻撃手法のこと。スクリプトを実行することで、入力データや個人情報などを外部サーバーなどに送信することが可能になる。認証が通ったクライアント上でスクリプトを実行されるため、不正の検知が難しい。

    攻撃方法の例

    1.反射型XSS(Reflected XSS)

    リクエストに含まれる値(GETパラメータなど)を、そのままレスポンスとして返すようなコードがある場合に発生する脆弱性。

    <form>
      <label for="name">Name</label>
      <input type="text" id="name" name="name" />
      <button type="submit">Submit</button>
    </form>
    
    <p>Hello, <?php echo $_GET['name']; ?></p>

    というフォームに<script>alert('XSS');</script>というスクリプトを入力して送信すると、ブラウザ上でalert('XSS');が実行される。

    2.蓄積型XSS(Stored XSS)

    悪意のある値がデータベースなどに格納され、それを別のリクエストで取得するようなコードがある場合に発生する脆弱性。

    <form>
      <label for="comment">Comment</label>
      <input type="text" id="comment" name="comment" />
      <button type="submit">Submit</button>
    </form>
    
    <section id="comments">
      <?php
        // コメントをデータベースから取得して表示する(例: MySQLなど)
        echo $_POST['comment'];
      ?>
    </section>

    このフォームに><script>alert('XSS');</script>というスクリプトを入力して送信すると、alert('XSS');が実行される。

    3.DOM-based XSS(DOM-based XSS)

    DOMを悪用してスクリプトを実行するようなコードがある場合に発生する脆弱性。

    <script>
      const urlParams = new URLSearchParams(window.location.search);
      const name = urlParams.get('name');
      document.getElementById('name').innerHTML = name;
    </script>
    
    <p id="name"></p>

    このページでhttps://example.com/page?name=<script>alert('XSS');</script>というURLを開くと、alert('XSS');が実行される。

    対処法

    反射型XSSや蓄積型XSSは、ページに値を表示する際に必要なエスケープ処理を行うことが重要である。

    サニタイズいうなキャンペーンのとおり、正しいAPIやライブラリの使い方をすることが防ぐことができる。