白帽子講Web安全-客戶端腳本安全

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章