XSS又叫CSS(Cross Site Scripting:跨站腳本攻擊),是最常見的Web應(yīng)用程序安全漏洞之一,在2013年度Owasp top 10 中排名第三。
一、XSS原理解析
XSS是在網(wǎng)頁中嵌入客戶端惡意腳本代碼,通常是JavaScript編寫的惡意代碼,當(dāng)用戶使用瀏覽器瀏覽被嵌入惡意代碼的網(wǎng)頁時,惡意代碼將會在用戶的瀏覽器上執(zhí)行。
JavaScript可以用來獲取用戶的Cookie、改變網(wǎng)頁內(nèi)容、URL跳轉(zhuǎn),即存在XSS漏洞的網(wǎng)站,就可以盜取用戶Cookie、黑掉頁面、導(dǎo)航到惡意網(wǎng)站,而攻擊者需要做的僅僅是向Web頁面中注入JavaScript代碼。
二、XSS類型
XSS主要被分為三類,分別是:反射型、存儲型和DOM型。
1. 反射型XSS
反射型XSS也被稱為非持久性XSS,是現(xiàn)在最容易出現(xiàn)的一種XSS漏洞。當(dāng)用戶訪問一個帶有XSS代碼的URL請求時,服務(wù)器端接收數(shù)據(jù)后處理,然后把帶有XSS代碼的數(shù)據(jù)發(fā)送到瀏覽器,瀏覽器解析這段帶有XSS代碼的數(shù)據(jù)后,最終造成XSS漏洞,這個過程就像一次反射,故稱為反射型XSS。

(1)第一步:要有URL請求localhost:3000/?xss=<img src='null' onerror='alert(1)'/>;
(2)第二步:服務(wù)器端接收數(shù)據(jù)解析并響應(yīng);
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
res.set('X-XSS-Protection', 0); // 關(guān)閉瀏覽器對xss的攔截
res.render('index', { title: 'Express', xss: req.query.xss });
});
(3)XSS代碼隨響應(yīng)內(nèi)容一起傳回瀏覽器,瀏覽器頁面獲取數(shù)據(jù)并顯示;
// 使用的ejs
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<!-- 要不要對html進行轉(zhuǎn)譯,‘-’號:表示不需要進行轉(zhuǎn)譯 -->
<%- xss %>
</body>
這個階段,攻擊已經(jīng)生效了,舉以下兩種類型:
自動觸發(fā)型:這是最簡單的植入廣告的方式

引誘觸發(fā)型:


總結(jié):反射型,需要四處散發(fā)這個有XSS漏洞的地址,否則就是自己玩,散發(fā)出去才能攻擊更多的網(wǎng)頁,獲取更多的用戶信息,XSS主要存在URL上。
2. 存儲型XSS
存儲型XSS又被稱為持久性XSS,存儲型XSS是最危險的一種跨站腳本。
允許用戶存儲數(shù)據(jù)的Web應(yīng)用程序都可能會出現(xiàn)存儲型XSS漏洞,當(dāng)攻擊者提交一段XSS代碼后,被服務(wù)器接收并存儲,當(dāng)攻擊者再次訪問某個頁面時,這段代碼被程序讀出來響應(yīng)給瀏覽器,造成XSS跨站攻擊,這就是存儲型XSS。
和反射型XSS的差別在于,不依靠用戶手動去觸發(fā),具有更高的隱蔽性,危害性更大。

如果不對用戶的輸入做任何的防御,瀏覽器就會把XSS代碼認(rèn)為是正常的JavaScript代碼來執(zhí)行,這是很危險的。
3. DOM XSS
基于DOM型的XSS是不需要與服務(wù)器端交互的,它只發(fā)生在客戶端處理數(shù)據(jù)階段。
獲取URL中參數(shù)的值,并且顯示在瀏覽器上,從而給攻擊者提供攻擊的機會,攻擊者可以隨意在瀏覽器URL上輸入任意XSS代碼,如果不加以防范,不做任何過濾,后果會很嚴(yán)重。
例如:http://www.com?content=<script>alert(/xss)</script>
客戶端代碼:
<script>
var temp = document.URL; // 獲取URL
var index = document.URL.indexOf('content=') + 4;
var par = temp.substring(index);
document.write(decodeURI(par)); // 顯示獲取的內(nèi)容
</script>
三、XSS高級利用
XSS不僅僅是彈出一個框那么簡單,在某些情況下,XSS不弱于SQL注入。下面列舉了幾個常見的危害:
- 盜取用戶Cookie;
- 修改網(wǎng)頁內(nèi)容;
- 利用網(wǎng)站重定向;
- XSS蠕蟲。
四、預(yù)防XSS
XSS跨站漏洞最終形成的原因是對輸入輸出沒有嚴(yán)格過濾,在頁面執(zhí)行JavaScript等客戶端腳本,這就意味著只要將敏感字符過濾,即可修補XSS跨站漏洞。但這一過程卻是復(fù)雜無比的,很多情況下無法識別哪些是正常字符,哪些是非正常字符。
1. 輸入與輸出
都要進行轉(zhuǎn)義,才能讓那些XSS代碼失效。
-
&(和號)轉(zhuǎn)義為:&; "(雙引號)轉(zhuǎn)義為:"'(單引號)轉(zhuǎn)義為:'<(小于)轉(zhuǎn)義為:<>(大于)轉(zhuǎn)義為:>
XSS可能發(fā)生的場景:
- 在標(biāo)簽內(nèi)輸出;
- 在屬性內(nèi)輸出;
- 在事件中輸出(與屬性相同);
- 在css中輸出;
- 在script標(biāo)簽中輸出。
OWASP提供了一系列解決XSS場景的編碼器:針對輸入輸出。
- html編碼:
ESAPI.encoder().encodeForHTML(String input);
ESAPI.encoder().encodeForHTMLAttribute(String input); - CSS編碼:
ESAPI.encoder().encodeForCSS(String input); - JavaScript編碼:
ESAPI.encoder().encodeForJavaScript(String input);
防御XSS沒有那么難,只要把控好輸入與輸出點,針對性的過濾、轉(zhuǎn)義,就能杜絕XSS跨站漏洞。
2. HttpOnly
嚴(yán)格地說,HttpOnly對防御XSS漏洞不起作用,而主要目的是為了解決XSS漏洞后續(xù)的Cookie劫持攻擊。
什么是HttpOnly:
是微軟公司的Internet Explorer 6 SPI引入的一項新特性。這個特性為Cookie提供了一個新屬性,用以阻止客戶端腳本訪問Cookie。至今已成為一個標(biāo)準(zhǔn),幾乎所有的瀏覽器都會支持HttpOnly。
在身份標(biāo)識字段使用HttpOnly可以有效的阻擋XSS會話劫持攻擊,但卻不能夠完全阻擋XSS攻擊。因為XSS攻擊的手段太多:模擬用戶“正?!辈僮鳌⒈I取用戶信息、釣魚等,僅靠HttpOnly是不夠的,防御的關(guān)鍵還是要靠過濾輸入與輸出。