web安全及防御 - XSS跨站腳本漏洞

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ā)型:這是最簡單的植入廣告的方式

例1

引誘觸發(fā)型:

例1

例2

總結(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)義為:&amp;
  • "(雙引號)轉(zhuǎn)義為:&quot
  • '(單引號)轉(zhuǎn)義為:&#039
  • <(小于)轉(zhuǎn)義為:&lt
  • >(大于)轉(zhuǎn)義為:&gt

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)鍵還是要靠過濾輸入與輸出

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

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

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