OAuth2.0第三方賬號登錄原理及常見漏洞
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
前言目前,很多的系統(tǒng)在登錄的時候都支持通過第三方賬號登錄,如通過微信,qq,微博掃描登錄。這種一般都是通過OAuth2.0搭建完成的。 有一個問題需要思考:通過第三方應(yīng)用登錄的過程是否存在一些安全問題? 本篇文章就來看看OAuth2.0的登錄原理以及可能存在的安全問題。 OAuth2.0登錄原理Oauth2.0具有多種授權(quán)許可機(jī)制協(xié)議:授權(quán)碼許可機(jī)制、客戶端憑據(jù)機(jī)制、資源擁有者憑據(jù)機(jī)制(密碼模式)和隱式許可機(jī)制。 在了解授權(quán)許可機(jī)制協(xié)議之前,我們得需要了解在OAuth 2.0 的體系里面有 4 種角色,按照官方的稱呼它們分別是資源擁有者、客戶端、授權(quán)服務(wù)和受保護(hù)資源。 資源擁有者(可以指擁有資源的用戶) 客戶端(可以理解為第三方系統(tǒng)/軟件) 授權(quán)服務(wù)(權(quán)限校驗和授權(quán)系統(tǒng)(認(rèn)證服務(wù)中心)) 受保護(hù)資源(用戶在系統(tǒng)上所具有的資源/或者能夠訪問的資源) 授權(quán)碼許可機(jī)制授權(quán)碼許可機(jī)制的參與者:資源擁有者、客戶端、授權(quán)服務(wù)、受保護(hù)資源 授權(quán)碼模式這種場景下的授權(quán),第三方軟件可以通過拿到資源擁有者授權(quán)后的授權(quán)碼,以及注冊時的 client_id 和 client_secret 來換回訪問令牌 token 的值。 時序圖
下面以一個網(wǎng)站來看一下具體流程 1)打開網(wǎng)站,選擇使用微信登錄頁面 發(fā)送了下面的請求 每個參數(shù)的含義如下
用微信掃描登錄時需要再微信開放平臺(https://open.weixin.qq.com/)進(jìn)行注冊,注冊完成以后可以拿到AppID和AppSecret兩個。
![]() 這里面可能存在的問題:
2)跳轉(zhuǎn)到授權(quán)頁面,用戶手機(jī)上掃描二維碼 3)手機(jī)上確認(rèn)以后,會返回一個授權(quán)碼(問題:掃描后看是否需要人工確認(rèn)) 返回授權(quán)碼 4)返回授權(quán)碼以后,前端攜帶這個授權(quán)碼到后端,后端就可以與微信端進(jìn)行交互獲取運行的數(shù)據(jù) 資源擁有者憑據(jù)機(jī)制(密碼模式)資源擁有者憑據(jù),顧名思義就是資源擁有者的憑據(jù)(賬號,密碼)。在這場景里面就不存在第三方軟件這概念,相當(dāng)于就是訪問系統(tǒng)中的一個子系統(tǒng),他們之間互相信任。舉個例子來說就是,騰訊有許多的游戲,你只需要用qq賬號密碼就可以登錄游戲玩,不需要進(jìn)行騰訊授權(quán)。因為該游戲是騰訊旗下的,他們相互信任的,所以不存在第三方的說法。 客戶端憑據(jù)機(jī)制的參與者:資源擁有者、客戶端、授權(quán)服務(wù)、受保護(hù)資源 時序圖 客戶端憑據(jù)機(jī)制相當(dāng)于就是第三方軟件訪問不需要資源擁有者授權(quán)的資源和數(shù)據(jù),換句話說在這里客戶端也可以看作是資源擁有者。舉個例子來說就是第三方軟件訪問一些公共的服務(wù),譬如說一些地圖信息,logo圖標(biāo)等。 這種場景下的授權(quán),便是客戶端憑據(jù)許可,第三方軟件可以直接使用注冊時的 client_id 和 client_secret 來換回訪問令牌 token 的值。 客戶端憑據(jù)機(jī)制的參與者:客戶端、授權(quán)服務(wù)、受保護(hù)資源 時序圖 隱式許可機(jī)制隱式許可機(jī)制的場景適用于沒有后端服務(wù)的應(yīng)用,舉個例子來說的話就是在瀏覽器中執(zhí)行,譬如說JavaScript應(yīng)用。 在這種情況下,第三方軟件對于瀏覽器就沒有任何保密的數(shù)據(jù)可以隱藏了,也不再需要應(yīng)用密鑰 app_secret 的值了,也不用再通過授權(quán)碼 code 來換取訪問令牌 access_token 的值了。因此,隱式許可授權(quán)流程的安全性會降低很多。 這種場景下的授權(quán),第三方軟件可以直接使用注冊時的 client_id來換回訪問令牌 token 的值。 時序圖 隱式授權(quán)類型要簡單得多??蛻舳藨?yīng)用程序無需先獲取授權(quán)碼,然后再將其換成訪問令牌,而是在用戶同意后立即收到訪問令牌。 您可能想知道為什么客戶端應(yīng)用程序并不總是使用隱式授權(quán)類型。答案相對簡單 - 它的安全性要低得多。使用隱式授權(quán)類型時,所有通信都通過瀏覽器重定向進(jìn)行 - 沒有像授權(quán)代碼流中那樣的安全反向通道。這意味著敏感的訪問令牌和用戶數(shù)據(jù)更容易受到潛在攻擊。 OAuth 2.0的安全性考慮1)重定向URI的安全性重定向URI是客戶端接收授權(quán)碼和訪問令牌的地址。為了防止攻擊者攔截這些敏感信息,重定向URI應(yīng)該使用HTTPS協(xié)議。此外,授權(quán)服務(wù)器應(yīng)該只接受預(yù)先注冊的重定向URI,以防止攻擊者將用戶重定向到惡意網(wǎng)站。 2)訪問令牌的保護(hù)訪問令牌是一個敏感的憑證,如果被攻擊者獲取,他們就可以訪問用戶的資源。因此,訪問令牌應(yīng)該在所有傳輸過程中使用HTTPS協(xié)議進(jìn)行加密,防止被竊聽。在存儲訪問令牌時,也應(yīng)該使用適當(dāng)?shù)募用艽胧┻M(jìn)行保護(hù)。 3)刷新令牌的使用和保護(hù)刷新令牌通常有較長的有效期,甚至可以設(shè)置為永不過期。因此,如果刷新令牌被攻擊者獲取,他們就可以持續(xù)訪問用戶的資源。為了防止這種情況,刷新令牌應(yīng)該只在后端服務(wù)中使用,不應(yīng)該暴露給前端應(yīng)用。此外,刷新令牌也應(yīng)該在所有傳輸和存儲過程中進(jìn)行加密保護(hù)。 4)CSRF攻擊和防范CSRF(跨站請求偽造)是一種常見的網(wǎng)絡(luò)攻擊,攻擊者通過偽造用戶的請求來執(zhí)行未經(jīng)授權(quán)的操作。為了防止CSRF攻擊,OAuth 2.0的授權(quán)請求可以包含一個state參數(shù),這是一個隨機(jī)生成的字符串,用于在授權(quán)服務(wù)器重定向回客戶端時驗證請求的合法性??蛻舳嗽诎l(fā)送授權(quán)請求時生成state參數(shù),并在接收授權(quán)響應(yīng)時驗證它,如果不匹配,就拒絕響應(yīng)。 OAuth常見漏洞上面介紹了OAuth常見的一些模式,下面我們來分析一下,OAuth可能存在的問題。 1)CSRF攻擊該攻擊一般出現(xiàn)的場景一般在登陸以后綁定微信的情況下。應(yīng)用提供了用戶賬號和微信賬號做綁定的功能,也就是說用戶先用自己的賬號登錄,然后可以綁定微信賬號,以便后續(xù)可以使用微信賬號來登錄。 場景一:攻擊者首先通過自己的微信號獲取授權(quán)碼 code,然后偽造一個鏈接誘導(dǎo)受害者登錄以后點擊,那么受害者的賬號就會與攻擊者的微信號進(jìn)行綁定,從而可以登錄受害者的賬號。 這個后果可想而知。那如何避免這種攻擊呢?方法也很簡單,實際上 OAuth 2.0 中也有這樣的建議,就是使用 state 參數(shù),它是一個隨機(jī)值的參數(shù)。當(dāng)應(yīng)用請求授權(quán)碼的時候附帶一個自己生成 state 參數(shù)值,同時授權(quán)服務(wù)也要按照規(guī)則將這個隨機(jī)的 state 值跟授權(quán)碼 code 一起返回。這樣,當(dāng)應(yīng)用接收到授權(quán)碼的時候,就要在應(yīng)用這一側(cè)做一個 state 參數(shù)值的比對校驗,如果相同就繼續(xù)流程,否則直接拒絕后續(xù)流程。 在這樣的情況下,軟件 A 要想再發(fā)起 CSRF 攻擊,就必須另外構(gòu)造一個 state 值,而這個 state 沒那么容易被偽造。 這本就是一個隨機(jī)的數(shù)值,而且在生成時就遵從了被“猜中”的概率要極小的建議。 2)XSS攻擊當(dāng)請求抵達(dá)受保護(hù)資源服務(wù)時,系統(tǒng)需要做校驗,比如第三方軟件身份合法性校驗、訪問令牌 access_token 的校驗,如果這些信息都不能被校驗通過,受保護(hù)資源服務(wù)就會返回錯誤的信息。大多數(shù)情況下,受保護(hù)資源都是把輸入的內(nèi)容,比如 app_id invalid、access_token invalid ,再回顯一遍,這時就會被 XSS 攻擊者捕獲到機(jī)會。 試想下,如果攻擊者傳入了一些惡意的、搜集用戶數(shù)據(jù)的 JavaScript 代碼,受保護(hù)資源服務(wù)直接原路返回到用戶的頁面上,那么當(dāng)用戶觸發(fā)到這些代碼的時候就會遭受到攻擊。 因此,受保護(hù)資源服務(wù)就需要對這類 XSS 漏洞做修復(fù),而具體的修復(fù)方法跟其它網(wǎng)站防御 XSS 類似,最簡單的方法就是對此類非法信息做轉(zhuǎn)義過濾 3)授權(quán)碼失竊我們知道客戶端在獲取驗證碼后,會調(diào)用回調(diào)地址,然后客戶端服務(wù)器去獲取令牌。那么我們?nèi)绻梢阅玫絼e人的授權(quán)碼,是不是也可以偽造請求直接去獲取令牌了。 攻擊者劫持了授權(quán)碼之后,想要進(jìn)一步獲取令牌,一般還需要請求上下文state:
攻擊者只要想辦法實現(xiàn)上面兩點,就能輕松獲取令牌了。為了實現(xiàn)這一點,攻擊者攔截用戶授權(quán)請求,并將客戶端重定向uri指向自己的頁面,用戶完成身份認(rèn)證和授權(quán),如果授權(quán)服務(wù)器使用寬松的redirect_uri校驗,則會驗證通過生成一個授權(quán)碼,然后帶著授權(quán)碼和state信息重定向到攻擊者頁面,攻擊者拿到授權(quán)碼code和state后會偽造用戶向客戶端的請求(調(diào)用客戶端重定向地址),因為state和code都是受害用戶請求的,所以客戶端驗證通過并向授權(quán)服務(wù)器請求令牌,授權(quán)服務(wù)器接收到的請求會被認(rèn)為是正常請求,校驗通過頒發(fā)token,客戶端獲取到token繼續(xù)請求受保護(hù)資源,資源服務(wù)器將返回請求資源,但是接收資源的人不是正常用戶,而是攻擊者!下面看一下這種攻擊的實現(xiàn)流程: 看到這里可能有一個疑問,我們?nèi)绻カ@取授權(quán)code呢? 4)重定向URL被篡改有的時候,授權(quán)服務(wù)提供方并沒有對第三方軟件的回調(diào) URI 做完整性要求和完整性校驗。 比如,第三軟件 B 的詳細(xì)回調(diào) URI 是https://app.org/callback,那么在完整性校驗缺失的情況下,只要以https://app.org開始或者其他域名的的回調(diào) URI 地址,都會被認(rèn)為是合法的。 那么我們就可以修改回調(diào)地址,然后誘導(dǎo)用戶去點擊這個鏈接,這樣當(dāng)返回code的時候就會去回調(diào)我們修改后的地址,這樣就可以在服務(wù)器上看到其code。進(jìn)而按照授權(quán)碼失竊來進(jìn)行攻擊 問題:大部分的授權(quán)服務(wù)器都限制了url的host頭,如何進(jìn)行利用? 第一種方式:結(jié)合任意url跳轉(zhuǎn)。如果驗證服務(wù)器沒有完全匹配,可以通過../這種方式改變路徑的??梢栽陧撁嫔险乙粋€任意url跳轉(zhuǎn)漏洞,配合這種漏洞進(jìn)行利用。 如下圖,通過../改變路徑,然后將跳轉(zhuǎn)的url指向我們的服務(wù)器,這樣就可以在服務(wù)器的日志上看到想要的內(nèi)容 第二種方式:尋找可以留言的地方。然后將內(nèi)容發(fā)送留言的內(nèi)容中去獲取 5)登錄流程設(shè)計缺陷登錄流程如果存在設(shè)計缺陷也可能會導(dǎo)致接管其它人的賬號。如掃描登錄時無需人員確認(rèn),那么就可以將二維碼發(fā)送給其他人誘導(dǎo)點擊。 portswigger案例OAuth 隱式流程繞過身份驗證 https://portswigger.net/web-security/oauth/lab-oauth-authentication-bypass-via-oauth-implicit-flow 使用給的用戶名和密碼登錄 username=wiener&password=peter 這里只校驗了token,然后根據(jù)email判斷登錄用戶,我們替換email重放數(shù)據(jù)包就可以登錄到其它賬號 成功完成 其它的實驗內(nèi)容可以看下面的鏈接 https://xz.aliyun.com/t/13349 總結(jié)OAuth2.0的漏洞總體上來說就是下面的兩種 1)獲取到授權(quán)code,獲取授權(quán)code的方式就是未驗證回調(diào)url,這種方式比較困難 2)就是綁定微信時利用CSRF漏洞,將攻擊者的微信綁定到受害者的賬號上。這種需要與用戶有交互也比較困難。 一個安全的OAuth2.0認(rèn)證應(yīng)該做到下面的幾點
參考鏈接https://blog.csdn.net/qq_43284469/article/details/132510807 https://blog.csdn.net/u010020088/article/details/143903471 https://cloud.tencent.com/developer/article/2418791 https://www.cnblogs.com/hellowhy/p/15533625.html https://xz.aliyun.com/t/13349 閱讀原文:原文鏈接 該文章在 2025/5/14 9:24:58 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |