本文分享的是一個Facebook CSRF漏洞,用Gmail或G-Suite賬戶來驗證新創(chuàng)建Facebook賬戶時存在的CSRF令牌驗證機制漏洞,攻擊者利用該漏洞,可在驗證新創(chuàng)建Facebook賬戶時,以最小用戶交互方式用受害者郵箱驗證其注冊的Facebook賬戶,實現(xiàn)間接CSRF攻擊。
OAuth登錄機制對CSRF token驗證不足
當用戶用Gmail或G-Suite賬號來創(chuàng)建一個新的Facebook賬戶時,存在以下兩種身份驗證機制:
1、從Gmail中接收5位數(shù)的驗證碼,然后在Facebook網(wǎng)頁中輸入以確認。
2、從Gmail或G-Suite賬號的第三方進行OAuth授權(quán)跳轉(zhuǎn)登錄。
要繞過第一種方法估計很難了,F(xiàn)acebook后端部署的Checkpoint安防設(shè)備和強大的速率限制條件,會毫不客氣地阻斷任何暴力破解和可疑行為。所以,我們來觀察一下第二種方法,經(jīng)過一番測試,我在其中發(fā)現(xiàn)了一個CSRF漏洞,原因在于,在OAuth授權(quán)跳轉(zhuǎn)登錄過程中缺少必要的CSRF令牌驗證機制。
OAuth Login鏈接如下:
https://accounts.google.com/signin/oauth/identifier?client_id=15057814354-80cg059cn49j6kmhhkjam4b00on1gb2n.apps.googleusercontent.com&as=dOwxqXYIm0eQvYuxmp-ODA&destination=https%3A%2F%2Fwww.facebook.com&approval_state=!ChRLcHh5R0tQVzRXUWJSOFRIbG85ZRIfb19Dd1BsY0tpbGtYd0ktM2lWMU9TaWNIbzUyOTlCWQ%E2%88%99AJDr988AAAAAXghyvi5iRjgT2N1tdaquUxqUTQOYK4V4&oauthgdpr=1&xsrfsig=ChkAeAh8T8oLnsrNQd99XQIe69KD7-njhen9Eg5hcHByb3ZhbF9zdGF0ZRILZGVzdGluYXRpb24SBXNvYWN1Eg9vYXV0aHJpc2t5c2NvcGU&flowName=GeneralOAuthFlow
請注意,其中的state參數(shù)為一個CSRF令牌,該令牌用于在一些跨站點的請求響應(yīng)中,去驗證那些經(jīng)身份驗證過的用戶,以此來防止攻擊者蓄意的CSRF攻擊。
通常來說,如果在上述OAuth Login過程中,該state參數(shù)由客戶端的 Firefox 瀏覽器生成,那么,該參數(shù)令牌也僅限于在該Firefox瀏覽器中驗證有效。但是,這里的問題是,該OAuth Login機制還缺乏必要的驗證措施,也就是,這里的這個state參數(shù)(CSRF token)可用在任何其他客戶端瀏覽器中實現(xiàn)有效驗證。
所以,對攻擊者來說,可以簡單地把上述URL鏈接進行嵌入構(gòu)造到一個網(wǎng)頁中,只要受害者點擊到該網(wǎng)頁,攻擊者就能以受害者身份(如注冊郵箱victim_email@gmail.com)完成Facebook賬戶的身份驗證,實現(xiàn)間接的CSRF攻擊。
但是,這里還有一個問題,那就是受害者在點擊攻擊者構(gòu)造的頁面之前,攻擊者Facebook賬戶需要在受害者瀏覽器中實現(xiàn)登錄,而這里,剛好可用Facebook的一鍵式登錄(Log In With One Click)來完成這個動作。
把以下Facebook的一鍵式登錄鏈接嵌入到惡意網(wǎng)頁的IFrame中,當受害者點擊網(wǎng)頁后,攻擊者Facebook賬戶就可在受害者瀏覽器中完成登錄加載。
https://www.facebook.com/recover/password/?u=100008421723582&n=232323&ars=one_click_login&fl=one_click_login&spc=1&ocl=1&sih=0
之后,當OAuth Login按鈕被受害者點擊后,受害者郵箱被攻擊者用來確認登錄了Facebook,之后,再用以下鏈接來退出攻擊者的Facebook賬戶:
https://m.facebook.com/logout.php?h=17AfealsadvYomDS
結(jié)合以上方法構(gòu)造出一個惡意頁面,攻擊者就能用受害者郵箱(如以下視頻中的Gmail)完成新創(chuàng)建Facebook賬戶的驗證了。
(需要視頻嵌入)
https://www.youtube.com/watch?time_continue=8&v=SmRVIip_ySE
總結(jié)
總體來說,該漏洞危害確實有限,原因在于Facebook的第三方OAuth Login過程中缺乏對CSRF token的有效驗證,導致攻擊者可以利用不變的CSRF token來做文章。但隨著Web應(yīng)用的不斷發(fā)展,各種場景下的第三方OAuth機制越來越多,其存在的問題和漏洞將會非常值得注意。
漏洞上報進程
2019.5.10 : 漏洞初報 2019.5.17 : Facebook跟進調(diào)查 2019.5.31 : Facebook修復(fù) 2019.6.19 : Facebook獎勵我$3,000
相關(guān)文章教程推薦:服務(wù)器安全教程