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