2018年10月20日 星期六

《面試官別再問》跨站請求偽造(Cross-site request forgery)&& JWT (JSON Web Token)

利用網站可信認用戶的權限去執行未授權的命令的一種惡意攻擊。通過偽裝可信用戶的請求來利用信任該用戶的網站,這種攻擊方式雖然不是很流行,但是卻難以防範,其危害也不比其他安全漏洞小。

簡單點說,CSRF攻擊就是攻擊者利用受害者的身份,以受害者的名義發送惡意請求。與XSS(跨站點腳本,跨站腳本攻擊)不同的是,XSS的目的是獲取用戶的身份信息,攻擊者竊取到的是用戶的身份(會話/ cookie中),而CSRF則是利用用戶當前的身份去做一些未經過授權的操作。

CSRF攻擊最早在2001年被發現,由於它的請求是從用戶的IP地址發起的,因此在服務器上的網絡日誌中可能無法檢測到是否受到了CSRF攻擊,正是由於它的這種隱蔽性,很長時間以來都沒有被公開的報告出來,直到2007年才真正的被人們所重視。

CSRF有哪些危害
CSRF可以盜用受害者的身份,完成受害者在網頁瀏覽器有權限進行的任何操作,想想吧,能做的事情太多了。

以你的名義發送詐騙郵件,消息
用你的賬號購買商品
用你的名義完成虛擬貨幣轉賬

洩露個人隱私



第一,登錄受害者網站。如果受害者網站是基於cookie的用戶驗證機制,那麼當用戶登錄成功後,瀏覽器就會保存一份服務端的SESSION ID。

第二,這時候在同一個瀏覽器打開攻擊者網站,雖然說它無法獲取SESSION ID是什麼(因為設置了http only的cookie是無法被JavaScript獲取的),但是從瀏覽器向受害者網站發出的任何請求中,都會攜帶它的cookie,無論是從哪個網站發出。

第三,利用這個原理,在攻擊者網站發出一個請求,命令受害者網站進行一些敏感操作。由於此時發出的請求是處於會話中的,所以只要該用戶有權限,那麼任何請求都會被執行。

跨站腳本攻擊(Cross-site scripting)
跨站腳本攻擊Cross-site scripting (XSS)是一種安全漏洞,攻擊者可以利用這種漏洞在網站上註入惡意的客戶端代碼。當被攻擊者登陸網站時就會自動運行這些惡意代碼,從而,攻擊者可以突破網站的訪問權限,冒充受害者。
如果web應用程序沒有部署足夠的安全驗證,那麼,這些攻擊很容易成功。瀏覽器無法探測到這些惡意腳本是不可信的,所以,這些腳本可以任意讀取cookie,session tokens,或者其它敏感的網站信息,或者讓惡意腳本重寫html內容。
XSS利用的是用戶對指定網站的信任,CSRF利用的是網站對用戶網頁瀏覽器的信任。

防禦措施


檢查引薦字段
添加校驗令牌

JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信

首先,某client 使用自己的賬號密碼發送post 請求login,由於這是首次接觸,服務器會校驗賬號與密碼是否合法,如果一致,則根據密鑰生成一個token 並返回,client 收到這個token 並保存在本地。在這之後,需要訪問一個受保護的路由或資源時,只要附加上token(通常使用Header 的Authorization 屬性)發送到服務器,服務器就會檢查這個token 是否有效,並做出響應。

一個JWT實際上就是一個字符串,它由三部分組成,頭部,載荷與簽名。
// $Signature
HS256(Base64(Header) + "." + Base64(Payload), secretKey)

// JWT
JWT = Base64(Header) + "." + Base64(Payload) + "." + $Signature
頭部(頭)

頭部用於描述關於該JWT的最基本的信息,例如其類型以及簽名所用的算法等。這也可以被表示成一個JSON對象。

載荷(Payload)
我們先將上面的添加好友的操作描述成一個JSON對象。其中添加了一些其他的信息,幫助今後收到這個JWT的服務器理解這個JWT。

iss: 該JWT的簽發者
sub: 該JWT所面向的用戶
aud: 接收該JWT的一方
exp(expires): 什麼時候過期,這裡是一個Unix時間戳
iat(issued at): 在什麼時候簽發的

JWT的幾個特點

(1)JWT默認是不加密,但也是可以加密的。生成原始Token以後,可以用密鑰再加密一次。

(2)JWT不加密的情況下,不能將秘密數據寫入JWT。

(3)JWT不僅可以用於認證,也可以用於交換信息。有效使用JWT,可以降低服務器查詢數據庫的次數。

(4)JWT的最大缺點是,由於服務器不保存會話狀態,因此無法在使用過程中廢止某個令牌,或者更改令牌的權限。也就是說,一旦JWT簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。

(5)JWT本身包含了認證信息,一旦洩露,任何人都可以獲得該令牌的所有權限。為了減少盜用,JWT的有效期應該設置得比較短。對於一些比較重要的權限,使用時應該再次對用戶進行認證。

(6)為了減少盜用,JWT不應該使用HTTP協議明碼傳輸,要使用HTTPS協議傳輸。


使用 JWT 可以預防 CSRF 攻擊?

CSRF 的防禦是透過 CSRF Token 來防範,在此與 Session 機制無關。由於使用方式是透過 Cookie 跟 LocalStorage,只要 JavaScript 可以 Work 就有風險被竊取 Token 造成攻擊

沒有留言:

張貼留言

網誌存檔