Web前端--黑客技術揭祕(菜鳥知識)

一,Web安全的關鍵點

1.同源策略是衆多安全策略的一個,是Web層面上的策略,非常重要。

2.同源策略規定:不同域的客戶端腳本在沒明確授權的情況下,不能讀寫對方的資源。

3.同域要求兩個站點同協議,同域名,同端口。

4.當然,在同一個域內,客戶端腳本可以任意讀寫同源內的資源,前提是這個資源本身是可讀可寫的。

5.安全類似木桶原理,短的那塊板決定了木桶實際能裝多少水。一個Web服務器,如果其上的網站沒做好權限分離,沒控制好信任關係,則整體安全性就由安全性最差的那個網站決定。

6.一個安全性非常好的網站有可能會因爲建立了不可靠的信任關係,導致網站被黑。

7.CSRF是跨站請求僞造。CSRF會借用目標用戶的權限做一些借刀殺人的事(注意是“借用”,而不是“盜取”目標權限),然後去做壞事,“盜取”通常是XSS(跨站腳本攻擊)最喜歡做的事。


二,前端基礎

1.爲了解決CSS兼容性而發展的CSS Reset技術,該技術會重置一些樣式(這些樣式在不同的瀏覽器中有不同的呈現),後續的CSS將在這個基礎上重新開始定義自己的樣式。

2.爲了解決JavaScript兼容性,誕生了許多優秀的JavaScript框架,如jQuery, YUI等等。

3.URL的請求協議幾乎都是HTTP,它是一種無狀態的請求響應,即每次的請求響應之後,連接會立即斷開或延時斷開(保持一定的連接有效期),斷開後,下一次請求再重新建立。

4.HTTP是無狀態的,那麼每次在連接時,服務端如何知道你是上一次的那個?這裏通過Cookies進行會話跟蹤,第一次響應時設置的Cookies在隨後的每次請求中都會發送出去。Cookies還可以包括登錄認證後的身份信息。

5.iframe標籤還有一些有趣的安全話題,當網站頁面使用iframe方式潛入一個頁面時,我們約定網站頁面是父頁,而被嵌入的這個頁面是子頁。

6.如果父頁和子頁之間是同域,那就很容易,父頁可以通過調用子頁的contentWindow來操作子頁的DOM樹,同理,子頁可以調用父頁的contentWindow來操作父頁的DOM樹。如果它們不同域,則必須遵守同源策略,但子頁還是可以對父頁的location值進行寫操作,這樣可以讓父頁重定向到其他網頁,不過對location的操作僅僅只有寫權限,而沒有讀權限,這樣就不能獲取父頁location URL的內容,否則有可能會造成隱私數據泄漏,比如,有的網站將身份認證token存在於URL中。

7.對跨站師來說,大多數情況下,有了XSS漏洞,就意味着可以注入任意的JavaScript,有了JavaScript,就意味着被攻擊者的任何操作都可以模擬,任何隱私信息都可以獲取到。可以說,JavaScript就是跨站之魂。

8.從window.location或location處可以獲取URL地址中的數據。

9.異步和同步對應,異步可以理解爲單獨開啓了一個線程,獨立於瀏覽器主線程去做自己的事,這樣瀏覽器就不會等待(阻塞),這個異步在後臺悄悄進行,所以利用AJAX的攻擊顯得很詭異,無聲無息。AJAX本身就是由JavaScript構成的,只是XML並不是必需的,XML在這裏是想指數據傳輸格式是XML,比如,AJAX發出去的HTTP請求,響應回的數據是XML格式,然後JavaScript去解析這個XML DOM樹得到相應節點的內容。其實響應回的數據格式還可以是JSON(已經是主流),文本,HTML等等。AJAX中特別提到XML是因爲歷史原因。

10.AJAX的核心對象是XMLHttpRequest。

11.AJAX是嚴格遵守同源策略的,既不能從另一個域讀取數據,也不能發送數據到另一個域。不過有一種情況,可以發送數據到另一個域,W3C的新標準中,CORS開始推進瀏覽器支持這樣的跨域方案,現在的瀏覽器都支持這個方案了,過程如下:

www.foo.com(來源域)的AJAX向www.evil.com(目標域)發起了請求,瀏覽器會給自動帶上Origin頭,如下:

Origin:  http://www.foo.com

然後目標域要判斷這個Origin值,如果是自己預期的,那麼就返回。

12.如果目標域不設置Access-Control-Allow-Origin:http://www.foo.com,那麼隱私數據可以被偷到嗎?答案是肯定的。

13.對於GET方式,實際上就是一個URL。

14.對於POST的請求,前面說的XMLHttpRequest對象就是一個非常方便的方式,可以模擬表單提交,它有異步與同步之分,差別在於XMLHttpRequest實例化的對象xhr的open方法的第三個參數,true表示異步,false表示同步,如果使用異步方式,就是AJAX。異步則表示請求發出去後,JavaScript可以去做其他事情,待響應回來後會自動觸發xhr對象的onreadystatechange事件,可以監聽這個事件以處理響應內容。同步則表示請求發出去後,JavaScript需要等待響應回來,這期間就進入阻塞階段。

15.Cookie是一個神奇的機制,同域內瀏覽器中發出的任何一個請求都會帶上Cookie,無論請求什麼資源,請求時,Cookie出現在請求頭的Cookie字段中。

16.Cookie經常被用來存儲用戶的會話信息,比如,用戶登錄認證後的Session,之後同域內發出d請求都會帶上認證後的會話信息。

17.HttpOnly是指僅在HTTP層面上傳輸的Cookie,當設置了HttpOnly標誌後,客戶端腳本就無法讀寫該Cookie,這樣能有效地防禦XSS攻擊獲取Cookie。

18.Secure Cookie機制指的是設置了Secure標誌的Cookie僅在HTTPS層面上安全傳輸,如果請求是HTTP的,就不會帶上這個Cookie,這樣能降低重要的Cookie被中間人截獲的風險。

19.本地Cookie與內存Cookie,它與過期時間(Cookie的expires字段)緊密相關。如果沒設置過期時間,就是內存Cookie,這樣的Cookie會隨着瀏覽器的關閉而從內存中消失;如果設置過期時間是未來的某個時間點,那麼這樣的Cookie就會以文本形式保存在操作系統本地待過期時間到了纔會消失。

20.刪除Cookie時,僅需設置過期值爲過去的時間即可。Cookie無法跨瀏覽器存在。

21.Flash是跨瀏覽器的通用解決方案,Flash Cookie的默認存儲數據大小是100KB。

22.如果在h1之前有大段非法字符,如何保證h1的代碼順利解析?在h1之前加上{}即可,如果是在IE下,加上}即可,這是瀏覽器解析差異導致的。

{}h1{font-size:50px; color:red;}


三,前端黑客之XSS

1.XSS即跨站腳本,發生在目標網站中目標用戶的瀏覽器層面上,當用戶瀏覽器渲染整個HTML文檔的過程中出現了不被預期的腳本指令並執行時,XSS就會發生。

目標網站的目標用戶:這裏強調了場景

瀏覽器:因爲這類攻擊是由瀏覽器來解析執行的。

不被預期的:那麼就很可能是攻擊者在輸入時提交了可控的腳本內容,然後在輸出後被瀏覽器解析執行。

2.跨站腳本的重點不在“跨站”上,而應該在“腳本”上,這是從字面上來分析的。因爲這個“跨”實際上屬於瀏覽器的特性,而不是缺陷,造成“跨”這樣的假象是因爲絕大多數XSS攻擊都會採用嵌入一段遠程或者說第三方域上的腳本資源。

3.通俗地總結XSS爲:想盡一切辦法將你的腳本內容在目標網站中目標用戶的瀏覽器上解析執行即可。

