1.安全世界觀
1.1安全三要素
機密性Confidentiality:要求保護數據內容不能泄露,加密是實現機密性要求煩人常見手段;
完整性Integrity:要求保護數據內容是完整,沒有被篡改的;
可用性Availability:要求保護資源是“隨需而得”。
1.2實施安全評估
資產等級劃分:對數據做等級劃分,後劃分信任域和信任邊界;
威脅分析:可能造成危害的來源稱爲威脅,威脅分析是要把所有的威脅都找出來,一般採用頭腦風暴法或者建模法;
風險分析:可能會出現的損失稱爲風險,可通過DREAD模型科學衡量風險;
安全解決方案:方案應能夠有效解決問題,用戶體驗好,高性能,低耦合,易於擴展與升級。
1.3白帽子兵法
1.3.1 Secure By Default原則:
>白名單黑名單
若更多地使用白名單,則系統就會變得更安全。
按照白名單的思想,應根據業務需求,列出一個允許使用的軟件以及軟件版本的清單,在此清單外的軟件則禁止使用,注意避免出現類似通配符的問題。
>最小權限原則
要求系統只授予主體必要的權限,而不要過度授權,需要認真梳理業務所需要的權限。
1.3.2 Defense in Depth縱深防禦原則:
首先,要在各個不同層面,不同方面實施安全方案,避免出現疏漏,不同安全方案之間需要相互配合,構成一個整體;
其次,要在正確的地方做正確的事情,在解決根本問題的地方實施針對性的安全方案。
1.3.3 數據與代碼分離原則
程序在棧或者堆中,將用戶數據當做代碼執行,混淆了代碼與數據的邊界,導致緩衝區溢出等安全問題,使用過濾,編碼等手段,把可能造成代碼混淆的用戶數據清理掉。在Web安全中,由“注入”引起的問題很多,如XSS,X-Path等。
1.3.4 不可預測性原則
不可預測性能有效地對抗基於篡改,僞造的攻擊,可以巧妙用於一些敏感數據上,實現往往需要用到加密算法,隨機數算法,哈希算法。
2.客戶端腳本安全
瀏覽器安全:瀏覽器本身就是一個客戶端,若具備安全功能,則能想安全軟件一樣對用戶上網起到很好的保護作用,另外瀏覽器安全也是瀏覽器廠商之間競爭的底牌。
2.1同源策略
同源策略(Same Origin Policy)是瀏覽器最核心最基本的功能。限制了來自不同源的“document”或腳本,對當前“document”讀取或設置某些屬性。
影響源的因素有:host(域名或IP地址),子域名,端口,協議。
對於當前頁面來說,頁面內存放JavaScript文件的域並不重要,重要的是加載JavaScript頁面所在的域是什麼。在瀏覽器中,<script>, <img>, <iframe>, <link>等標籤是可以跨域加載資源,而不受同源策略的限制。
XMLHttpRequest受到同源策略的約束,不能跨域訪問資源,若能跨域訪問資源,則可能會導致一些敏感數泄露。
2.2瀏覽器沙箱
掛馬:在網頁中插入一段惡意代碼,利用瀏覽器樓棟執行任意代碼的攻擊方式。
多進程架構:將瀏覽器的各個功能模塊分開,各個瀏覽器實例分開,當一個進程崩潰時,也不會影響到其他的進程。
Sandbox:沙箱,泛指資源隔離類模塊。設計一般是爲了讓不可信任的代碼運行在一定的環境中,限制不可信任的代碼訪問隔離區之外的資源。O__O “…
2.3惡意網址攔截
瀏覽器週期性地從服務器端獲取一份最新的惡意網址黑名單,若用戶上網時訪問的網址存在於此黑名單中,瀏覽器就會彈出一個警告頁面。
惡意網站分兩類:一類是掛馬網站,這類網站通常包含惡意的腳本,如JavaScript或Flash,通過利用瀏覽器的漏洞執行shellcode,在用戶電腦中植入木馬;另一類是釣魚網站,通過模仿知名網站的相似網頁來欺騙用戶。
目前瀏覽器廠商只是以推送惡意網址黑名單爲主,瀏覽器收到黑名單後,對用戶訪問的黑名單進行攔截。PhishTank是互聯網上免費提供惡意網址黑名單的組織之一。除了惡意網址黑名單攔截功能外,主流瀏覽器都開始支持EV SSL證書,以增強對安全網站的識別。
2.4瀏覽器安全
微軟在IE8中退出了XSS Filter功能,以對抗反射型XSS。當用戶訪問的URL中包含了XSS攻擊的腳本時,IE就會修改其中的關鍵字符使得攻擊無法完成,並對用戶彈出提示框。
Firefox 4推出Content Security Policy(CSP),由服務器端返回一個HTTP頭,並在其中描述頁面應該遵守的安全策略。
2.5.跨站腳本攻擊(XSS)
2.5.1XSS簡介
跨站腳本攻擊Cross Site Script本來縮寫是CSS,爲了與層疊樣式表(Cascading Style Sheet,CSS)區別,所以在安全領域叫做XSS。
XSS攻擊是指黑客通過“HTML注入”篡改了網頁,插入了惡意的腳本,從而正在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。
XSS根據效果分類:
1)反射型XSS
反射型XSS只是簡單地把用戶輸入的數據“反射”給瀏覽器。黑客需要誘使用戶點擊一個惡意鏈接,才能攻擊成功,又叫做”非持久型XSS“。
2)存儲型XSS
存儲型XSS會把用戶輸入的數據存儲在服務器端,這種XSS具有很強的穩定性,又叫”持久型XSS“。
3)DOM Based XSS
DOM Based XSS通過修改頁面的DOM節點形成的XSS。
2.5.2XSS攻擊進階
XSS攻擊成功後,攻擊者能夠對用戶當前瀏覽的頁面植入惡意腳本,通過惡意腳本,控制用戶的瀏覽器,這些用以完成各種具體功能的惡意腳本即”XSS Payload“。
強大的XSS Payload:
1)構造GET和POST請求
2)XSS釣魚
對於驗證碼,XSS Payload可通過讀取頁面內容,將驗證碼的圖片URL發送到遠程服務器上來實施,攻擊者可以在遠程XSS後臺接收當前驗證碼,並將驗證碼的值返回給當前的XSS Payload,從而繞過驗證碼。
對於修改密碼,利用JavaScript在當前頁面上僞造一個登錄框,當用戶在登錄框中輸入用戶名和密碼後,其密碼將被髮送至黑客的服務器上。
3)識別用戶瀏覽器
若知道用戶使用的瀏覽器,操作系統,就可能實施一次精準的瀏覽器內存攻擊,最終給用戶植入一個木馬。
通過JavaScript腳本識別瀏覽器版本,最直接的是通過XSS讀取瀏覽器的UserAgent對象,但UserAgent是可以僞造的。
由於瀏覽器之間的實現存在差異,不同的瀏覽器會各自實現一些獨特的功能,而同一個瀏覽器的不同版本之間也可能會有細微差別,通過分辨這些差異,就能準確地判斷出瀏覽器版本。
4)識別用戶安裝的軟件
黑客通過判斷用戶安裝的軟件,選擇對應的瀏覽器漏洞,最終達到植入木馬的目的。
通過收集常見軟件的classid,就可以掃描出用戶電腦中安裝的軟件列表,甚至包括軟件的版本。
在XSS Payload中使用時,可以在Flash的ActionScript中讀取system.capabolities對象後,將結果通過ExternalInterface傳給頁面的JavaScript。
5)CSS History Hack
通過CSS,獲取用戶曾經訪問過的網站。利用style的visited屬性—若用戶曾經訪問過某個鏈接,則這個鏈接的顏色會變得與衆不同。
6)獲取用戶的真實IP地址
XSS攻擊需要藉助第三方軟件來完成。比如,客戶端安裝了Java環境(JRE),則XSS可以釣魚Java Applet的接口獲取客戶端的本地IP地址。
2.5.3XSS攻擊平臺:
Attack API:總結了很多能夠直接使用XSS Payload,歸納爲API的方式。
BeEF:XSS演示平臺,演示一個完整的XSS攻擊過程,他有一個控制後臺,攻擊者可以在後臺控制前端的一切。
XSS-Proxy:輕量級的XSS攻擊平臺,通過嵌套iframe的方式可以實時地遠程控制被XSS攻擊的瀏覽器。
終極武器:XSS Worm
Samy Worm:首先,MySpace過濾了很多危險的HTML標籤,只保留了<a>, <img>, <div>等安全的標籤,但允許用戶控制標籤的style屬性,通過style構造出XSS。其次,MySpace過濾了’javascript’等敏感詞,用拆分法繞過了這些限制。最後Samy通過AJAX構造的POST請求,完成了在用戶的heros列表裏添加自己名字的功能,同事複製蠕蟲自身進行傳播。
一般來說,用戶之間發生交互行爲的頁面,如果存在存儲型XSS,則比較容易發起XSS Worm攻擊。
2.5.4調試JavaScript
Firebug:最常用的腳本調試工具,前端工程師與Web Hacking必備。
IE 8 Developer Tools:可以動態調試JavaScript。
Fiddler:本地代理服務器,需要將瀏覽器設置爲使用本地代理服務器上網纔可使用。Fiddler會家門口所有的瀏覽器請求,並有能力在瀏覽器請求中插入數據,支持腳本編程。
HttpWatch:以插件形式內嵌在瀏覽器中。能監控所有的瀏覽器請求,在目標網站是HTTPS時特別有用。
2.5.6XSS構造技巧
1)利用字符編碼
2)繞過長度限制,利用事件能夠縮短的字節數是有限的,最好是把XSS Payload寫到別處,再通過簡短的代碼加載這段XSS Payload。最常用的是“location.hash”,根據HTTP協議,location.hash的內容不會在HTTP包中發送,所以服務器端的Web日誌中並不會記錄下location.hash裏的內容。
3)使用<base>標籤,它的作用是定義頁面上的所有使用“相對路徑”標籤的hosting地址。<base>標籤可以出現在頁面的任何地方,並作用於位於該標籤之後的所有標籤。
4)window.name,對當前窗口的window.name對象賦值,沒有特殊字符的限制。利用這個對象可以實現跨域,跨頁面傳遞數據。
2.5.7變廢爲寶:Mission ImpossibIe
從XSS漏洞利用的角度來看,存儲型XSS對攻擊者的用處比反射型XSS要大。存儲型XSS在用戶訪問正常URL時會自動觸發,而反射型XSS會修改一個正常的URL,一般要求攻擊者將XSS URL發送給用戶點擊,提高了攻擊的門檻。
Apache Expect Header XSS:服務器在出錯返回時,會把Expect頭的內容未經任何處理便寫入到頁面中,因此Expect頭中的HTML代碼就被瀏覽器解析執行了。這需要再提交請求時向HTTP頭中注入惡意數據,才能觸發這個漏洞,但對於XSS攻擊來說,JavaScript工作在渲染後的瀏覽器環境中,無法控制用戶瀏覽器發出的HTTP頭。而在Flash中發送HTTP請求時,可以自定義大多數的HTTP頭。
Anehta的迴旋鏢:若在B域上存在一個反射型“XSS_B”,在A域上存在一個存儲型“XSS_A”,當用戶訪問A域上的“XSS_A”時,同時嵌入B域上的“XSS_B”,則可以達到在A域的XSS攻擊B域用戶的目的。
2.5.8Flash XSS
在Flash中可以嵌入ActionScript腳本,ActionScript可以發起網絡連接,應該儘可能禁止用戶能夠上傳或加載自定義的Flash文件。
若網站應有一定要使用Flash,若只是視頻文件,則要求轉碼未flv文件,flv文件是靜態文件,不會產生安全隱患;若是帶動態腳本的Flash,則可以通過Flash的配置參數進行限制。
2.5.9 JavaScript開發框架
Dojo:在Dojo 1.4.1中,存在兩個DOM Based XSS。用戶輸入由theme參數傳入,然後被賦值給變量themeCss,最終被document.write到頁面裏。
YUI:在YUI 2.8.1中,存在過一個DOM Based XSS。在官方demo頁,點擊一個Tab頁,等待頁面加載完成後,在URL的hash中插入惡意腳本,腳本會被執行。
jQuery:html()方法如果沒有參數,就是讀取一個DOM節點的innerHTML,若有參數,則會把參數值寫入該DOM節點的innerHTML中,這個過程可能產生DOM Based XSS。
2.5.10 XSS的防禦
1) HttpOnly
瀏覽器禁止頁面的JavaScript訪問帶有HttpOnly屬性的Cookie。這解決了XSS後的Cookie劫持攻擊。
一個Cookie的使用過程如下:
瀏覽器向服務器發起請求,這是沒有Cookie;
服務器返回時發送Set-Cookie頭,向客戶端瀏覽器寫入Cookie;
在該Cookie到期前,瀏覽器訪問該域下的所有頁面,都將發送該Cookie。
HttpOnly是在Set-Cookie時標記的,但服務器可能會設置多個Cookie,而HttpOnly可以有選擇性地加在任何一個Cookie值上。
2) 輸入檢查
常用的Web漏洞如XSS, SQL Injection等,都要求攻擊者構造一些特殊字符。這些特殊字符可能是正常用戶不會用到的,可以通過輸入檢查檢測。
輸入檢查的邏輯,必須放在服務器端代碼中實現,若只是在客戶端使用JavaScript進行輸入檢車,是很容易被攻擊者繞過的。目前Web開發的普遍做法,是同時在客戶端JavaScript中和服務器端代碼中實現相同的輸入檢車。
3) 輸出檢查
一般除了富文本的輸出外,在變量輸出到HTML頁面時,可以使用編碼或轉義的方式來防禦XSS攻擊。
4)正確防禦XSS
XSS可能發生的場景:
1)在HTML標籤中/HTML屬性中輸出
所有在標籤中輸出的變量,若未做任何處理,都能導致直接產生XSS。這種情況下,XSS的利用方式一般是構造一個<script>標籤,或者是任何能夠產生腳本執行的方式。
防禦方式:對變量使用HtmlEncode。
2)在<script>標籤中輸出
在<script>標籤中/事件中輸出時,首先應該確保輸出的變量在引號中,攻擊者需要先閉合引號才能實施XSS攻擊。
防禦方式:使用JavaScriptEncode。
3)在CSS中輸出
一般儘可能禁止用戶可控制的變量在<style>,HTML標籤的style屬性以及CSS文件中輸出,若一定有這樣的需求,則推薦使用OWASP ESAPI中的encodeForCSS()函數。
5) 處理富文本
在過濾富文本時,“事件”應該被嚴格禁止,因爲“富文本”的展示需求裏不應該包括事件這種動態效果,並禁止一些危險標籤,如iframe, script,base,form等。
在標籤的選擇上,應該使用白名單,避免使用黑名單,如只允許a,img,div等比較安全的標籤。白名單原則不僅僅用於標籤的選擇,同樣應該用於屬性和事件的選擇。
Anti-Samy是OWASP上一個開源項目,也是目前最好的XSS Filter。
6)防禦DOM Based XSS
DOM Based XSS是從JavaScript中輸出數據到HTML頁面裏。
參考資料:
白帽子說Web安全思維導圖:https://www.cnblogs.com/edisonchou/p/edc_web_security_foundation_notes.html