一、網絡安全
OWASP:開放式Web應用程序安全項目(OWASP,Open Web Application Security Project)
OWASP是一個開源的、非盈利的全球性安全組織,致力於應用軟件的安全研究。
http://www.owasp.org.cn/

二、XSS攻擊
1、總述

2、XSS攻擊原理
XSS攻擊(Cross-Site Scripting)跨站腳本攻擊。 被OWASP評為十大安全漏洞中的第二威脅漏洞。

特點:能注入惡意的HTML/JavaScript代碼到用戶瀏覽的網頁上,從而達到Cookie資料竊取、會話劫持、釣魚欺騙等攻擊。<攻擊代碼不一定(非要)在 <script></script> 中>
原因:a:Web瀏覽器本身的設計不安全。瀏覽器能解析和執行JS等代碼,但是不會判斷該數據和程序代碼是否惡意。
b:輸入和輸出是Web應用程序最基本的交互,而且網站的交互功能越來越豐富。如果在這過程中沒有做好安全防護,很容易會出現XSS漏洞。
c:程序員水平參差不齊,而且大都沒有過正規的安全培訓,沒有相關的安全意識。
d:XSS攻擊手段靈活多變。
3、防御XSS攻擊
a:HttpOnly 瀏覽器禁止頁面的JS訪問帶有HttpOnly屬性的Cookie。
b:輸入檢查 XSS Filter 對輸入內容做格式檢查,類似“白名單”,可以讓一些基於特殊字符的攻擊失效。在客戶端JS和服務器端代碼中實現相同的輸入檢查(服務器端必須有)。
c:輸出檢查 在變量輸出到html頁面時,可以使用編碼或轉義的方式來防御XSS攻擊 HtmlEncode:將字符轉成HTMLEntities,對應的標准是ISO-8859-1。
& --> & < --> < > -->> " --> " ' --> ' / --> /
JS中可以使用JavascriptEncode。需要對“\”對特殊字符轉義,輸出的變量的必須在引號內部。
d:XSS的本質是“HTML注入”,用戶的數據被當成了HTML代碼一部分來執行,從而混淆了原本的語義,產生了新的語義。
在Html標簽中輸出:<div>$var</div> 在標簽中輸出的變量,如果未做任何處理,都能導致直接產生XSS:構造一個<script>標簽,或者是任何能夠產生腳本執行的方式:<div><script>alert(/XSS/)</script></div> 或者 <a href=# ><img src=# onerror=alert(1) /></a>
防御方法:對變量使用HtmlEncode。
在Html屬性中輸出:<div id="abc name="$var"></div> 攻擊方法:<div id="abc" name=""><script>alert(/XSS/)</script><""></div>
防御方法:采用HtmlEncode。 在OWASP ESAPI中推薦了一種更嚴格的HtmlEncode:除了字母、數字外,所有的特殊字符都被編碼成HTMLEntities。
在<script>標簽中輸出:<script>var x = "";alert(/XSS/);//";<script>
防御方法:使用JavascriptEncode。
在事件中輸出:與在<script>標簽中輸出類似:<a href=# onclick="funcA('');alert(/XSS/);//')">test</a>
防御方法:使用JavascriptEncode。
在CSS中輸出:方式多樣
防御方法:盡可能禁止用戶可控制的變量在"<style>標簽"、"html標簽的style屬性"、"CSS文件"中輸出。如果一定有此需求,則推薦使用 OWASP ESAPI 中的encodeForCSS()函數。除了字母、數字外的所有字符都被編碼成十六進制形式“\uHH”。
在地址中輸出:比較復雜。一般是在URL的path(路徑)或者search(參數)中輸出,使用URLEncode即可。
<a href="http://www.evil.com/?test=$var">test</a> --> <a href="http://www.evil.com/?test=" onclick=alert(1)"" >test</a>
整個URL都被用戶完全控制時,URL的Protocal(http://) 和Host (www.evil.com)部分不能使用URLEncode,可能會構造偽協議實施攻擊:
<a href="$var"></a> --> <a href="javascript:alert(1);"></a>
防御方法:先檢查變量是否以”http“開頭(如果不是則自動添加),以保證不會出現偽協議類的XSS攻擊。在此之后,再對變量進行URLEncode。
e:處理富文本 網站允許用戶提交一些自定義的HTML代碼,稱之為”富文本“。比如用戶在論壇里發帖,帖子的內容有圖片、視頻、表格等,這些”富文本“的效果都需要通過HTML代碼來實現。
防御方法:與輸入檢查的思路一致。使用"XSS Filter":“事件”應該被嚴格禁止;一些危險的標簽:<iframe>、<script>、<base>、<form>等也應嚴格禁止;在標簽、屬性、事件的選擇上,應該使用白名單,避免使用黑名單。比如,只允許<a>、<img>、<div>等比較“安全”的標簽存在。可使用一些開源項目:Anti-Samy 是OWASP上的一個開源項目,可使用於Java、.NET等。 HTMLPurify可使用於PHP中。
f:防御DOM Based XSS 如果是輸出到事件或腳本,要做一次javascriptEncode;如果是輸出到HTML內容或者屬性,要做一次HtmlEncode。
處理XSS注入的時候,不僅僅要轉義或刪除特殊的 HTML 標記和符號,如尖括號<>,如script,如iframe等,還需要過濾 JavaScript 事件所涉及的大量屬性,前端一般使用XSS Filter 設置“白名單”。過濾的事件大致如下:
屬性 | 當以下情況發生時,出現此事件 |
onabort | 圖像加載被中斷 |
onblur | 元素失去焦點 |
onchange | 用戶改變域的內容 |
onclick | 鼠標點擊某個對象 |
ondblclick | 鼠標雙擊某個對象 |
onerror | 當加載文檔或圖像時發生某個錯誤 |
onfocus | 元素獲得焦點 |
onkeydown | 某個鍵盤的鍵被按下 |
onkeypress | 某個鍵盤的鍵被按下或按住 |
onkeyup | 某個鍵盤的鍵被松開 |
onload | 某個頁面或圖像被完成加載 |
onmousedown | 某個鼠標按鍵被按下 |
onmousemove | 鼠標被移動 |
onmouseout | 鼠標從某元素移開 |
onmouseover | 鼠標被移到某元素之上 |
onmouseup | 某個鼠標按鍵被松開 |
onreset | 重置按鈕被點擊 |
onresize | 窗口或框架被調整尺寸 |
onselect | 文本被選定 |
onsubmit | 提交按鈕被點擊 |
onunload | 用戶退出頁面 |
三、CSRF攻擊
1、總述

2、攻擊原理

CSRF攻擊跨站請求偽造。 本質:重要操作的所有參數都是可以被攻擊者猜測到的。攻擊者預測出URL的所有參數與參數值,才能成功地構造一個偽造的請求。
3、防御CSRF攻擊
防御方法: 驗證碼、 Referer Check 檢查請求是否來自合法的源(可被偽造)。
通用方法:Token 使用Anti-CSRF Token 在URL中保持原參數不變,新增一個參數Token。Token的值是隨機的(必須使用足夠安全的隨機數生成算法,或者采用真隨機數生成器),其為用戶與服務器所共同持有,可以放在用戶的Session中,或者瀏覽器的Cookie中。 注意保密,盡量把Token放在表單中(構造一個隱藏的input元素),以POST提交,避免Token泄露。
注意:如果網站有XSS漏洞或者一些跨域漏洞,可能導致Token泄露。
在XSS攻擊下,讀取Token值,然后再構造出一個合法的請求,可以稱為:XSRF。
四、HTML5安全
HTML5新增的一些標簽和屬性,使XSS攻擊產生了新的變化,如果原來的XSS Filter是用的“黑名單”,就會導致攻擊者用HTML5新增的標簽來進行攻擊,如果用的“白名單”,這方面的隱患就會少一些。
五、常見前端框架對XSS攻擊的防范
React 默認會轉義所有字符串。
AngularJS 使用AngularJS中的SCE來防御XSS攻擊。
六、Web安全掃描器
商業軟件:IBM Rational Appscan、WebInspect、Acunetix WVS
免費軟件:W3AF、SkipFish
--------------------------------------------------------------------------------------------
參考資料:《白帽子講Web安全》 吳瀚清
《Web前端黑客技術揭秘》 鍾晨鳴 徐少培
《XSS跨站腳本攻擊剖析與防御》 邱永華
《OWASP Top 10-2013》