XSS跨站腳本漏洞

概述:

XSS跨站腳本(Cross-Site Scripting,XSS)自1996年誕生以來,如今已經歷十多年的演化。由於和另一種網頁技術-層疊樣式表(Cascading Style Sheets,CSS)的縮寫一樣,爲了防止混淆,故把原本的CSS簡稱爲XSS。

跨站腳本攻擊是一種常見的web安全漏洞,XSS最大的特點就是能注入惡意的HTML/JavaScript代碼到用戶瀏覽的網頁上,是因WEB應用程序對用戶輸入過濾不足而產生的,當用戶瀏覽這些網頁時,就會執行其中的惡意代碼。由於HTML代碼和客戶端JavaScript腳本能在受害者主機上的瀏覽器任意執行,這樣等同於完全控制了WEB客戶端的邏輯,在這個基礎上,黑客可以輕易地發起Cookie竊取,會話劫持,釣魚欺騙等各種各樣的攻擊。

XSS和CSRF很像,很容易混淆,XSS利用站點內的信任用戶,而CSRF則通過僞裝來自受信任用戶的請求來利用受信任的網站,CSRF與XSS最大的區別就在於,CSRF並沒有盜取cookie而是直接利用。XSS是獲取信息,不需要提前知道其他用戶頁面的代碼和數據包。CSRF是代替用戶完成指定的動作,需要知道其他用戶頁面的代碼和數據包。

攻擊流程:

一些常用的腳本

利用XSS彈警告框:

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

獲取cookie值:

<script>alert(document.cookie)</script>

嵌入其他網站:

<iframe src=http://baidu.com width=0 height=0></iframe>

XSS輸入也可能是HTML代碼段,如使網頁不停刷新:

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

分類:

1、反射型XSS

反射型XSS也被稱爲非持久性XSS,是現在最容易出現的一種XSS漏洞。當用戶訪問一個帶有XSS代碼的URL請求時,服務器端接收數據後處理,然後把帶有XSS代碼的數據發送到瀏覽器,瀏覽器解析這段帶有XSS代碼的數據後,最終造成XSS漏洞。 

攻擊過程:用戶訪問了危險網站,服務器後臺響應了頁面的執行語句,響應到瀏覽器,但是服務器後臺不會執行惡意代碼,而是瀏覽器執行惡意代碼。這樣保存在本地瀏覽器上的Cookie等敏感信息可能會被盜取。服務器就充當了反射的跳板,來對用戶瀏覽器發起了攻擊。

現象:用戶在頁面輸入的內容,會在服務器響應後,瀏覽器上出現類似內容的顯示;例如:你輸入一個用戶名haha,登錄後頁面出現一個hello!haha,這就說明本地瀏覽器是執行了你的輸入,而不是後臺服務器。

測試:

這是一個反射型XSS的頁面,可以看到這裏我們輸入haha,頁面也會給我們回顯一個haha的字樣,一般出現這樣的場景都容易有XSS的漏洞。

當我們輸入腳本後如下:

出現了彈窗提示,由此可見該網站就存在XSS的漏洞。僅僅出現彈窗好像並沒有什麼危害,這是因爲我們並沒有輸入惡意腳本,接下來我們輸入惡意腳本,我們讓其彈出瀏覽器頁面的cookie值,如下,

當彈出瀏覽器的cookie值時,這便沒有什麼隱私可言了,如果該cookie中有你的賬號密碼,後果不堪設想。攻擊者將該鏈接僞裝一下,再將惡意腳本完善一下,會在不知不覺的情況下盜取用戶的cookie值。

假如http://test.com/xss1.php存在XSS反射型跨站漏洞,那麼攻擊者的步驟可能如下:

1.test1是網站test.com的用戶,此時正在登錄的狀態中。
2.攻擊者發現http://test.com/xss1.php存在XSS反射型跨站漏洞,然後精心構造JavaScript代碼,此段代碼可以竊取用戶的cookie。
3.攻擊者將帶有反射型XSS漏洞的URL通過站內信息發送給用戶test1,使用各種誘導的方式讓用戶test1去打開鏈接。
4.如果用戶test1打開了帶有XSS漏洞的URL,那麼就會把自己的cookie發送到攻擊者中。
5.攻擊者接受到用戶test1的會話cookie,就可以直接利用cookie以test1的身份登錄test.com網站中。
以上步驟,通過使用反射型XSS漏洞可以以test1的身份登錄網站,這就是其危害。
 

2、存儲型XSS

存儲型XSS又被稱爲持久性XSS,存儲型XSS是最危險的一種跨站腳本。允許用戶存儲數據的WEB應用程序都可能會出現存儲型XSS漏洞,當攻擊者提交一段XSS代碼後,被服務器端接收並存儲,當再次訪問頁面時,這段XSS代碼被程序讀取響應給瀏覽器,造成XSS跨站攻擊,這就是存儲型XSS。

存儲型XSS出現的場景一般爲留言板,貼吧,論壇等,我們拿留言板舉例;

過程

  1. 插入留言=>內容存儲到數據庫
  2. 查看留言=>內容從數據庫提取出來
  3. 內容在頁面顯示

如果輸入的爲惡意腳本,每次有人查看留言時,都會被服務器推送到前端,然後被瀏覽器執行,所以一般存儲型XSS的危害比較大。

:在測試是否存在XSS時,首先要確定輸入點與輸出點,例如:我們要在留言內容上測試XSS漏洞,首先就要去尋找留言內容輸出(顯示)的地方是在標籤內還是標籤屬性內,或者在其他地方,如果輸出的數據在屬性內,那麼XSS是不會被執行的,這時就需要我們判斷閉合,提前將屬性內容閉合,在提交惡意腳本。

測試:

這是一個留言板我們可以輸入一些惡意腳本,

效果如下:

當我們每一次打開這個留言板時,這個腳本都會被執行。

3、DOM XSS

DOM的全稱爲Document Object Model,即文檔對象模型,DOM通常用於代表在HTMLXHTMLXML中的對象。使用DOM可以允許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。

通過JavaScript可以重構整個HTML頁面,而要重構頁面或者頁面中的某個對象, JavaScript就需要知道HTML文檔中所有元素的“位置”。而DOM爲文檔提供了結構化表示,並定義瞭如何通過腳本來訪問文檔結構。根據DOM規定,HTML文檔中的每個成分都是一個節點。

DOM的規定如下:
整個文檔是一個文檔節點
每個HTML標籤是一個元素節點
包含在HTML元素中的文本是文本節點
每一個HTML屬性是一個屬性節點
節點與節點之間都有等級關係
 

傳統類型的XSS漏洞(反射型或存儲型)一般出現在服務器端代碼中,而DOM XSS是基於DOM文檔對象模型的一種漏洞,所以,受客戶端瀏覽器的腳本代碼所影響。DOM XSS取決於輸出位置,並不取決於輸出環境,因此也可以說DOM XSS既有可能是反射型的,也有可能是存儲型的,簡單去理解就是因爲他輸出點在DOM

我們可以看這樣一段腳本:

<?php
error_reporting(0);
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text"); 
var print = document.getElementById("print");
print.innerHTML = text.value; 
</script>

我們可以看到這串腳本,是通過GET的方式提交一個name的值,我們的輸入input是在value屬性中,要是我們還是像以前一樣輸入腳本,它是不會執行的,這時就需要轉變思路。

<input id="text" type="text" value="<script>alert('xss')</script>" />

閉合input標籤,讓他不在value屬性中。“/>閉合後

<input id="text" type="text" value=""/><script>alert('xss')</script>" />

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