發布者認證信息(營業執照和身份證)未完善,請登錄后完善信息登錄
WebSocket应用安全问题分析-亿华网

久久天天躁狠狠躁夜夜,国精品无码一区二区三区左线,色综合网天天综合色中文,国产suv精品一区二区883,午夜精品一区二区三区的区别

首頁 » 資訊 » 編程開發 > WebSocket應用安全問題分析

WebSocket應用安全問題分析

  發布時間 : 2017-09-05 11:43:00 63
內容提要
1. WebSocket特性介紹WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。WebSocket通信協議于2011年被I

1. WebSocket特性介紹

WebSocket是HTML5開始提供的一種瀏覽器與服務器間(jian)進行全雙工通(tong)訊的網絡(luo)技術。WebSocket通(tong)信協議于2011年被IETF定為(wei)(wei)標準RFC 6455,WebSocket API也被W3C定為(wei)(wei)標準,主流的瀏覽(lan)器都已經支持WebSocket通(tong)信。

WebSocket協議是基于TCP協議上的獨立的通信協議,在建立WebSocket通信連(lian)(lian)接前,需要(yao)使(shi)用HTTP協議進行握手,從HTTP連(lian)(lian)接升級(ji)為WebSocket連(lian)(lian)接。瀏(liu)覽器(qi)(qi)和服務(wu)器(qi)(qi)只需要(yao)完成一次握手,兩(liang)者(zhe)之間就直接可以創建持(chi)久性的連(lian)(lian)接,并進行雙向數(shu)據(ju)傳(chuan)輸(shu)。

WebSocket定義(yi)了兩種(zhong)URI格式, “ws://“和(he)“wss://”,類似(si)于HTTP和(he)HTTPS, “ws://“使用明(ming)文傳輸,默認(ren)端(duan)口(kou)為80,”wss://“使用TLS加密傳輸,默認(ren)端(duan)口(kou)為443。

  1. ws-URI : "ws://host[:port]path[?query]"
  2. wss-URI : "wss://host[:port]path[?query]"

WebSocket 握(wo)手階段,需(xu)要(yao)用到一些HTTP頭,升級HTTP連接為WebSocket連接如(ru)下表所示。

HTTP頭 是否必須 解釋
Host 服務端主機
Upgrade 固定值,”websocket”
Connection 固定值,”Upgrade”
Sec-WebSocket-Key 客戶端臨時生成的16字節隨機值, base64編碼
Sec-WebSocket-Version WebSocket協議版本
Origin 可選, 發起連接請求的源
Sec-WebSocket-Accept 是(服務端) 服務端識別連接生成的隨機值
Sec-WebSocket-Protocol 可選,客戶端支持的協議
Sec-WebSocket-Extensions 可選, 擴展字段

一(yi)次(ci)完整的握手連接如下圖:

一旦服務器端(duan)返回(hui) 101 響應(ying),即可完成(cheng) WebSocket 協議切(qie)換(huan)。服務器端(duan)可以(yi)基(ji)于相同(tong)端(duan)口(kou),將通信協議從 //或 // 切(qie)換(huan)到(dao) ws://或 wss://。協議切(qie)換(huan)完成(cheng)后,瀏覽(lan)器和(he)服務器端(duan)可以(yi)使用 WebSocket API 互相發(fa)送和(he)收(shou)取文本和(he)二進(jin)制消息。

2. WebSocket應用安全問題

WebSocket作(zuo)為一種通信協議引(yin)入(ru)到Web應(ying)用(yong)中,并不(bu)會(hui)解決Web應(ying)用(yong)中存在的安全(quan)(quan)(quan)問(wen)(wen)題(ti),因(yin)此WebSocket應(ying)用(yong)的安全(quan)(quan)(quan)實現(xian)是由開(kai)(kai)發者或服務端負責。這就(jiu)要求(qiu)開(kai)(kai)發者了解WebSocket應(ying)用(yong)潛(qian)在的安全(quan)(quan)(quan)風險,以及如何做到安全(quan)(quan)(quan)開(kai)(kai)發規避這些安全(quan)(quan)(quan)問(wen)(wen)題(ti)。

2.1 認證

WebSocket 協議沒有規定服務器在握手階段應該如何認證客戶端身份。服務器可以采用任何 HTTP 服務器的客戶端身份認證機制,如 cookie認(ren)(ren)證(zheng)(zheng)(zheng),HTTP 基(ji)礎認(ren)(ren)證(zheng)(zheng)(zheng),TLS 身份認(ren)(ren)證(zheng)(zheng)(zheng)等(deng)。在(zai)WebSocket應用(yong)認(ren)(ren)證(zheng)(zheng)(zheng)實現上(shang)面臨的(de)安全問題(ti)和(he)傳統的(de)Web應用(yong)認(ren)(ren)證(zheng)(zheng)(zheng)是(shi)相同的(de),如:CVE-2015-0201, Spring框架的(de)Java SockJS客戶(hu)端生(sheng)成可預測的(de)會話(hua)ID,攻(gong)擊者可利(li)用(yong)該漏洞向其他會話(hua)發送消息; CVE-2015-1482, Ansible Tower未對用(yong)戶(hu)身份進行(xing)認(ren)(ren)證(zheng)(zheng)(zheng),遠(yuan)程(cheng)攻(gong)擊者通過websocket連接獲取敏(min)感信息。

2.2 授權

同(tong)認證(zheng)一(yi)樣,WebSocket協議沒(mei)有指定任何授權(quan)方式,應用程序中用戶資(zi)源訪問等(deng)的授權(quan)策略由服務端或開發者(zhe)實現。WebSocket應用也(ye)會存在和傳統Web應用相同(tong)的安全風險,如(ru):垂直權(quan)限(xian)提升(sheng)和水平(ping)權(quan)限(xian)提升(sheng)。

2.3 跨域請求

WebSocket使用基于(yu)源(yuan)的(de)(de)(de)安全模型(xing),在發(fa)起WebSocket握手(shou)請(qing)求(qiu)(qiu)時,瀏覽器會在請(qing)求(qiu)(qiu)中添加一個名為(wei)Origin的(de)(de)(de)HTTP頭(tou),Oringin字段表示發(fa)起請(qing)求(qiu)(qiu)的(de)(de)(de)源(yuan),以此來(lai)防(fang)止未經授權(quan)的(de)(de)(de)跨站(zhan)(zhan)點訪(fang)問請(qing)求(qiu)(qiu)。WebSocket 的(de)(de)(de)客戶端(duan)不(bu)僅(jin)僅(jin)局限于(yu)瀏覽器,因此 WebSocket 規范(fan)沒有強制規定握手(shou)階(jie)段的(de)(de)(de) Origin 頭(tou)是必需的(de)(de)(de),并(bing)且(qie)WebSocket不(bu)受瀏覽器同源(yuan)策略的(de)(de)(de)限制。如果服(fu)務(wu)(wu)端(duan)沒有針對Origin頭(tou)部(bu)進行驗證可能會導致跨站(zhan)(zhan)點WebSocket劫持攻擊。該(gai)漏洞(dong)最早在 2013 年被(bei)Christian Schneider 發(fa)現并(bing)公(gong)開,Christian 將(jiang)之(zhi)命名為(wei)跨站(zhan)(zhan)點 WebSocket 劫持 (Cross Site WebSocket Hijacking)(CSWSH)。跨站(zhan)(zhan)點 WebSocket 劫持危害(hai)大,但容易被(bei)開發(fa)人員(yuan)忽視。相關(guan)案例可以參考: IPython Notebook(CVE-2014-3429), OpenStack Compute(CVE-2015-0259), Zeppelin WebSocket服(fu)務(wu)(wu)器等跨站(zhan)(zhan)WebSocket劫持。

