WEB安全之XSS漏洞

跨站腳本攻擊(Cross
Site Scripting)。這是一種將惡意Javascript代碼插入到其他Web用戶頁面里執(zhí)行以達(dá)到攻擊目的的漏洞。自1996年誕生以來,如今已經(jīng)歷十多年的演化。由于和另一種網(wǎng)頁技術(shù)-層疊樣式表(Cascading Style Sheets,CSS)的縮寫一樣,為了防止混淆,故把原本的CSS簡稱為XSS。在各種WEB應(yīng)用安全漏洞中,XSS跨站腳本攻擊漏洞一直被OWASP(Open Web Application Security Project)組織評為十大應(yīng)用安全之一。

流程

xss注入簡單流程.png

以博客留言板為例:

用戶一般都是按照正常的語言文字在留言板進(jìn)行留言。假如有一個(gè)攻擊者,別有用心,反其道而行之,留言不再是一段正常的文字,而是輸入了一串JavaScript腳本,如

<script>alert("your are so fool")</script>

此時(shí)網(wǎng)頁的結(jié)構(gòu)則變成如下形式:

<html>
  <title>XSS TEST</title>
  <body>
        五樓:<script>alert("your are so fool")</script>
  </body>
</html>

一旦用戶瀏覽留言板,此段JavaScript腳本變會(huì)被瀏覽器解析,返回給用戶,造成XSS漏洞。這就是最簡單形式的XSS漏洞。

常見的惡意腳本形式

針對XSS漏洞,一般比較常見的腳本形式如下:

1、利用XSS彈警告窗:

<script>alert(‘xss’)</script>

2、獲取cookie形式:

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

3、嵌入其他網(wǎng)站:

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

4、XSS輸入也可能是HTML代碼段,如使網(wǎng)頁不停刷新:

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

危害

①網(wǎng)絡(luò)釣魚,包括盜取各類用戶賬號。

②竊取用戶cookie資料,從而獲取用戶隱私信息,或利用用戶身份進(jìn)一步對網(wǎng)站執(zhí)行操作。

③劫持用戶(瀏覽器)會(huì)話,從而執(zhí)行任意操作,例如進(jìn)行非法轉(zhuǎn)賬,強(qiáng)制發(fā)表日志,發(fā)送電子郵件等。

④強(qiáng)制彈出廣告頁面,刷流量等。

⑤網(wǎng)頁掛馬。

⑥進(jìn)行惡意操作,例如任意篡改頁面信息,刪除文章等。

⑦進(jìn)行大量的客戶端攻擊,如DDOS攻擊。

⑧獲取客戶端信息,例如用戶的瀏覽歷史,真實(shí)ip,開放端口等。

⑨控制受害者機(jī)器向其他網(wǎng)站發(fā)起攻擊。

⑩結(jié)合其他漏洞進(jìn)一步擴(kuò)大攻擊。

分類

xss根據(jù)攻擊類型可分為如下三種形式:

1、反射型XSS

2、存儲(chǔ)型XSS

3、DOM-based XSS

下面就具體的類型進(jìn)行講解。

反射型XSS

? 反射型XSS也被稱為非持久性XSS,是現(xiàn)在最容易出現(xiàn)的一種XSS漏洞。當(dāng)用戶訪問一個(gè)帶有XSS代碼的URL請求時(shí),服務(wù)器端接收數(shù)據(jù)后處理,然后把帶有XSS代碼的數(shù)據(jù)發(fā)送到瀏覽器,瀏覽器解析這段帶有XSS代碼的數(shù)據(jù)后,最終造成XSS漏洞。

反射型XSS.png,圖片來源于互聯(lián)網(wǎng)

? 反射型XSS其基本思想就是依靠站點(diǎn)服務(wù)端返回腳本,在客戶端觸發(fā)執(zhí)行從而發(fā)起Web攻擊。例如,在搜索框中輸入如下腳本:

<script>alert(0)</script>

點(diǎn)擊搜索,頁面彈出alert對話框。

存儲(chǔ)型XSS

? 存儲(chǔ)型XSS又被稱為持久性XSS,存儲(chǔ)型XSS是最危險(xiǎn)的一種跨站腳本。允許用戶存儲(chǔ)數(shù)據(jù)的WEB應(yīng)用程序都可能會(huì)出現(xiàn)存儲(chǔ)型XSS漏洞,當(dāng)攻擊者提交一段XSS代碼后,被服務(wù)器端接收并存儲(chǔ),當(dāng)再次訪問頁面時(shí),這段XSS代碼被程序讀取響應(yīng)給瀏覽器,造成XSS跨站攻擊。

存儲(chǔ)型XSS.png,圖片來源于互聯(lián)網(wǎng)

? 與反射型不同的是,存儲(chǔ)型XSS屬于二次渲染的漏洞,它首先會(huì)被持久化,然后從持久化中讀取到頁面,被頁面渲染產(chǎn)生。如新增一個(gè)用戶,將用戶名寫成如下形式:

<script>alert(0)</script>

保存后,如果未對用戶名進(jìn)行過濾,第二次訪問用戶信息時(shí),會(huì)彈出alert窗體。

DOM-based XSS

? DOM的全稱為Document Object Model,即文檔對象模型,DOM通常用于代表在HTML、XHTML和XML中的對象。使用DOM可以允許程序和腳本動(dòng)態(tài)地訪問和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。

? 通過JavaScript可以重構(gòu)整個(gè)HTML頁面,而要重構(gòu)頁面或者頁面中的某個(gè)對象, JavaScript就需要知道HTML文檔中所有元素的“位置”。而DOM為文檔提供了結(jié)構(gòu)化表示,并定義了如何通過腳本來訪問文檔結(jié)構(gòu)。根據(jù)DOM規(guī)定,HTML文檔中的每個(gè)成分都是一個(gè)節(jié)點(diǎn)。

? JavaScript重構(gòu)的HTML頁面,如果此中包含了惡意的腳本,便會(huì)造成DOM-based XSS漏洞。這種類型的漏洞常見的方式如下:

document.write()
document.writeIn()
xxx.innerHTML = 
xxx.outerHTL = 
innerHTML.replace
document.attachEvent()
window.attachEvent()
document.location.replace()
document.location.assign()

防御

? 不管反射型XSS也好,存儲(chǔ)型XSS也罷,DOM-based XSS也包括其中,其本質(zhì)問題就是讓對方瀏覽器執(zhí)行你插入的JavaScript腳本。所以對于防御措施,主要有以下幾種:

1、永遠(yuǎn)不要信任前端傳過來的參數(shù)值,要對其進(jìn)行過濾過濾再過濾。示例代碼如下:

private String cleanXSS(String value) {
        value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;")
        .replaceAll("\\(", "&#40;").replaceAll("\\)", "&#41;")
        .replaceAll("'", "&#39;")
        .replaceAll("\"", "&#34;")
        .replaceAll("eval\\((.*)\\)", "")
        .replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        return value;
    }

2、可采用合適的編碼函數(shù),如apache.commons.lang3.StringEscapeUtils中的escapeHtml4函數(shù)。

3、采用owasp推出的ESAPI接口,對字符進(jìn)行轉(zhuǎn)義,如:

ESAPI.encoder().encodeForHTML(name)

關(guān)于ESAPI后續(xù)文章將有介紹!

4、為Cookie加上HttpOnly標(biāo)記。

以上便是對XSS漏洞的一些總結(jié)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容