一、禁止一切外鏈資源css
外鏈會產生站外請求,所以能夠被利用實施 CSRF 攻擊。html
目前國內有大量路由器存在 CSRF 漏洞,其中至關部分用戶使用默認的管理帳號。經過外鏈圖片,便可發起對路由器 DNS 配置的修改,這將成爲國內互聯網最大的安全隱患。前端
案例演示web
百度旅遊在富文本過濾時,未考慮標籤的 style 屬性,致使容許用戶自定義的 CSS。所以能夠插入站外資源:後端
全部瀏覽該頁面的用戶,都能發起任意 URL 的請求:瀏覽器
因爲站外服務器徹底不受控制,攻擊者能夠控制返回內容:緩存
●若是檢測到是管理員,或者外鏈檢查服務器,能夠返回正常圖片;安全
●若是是普通用戶,能夠返回 302 重定向到其餘 URL,發起 CSRF 攻擊。例如修改路由器 DNS:服務器
http://admin:admin@192.168.1.1/userRpm/PPPoECfgAdvRpm.htm?wan=0&lcpMru=1480&ServiceName=&AcName=&EchoReq=0&manual=2&dnsserver=黑客服務器&dnsserver2=4.4.4.4&downBandwidth=0&upBandwidth=0&Save=%B1%A3+%B4%E6&Advanced=Advanced
演示中,隨機測試了幾個帖子,在兩天時間裏收到圖片請求 500 屢次,已有近 10 個不一樣的 IP 開始向咱們發起 DNS 查詢。網絡
經過中間人代理,用戶的全部隱私都能被捕捉到。還有更嚴重的後果,查考流量劫持危害探討
要是在熱帖裏『火前留名』,那麼數量遠不止這些。
若是使用發帖腳本批量回復,將有數以萬計的用戶網絡被劫持。
防範措施
杜絕用戶的一切外鏈資源。須要站外圖片,能夠抓回後保存在站內服務器裏。
對於富文本內容,使用白名單策略,只容許特定的 CSS 屬性。
儘量開啓 Content Security Policy 配置,讓瀏覽器底層來實現站外資源的攔截。
二、富文本前端掃描
富文本是 XSS 的重災區。
富文本的實質是一段 Html 字符。因爲歷史緣由,Html 兼容衆多不規範的用法,致使過濾起來較複雜。幾乎全部使用富文本的產品,都曾出現過 XSS 注入。
案例演示
旅遊發帖支持富文本,咱們繼續剛纔的演示。
因爲以前已修復過幾回,目前只能注入 embed 標籤和 src 屬性。
但即便這樣,仍然能夠嵌入一個框架頁面:
op.location,將頁面跳轉到第三方站點。
將原頁面嵌入到全屏的 iframe 裏,僞造出相同的界面。而後經過浮層登陸框,進行釣魚。
總之,富文本中出現可執行的元素,頁面安全性就大打折扣了。
防範措施
這裏不考慮後端的過濾方法,講解使用前端預防方案:
不管攻擊者使用各類取巧的手段,繞事後端過濾,但這些 HTML 字符最終都要在前端構形成元素,並渲染出來。
所以能夠在 DOM 構造以後、渲染以前,對離屏的元素進行風險掃描。將可執行的元素(script,iframe,frame,object,embed,applet)從緩存中移除。
或者給存在風險的元素,加上沙箱隔離屬性。
●例如 iframe 加上 sandbox 屬性,便可只顯示框架內容而不運行腳本]
●例如 Flash 加上 allowScriptAccess 及 allowNetworking,也能起到必定的隔離做用。
DOM 僅僅被構造是不會執行的,只有添加到主節點被渲染時纔會執行。因此這個過程當中間,能夠實施安全掃描。
實現細節能夠參考:http://www.etherdream.com/FunnyScript/richtextsaferender.html
若是富文本是直接輸入到靜態頁面裏的,能夠考慮使用 MutationEvent 進行防護。詳細參考:http://fex.baidu.com/blog/2014/06/xss-frontend-firewall-2/
但推薦使用動態方式進行渲染,可擴展性更強,而且性能消耗最小。
三、跳轉 opener 釣魚
瀏覽器提供了一個 opener 屬性,供彈出的窗口訪問來源頁。但該規範設計的並不合理,致使經過超連接打開的頁面,也能使用 opener。
所以,用戶點了網站裏的超連接,致使原頁面被打開的第三方頁面控制。
雖然二者受到同源策略的限制,第三方沒法訪問原頁面內容,但能夠跳轉原頁面。
因爲用戶的焦點在新打開的頁面上,因此原頁面被悄悄跳轉,用戶難以覺察到。當用戶切回原頁面時,其實已經在另外一個釣魚網站上了。
案例演示
百度貼吧目前使用的超連接,就是在新窗口中彈出,所以一樣存在該缺陷。
攻擊者發一個吸引用戶的帖子。當用戶進來時,引誘他們點擊超連接。
一般故意放少部分的圖片,或者是不會動的動畫,先讓用戶預覽一下。要是用戶想看完整的,就得點下面的超連接:
因爲擴展名是 gif 等圖片格式,大多用戶就毫無顧慮的點了。
事實上,真正的類型是由服務器返回的 MIME 決定的。因此這個站外資源徹底有多是一個網頁:
當用戶停留在新頁面裏看動畫時,隱匿其中的腳本已悄悄跳轉原頁面了。
用戶切回原頁面時,其實已在一個釣魚網站上:
在此之上,加些浮層登陸框等特效,頗有可能釣到用戶的一些帳號信息。
防範措施
該缺陷是由於 opener 這個屬性引發的,因此得屏蔽掉新頁面的這個屬性。
但經過超連接打開的網頁,沒法被腳本訪問到。只有經過 window.open 彈出的窗口,才能得到其對象。
因此,對頁面中的用戶發佈的超連接,監聽其點擊事件,阻止默認的彈窗行爲,而是用 window.open 代替,並將返回窗體的 opener 設置爲 null,便可避免第三方頁面篡改了。
詳細實現參考:http://www.etherdream.com/FunnyScript/opener_protect.html
固然,實現中無需上述 Demo 那樣複雜。根據實際產品線,只要監聽用戶區域的超連接就能夠。
四、用戶內容權限
支持自定義裝扮的場合,每每是釣魚的高發區。
一些別有用心者,利用裝扮來模仿系統界面,引誘用戶上鉤。
案例演示 - 空間越界
百度空間容許用戶撰寫自定格式的內容。
其本質是一個富文本編輯器,這裏不演示 XSS 漏洞,而是利用樣式裝扮,假裝一個釣魚界面。
百度空間富文本過濾元素、部分屬性及 CSS 樣式,但未對 class 屬性啓用白名單,所以能夠將頁面上全部的 CSS 類樣式,應用到本身的內容上來。
防範措施
規定用戶內容尺寸限制,能夠在提交時由用戶本身肯定。
不該該爲用戶的內容分配無限的尺寸空間,以避免惡意用戶設置超大字體,破壞整個頁面的瀏覽。
最好將用戶自定義的內容嵌套在 iframe 裏,以避免影響到頁面其餘部位。
若是必須在同頁面,應將用戶內容所在的容器,設置超過部分不可見。以避免因不可預測的 BUG,致使用戶能將內容越界到產品界面上。
案例演示 - 功能越界
自定義裝扮一般支持站外超連接。
相比貼吧這類簡單純文字,富文本能夠將超連接設置在其餘元素上,例如圖片。
所以這類連接很是具備迷惑性,用戶不經意間就點擊到。很容易觸發以前提到的修改 opener 釣魚。
若是在圖片內容上進行假裝,更容易讓用戶觸發一些危險操做。
要是和以前的區域越界配合使用,迷惑性則更強:
防範措施
和以前同樣,對於用戶提供的超連接,在點擊時進行掃描。若是是站外地址,則經過後臺跳轉進入,以便後端對 URL 進行安全性掃描。
若是服務器檢測到是一個惡意網站,或者目標資源是可執行文件,應給予用戶強烈的警告,告知其風險。
五、點擊劫持檢測
點擊劫持算是比較老的攻擊方式了,基本原理你們也都據說過。就是在用戶不知情的前提下,點擊隱藏框架頁面裏的按鈕,觸發一些重要操做。
但目前在點擊劫持上作防護的並很少,包括百度絕大多數產品線目前都未考慮。
案例演示
能直接經過點擊完成的操做,比較有意義的就是關注某用戶。例如百度貼吧加關注的按鈕:
攻擊者事先算出目標按鈕的尺寸和座標,將頁面嵌套在本身框架裏,並設置框架的偏移,最終只顯示按鈕:
接着經過 CSS 樣式,將目標按鈕放大,佔據整個頁面空間,並設置全透明。
這時雖看不到按鈕,但點擊頁面任意位置,都能觸發框架頁中加關注按鈕的點擊:
防範措施
事實上,點擊劫持是很好防護的。
由於自身頁面被嵌套在第三方頁面裏,只需判斷 self == top 便可獲知是否被嵌套。
對一些重要的操做,例如加關注、刪帖等,應先驗證是否被嵌套。若是處於第三方頁面的框架裏,應彈出確認框提醒用戶。
確認框的座標位置最好有必定的隨機偏移,從而使攻擊者構造的點擊區域失效。
來自:百度FEX WEB前端開發部
連接:http://fex.baidu.com/blog/2014/06/web-sec-2014/