4.XSS有三類:反射型XSS(也叫非持久性XSS),存儲型XSS(也叫持久型XSS)和DOM XSS 。

5.存儲型XSS的攻擊是最隱蔽的。


四,前端黑客之CSRF

1.在跨站的世界中,CSRF同樣扮演着及其重要的角色。CSRF的全稱是Cross Site Request Forgery,即跨站請求僞造。

攻擊的發生是由各種請求造成的,對於CSRF來說,它的請求有兩個關鍵點,跨站點的請求與請求是僞造的。

2.安全風險總是出現在正常的流程中,現在我們發出的是一個刪除文章的GET請求,對於合法的跨域請求,瀏覽器會放行。

3.HTML中能夠設置src/href等鏈接地址的標籤都可以發起一個GET請求。

4.還有通過JavaScript動態地生成的標籤對象或CSS對象發起的GET請求,而發出POST請求只能通過form提交方式。

5.由於JSON格式的簡潔與強大,網站開始逐漸使用JSON代替傳統的XML進行數據傳輸。

6.JSON數據如果以字典形式返回,直接在瀏覽器中顯示會報錯,原因是瀏覽器以爲“{”開頭的腳本應該是一段左右花括號包圍住的代碼塊。所以,對這種JSON數據的處理,一般會這樣:

eval(“(”+JSON_DATA+")");  //前後加上圓括號

7.對於使用列表形式返回的JSON數據,它是一個Array對象,以前可以通過劫持Array數據來進行JSON HiJacking攻擊。


五,前端黑客之界面操作劫持

1.界面操作劫持攻擊時一種基於視覺欺騙的Web會話劫持攻擊,它通過在網頁的可見輸入控件上覆蓋一個不可見的框(iframe),使得用戶誤以爲在操作可見控件,而實際上用戶的操作行爲被其不可見的框所劫持,執行不可見框中的惡意代碼,從而完成在用戶不知情的情況下竊取敏感信息,篡改數據等攻擊。

2.界面操作劫持分爲三種:點擊劫持,拖放劫持和觸屏劫持。

3.在瀏覽器中,拖放操作是不受“同源策略”限制的,用戶可以把一個域的內容拖放到另一個不同的域。因此,突破同源策略限制的拖放劫持可以演化出更廣泛的攻擊形式,突破很多種防禦。

4.控件位置之間的層次關係使用z-index,而且任何瀏覽器都支持:

        z-index:1,數值可以是負數,高數值的控件會處於低數值控件的前面,數值越高,控件越靠近用戶。

 

六,漏洞挖掘

1.回到XSS漏洞挖掘上,上面說了攻擊者可控的輸入點有<path>,<query>,<fragment>三個,其實<fragment>裏的值一般不會出現在服務端解析,除非Web 2.0網站。

2.最普通的場景出現在<div id="body" >[輸出]</div>位置,那麼提交:

    id=1<script>alert(1)</script>就可以觸發XSS了。

    可如果出現在下面這些標籤中呢?

    <title></title>

    <textarea></textarea>

    <xmp></xmp>

    <iframe></iframe>

    <noscript></noscript>

    <noframes></noframes>

    <plaintext></plaintext>

    比如,代碼<title><script>alert(1)</script></title>會彈出提示框嗎?答案是:都不會!這些標籤之間無法執行腳本。XSS漏洞挖掘機制必須具備這樣的區分能力,比如,發現出現在<title></title>中,就將提交的payload變爲:

    </title><script>alert(1)</script>

    除了這些,還有兩類特殊的標籤<script>和<style>,它們是不能嵌套標籤的,而且payload構造情況會更靈活,除了閉合對應的標籤外,還可以利用它們自身可執行腳本的性質來構造特殊的payload。

3.HTML是一個很不嚴格的標記語言(它的反面代表是XML),屬性值可以不用引號,或者使用單引號,雙引號,反單引號(僅IE瀏覽器支持)進行引用。

4.“探子”的目的有兩個:目標參數值是否出現在響應上,如果不出現,就完全沒必要進行後續的payload請求與分析,因爲這些payload請求與分析可能會進行多次,浪費請求資源;目標參數值出現在HTML的哪個部分,從上面的分析我們已經知道,不同的HTML部分對待XSS的機制是不一樣的,請求的payload當然也不一樣。

5.肉眼看到的一個文字或符號單元就是一個字符(包括亂碼),一個字符可能對應1~n字節,1字節爲8位,每一位要麼爲1,要麼爲0。

6.一個字符對應1~n字節是由字符集與編碼決定的,比如,ASCII字符集就是一個字符對應1字節,不過1字節只用了7位,最高位用於其他目的,所以ASCII字符集共有2的7次方(128)個字符,基本就是鍵盤上的英文字符(包括控制符)。

7.<!-- [if IE] >所有的IE可識別<! [endif] -->

   <!-- [if IE 6] >僅IE6可識別<! [endif] -->

   <!-- [if lt IE 6] >IE6以及IE6以下版本可識別<! [endif] -->

   <!-- [if gte IE 6] >IE6以及IE6以上版本可識別<! [endif] -->
  這是IE所獨有的,在其他瀏覽器看來與普通註釋無異,但是在IE看來卻是可根據條件執行的,這給我們繞過過濾器創造了可乘之機。

8.目前在XSS中常用的僞協議有三個:javascript:,vbscript:(協議名也可以簡寫爲vbs:)和data:

9.同HTML標籤和屬性的特點相似,僞協議的協議名也是不區分大小寫的,並且跟事件相仿,數據也可以做自動的HTMLDecode解碼以及進制解碼。

10.@charset爲規則;!important爲聲明。其中能被我們利用插入XSS腳本的地方只有CSS資源類屬性值和@import規則,以及一個只能在IE瀏覽器下執行的屬性值expression。

11. var a = "123</script><script>alert(1);</script>";

   對HTML頁面中的JavaScript代碼來說,</script>閉合標籤具有最高優先權,可以在任何位置中斷JavaScript代碼。所以,在實際的過濾器實現中,事實上還會區分引用變量中是否使用了</script>閉合標籤,如果使用了,則要用反引線做轉換“<\/script>”。另外,還要注意引用變量的數據走向,看能否有DOM XSS的可能性。

12.根據需求的不同,JSON大體上有兩種格式:沒有callback函數名的裸Object形式和有callback函數名的參數調用Object的形式,如下:

  [{"a":"b"}]

  callback([{"a":"b:"}])

  後者的存在主要是爲了跨域數據傳輸的需要,而這個特性通常也成了攻擊者跨域獲取用戶隱私數據的重要渠道。

 

七,漏洞利用

1.<script>標籤請求內容可跨域,這是合法的功能,請求到是數據必須是合法的JavaScript語法格式。這種技術在之前有提過,包括請求回來的是JSON+CallBack函數這樣的數據內容(這種跨域數據通信被稱爲JSONP)。

 

八,HTML5安全

 

九,Web蠕蟲

1.Web蠕蟲主要包括:XSS蠕蟲,CSRF蠕蟲,Clickjacking蠕蟲,這三類蠕蟲都與具體的漏洞風險有關係,從名字上很好區分。爲了更好地表述Web蠕蟲思想,會順帶提及第四類:文本蠕蟲。

2.這些蠕蟲除了利用的漏洞不一樣,其本質是一樣的,都是使參與進Web2.0交互的用戶受到了欺騙,導致被動或主動(或介於兩者之間)地傳播了威脅。從XSS蠕蟲到CSRF蠕蟲,再從Clickjacking蠕蟲到文本蠕蟲,越往後,社工的成分越大。

3.利用了大衆的心理,在心理作用的驅使下去傳播,我們稱之爲文本蠕蟲。

4.蠕蟲具有的最主要的兩個性質如下:傳播性和病毒行爲。

 

十,關於防禦

發佈了16 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章