上圖展示了跨站WebSocket劫持的過程,某個用戶已經登錄了WebSocket應用程序,如果他被誘騙訪問了某個惡意網頁,而惡意網頁中植入了一段js代碼,自動發起 WebSocket 握手請求跟目標應用建立 WebSocket 連接。注意到,Origin 和 Sec-WebSocket-Key 都是由瀏覽器自動生成的,瀏覽器再次發起請求訪問目標服務器會自動帶上cookie 等身份(fen)認(ren)證參數(shu)(shu)。如果服(fu)(fu)務(wu)器(qi)端(duan)沒(mei)有檢查 Origin頭,則該請求(qiu)會成(cheng)功握手切換(huan)到(dao) WebSocket 協議(yi),惡意網頁就(jiu)可(ke)以(yi)成(cheng)功繞(rao)過身份(fen)認(ren)證連接到(dao) WebSocket 服(fu)(fu)務(wu)器(qi),進(jin)而竊取到(dao)服(fu)(fu)務(wu)器(qi)端(duan)發來的信息(xi),或者發送(song)偽(wei)(wei)造(zao)(zao)信息(xi)到(dao)服(fu)(fu)務(wu)器(qi)端(duan)篡(cuan)改(gai)(gai)服(fu)(fu)務(wu)器(qi)端(duan)數(shu)(shu)據(ju)。與傳統(tong)跨站請求(qiu)偽(wei)(wei)造(zao)(zao)(CSRF)攻(gong)擊相(xiang)比,CSRF 主要是通過惡意網頁悄(qiao)悄(qiao)發起數(shu)(shu)據(ju)修改(gai)(gai)請求(qiu),而跨站 WebSocket 偽(wei)(wei)造(zao)(zao)攻(gong)擊不僅可(ke)以(yi)修改(gai)(gai)服(fu)(fu)務(wu)器(qi)數(shu)(shu)據(ju),還可(ke)以(yi)控制整(zheng)個雙向(xiang)通信通道。也正是因為這個原因,Christian 將這個漏洞命名為劫持(Hijacking),而不是請求(qiu)偽(wei)(wei)造(zao)(zao)(Request Forgery)。

理解了跨站WebSocket劫持攻擊的原理和過程,那么如何(he)防(fang)范(fan)這(zhe)種攻擊(ji)呢?處理也(ye)比(bi)較簡(jian)單,在服(fu)務器(qi)端的代碼(ma)中(zhong)增加 對(dui)Origin頭的檢查,如果客戶(hu)端發(fa)來的 Origin 信息(xi)來自不同域(yu),服(fu)務器(qi)端可以(yi)拒(ju)絕該請求。但是(shi)僅(jin)僅(jin)檢查 Origin 仍然(ran)是(shi)不夠安全的,惡意網頁可以(yi)偽造Origin頭信息(xi),繞過服(fu)務端對(dui)Origin頭的檢查,更完(wan)善的解決(jue)方(fang)案可以(yi)借(jie)鑒CSRF的解決(jue)方(fang)案-令牌(pai)機制。

2.4 拒絕服務

WebSocket設計為面向(xiang)連接(jie)的協議,可(ke)被利用引起客戶端(duan)和服(fu)(fu)務(wu)器端(duan)拒(ju)絕服(fu)(fu)務(wu)攻擊,相關案例(li)可(ke)參考: F5 BIG-IP遠(yuan)程(cheng)拒(ju)絕服(fu)(fu)務(wu)漏洞(dong)(CVE-2016-9253)。

(1). 客戶端拒絕服務

WebSocket連(lian)(lian)(lian)接(jie)(jie)限(xian)制不(bu)同于HTTP連(lian)(lian)(lian)接(jie)(jie)限(xian)制,和HTTP相(xiang)比(bi),WebSocket有一個(ge)更高(gao)的(de)連(lian)(lian)(lian)接(jie)(jie)限(xian)制,不(bu)同的(de)瀏覽(lan)器有自(zi)己特(te)定(ding)的(de)最大連(lian)(lian)(lian)接(jie)(jie)數(shu),如:火狐瀏覽(lan)器默認最大連(lian)(lian)(lian)接(jie)(jie)數(shu)為200。通過(guo)發(fa)送惡(e)意內容,用盡允(yun)許的(de)所(suo)有Websocket連(lian)(lian)(lian)接(jie)(jie)耗盡瀏覽(lan)器資源(yuan),引起拒絕服務。

(2). 服務器端拒絕服務

WebSocket建立的是持久連接,只有客戶端或服務端其中一發提出關閉連接的請求,WebSocket連接才關閉,因此攻擊者可以向服務器發起大量的申請建(jian)立(li)WebSocket連(lian)接(jie)(jie)的(de)請(qing)求,建(jian)立(li)持久連(lian)接(jie)(jie),耗盡服務器資(zi)源,引發(fa)拒(ju)絕(jue)服務。針對這種攻(gong),可以(yi)通過(guo)設置單IP可建(jian)立(li)連(lian)接(jie)(jie)的(de)最(zui)大(da)(da)連(lian)接(jie)(jie)數的(de)方(fang)式防范。攻(gong)擊者還(huan)可以(yi)通過(guo)發(fa)送(song)一個(ge)單一的(de)龐大(da)(da)的(de)數據幀(zhen)(如, 2^16),或(huo)者發(fa)送(song)一個(ge)長流的(de)分片消息的(de)小(xiao)(xiao)幀(zhen),來耗盡服務器的(de)內存,引發(fa)拒(ju)絕(jue)服務攻(gong)擊, 針對這種攻(gong)擊,通過(guo)限制幀(zhen)大(da)(da)小(xiao)(xiao)和多個(ge)幀(zhen)重組后的(de)總消息大(da)(da)小(xiao)(xiao)的(de)方(fang)式防范。

2.5 中間人攻擊

WebSocket使用HTTP或HTTPS協(xie)議進行握(wo)(wo)手請(qing)(qing)求(qiu),在使用HTTP協(xie)議的情況下,若存在中間人可以(yi)嗅探HTTP流量,那么中間人可以(yi)獲取并篡改WebSocket握(wo)(wo)手請(qing)(qing)求(qiu),通過偽造客(ke)戶端(duan)信息與服務器(qi)建立WebSocket連接(jie),如下圖所示。防范這種攻(gong)擊(ji),需要在加密(mi)信道(dao)上建立WebSocket連接(jie),使用HTTPS協(xie)議發起握(wo)(wo)手請(qing)(qing)求(qiu)。

2.6 輸入校驗

WebSocket應用和傳統Web應用一樣,都需(xu)要(yao)對輸入進行(xing)校(xiao)驗,來防范來客戶端(duan)的XSS攻擊(ji),服務(wu)端(duan)的SQL注(zhu)入,代碼注(zhu)入等攻擊(ji)。

3. 總結

Websocket是(shi)一個基于TCP的HTML5的新協議,可以實現瀏覽(lan)器和服(fu)務(wu)器之間(jian)的全(quan)雙(shuang)工通訊。在即(ji)時通訊等(deng)應(ying)用中,WebSocket具有很(hen)大(da)的性能優勢, 并且(qie)非常適(shi)合全(quan)雙(shuang)工通信,但是(shi),和任何其他技術一樣,開發WebSocket應(ying)用也需要考慮潛在的安全(quan)風(feng)險。

4. 參考

  • BH_US_12_Shekyan_Toukharian_Hacking_Websocket
  • //blog.stratumsecurity.com/2016/06/13/websockets-auth/
  • //resources.infosecinstitute.com/websocket-security-issues/#gref
  • //blog.ironwasp.org/2014/11/analysing-testing-and-fuzzing-websocket.html
  • //www.ibm.com/developerworks/cn/java/j-lo-websocket-cross-site/index.html
  • //www.cnblogs.com/r00tgrok/p/3848789.html
  • //lambdaops.com/cross-origin-websocket-hijacking-of-ipython/
  • //github.com/zhangkaitao/websocket-protocol/wiki/10.%E5%AE%89%E5%85%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9
layui

微信掃碼關注 億(yi)華聯眾(zhong) 公眾(zhong)號

頭條推薦