引言
微信掃描二維碼登錄網站,相信很多網站登錄中都有這個功能。但是這個功能使用不當,將會出現劫持漏洞。話不多說,直接分享三個實戰挖掘的案例,三個的實現方式都不一樣(已脫敏).
A網站登錄處存在二維碼劫持漏洞
正常走其流程,發現登錄掃一個二維碼即可:
微信掃描后發現,只要關注了 A網站 的公眾號,無需點擊確認,掃描后即可登錄:
‘打開瀏覽器f12,發現生成二維碼的鏈接如下:
但是直接訪問,發現報錯:
估計是判斷了Refere頭,我們用python 的requests去請求試試:
發現輪詢判斷二維碼是否掃描,是否登錄的接口如下:
其中:
未登錄 code為 1
登錄 code 為 0
二維碼過期 code 為 2
當登錄成功,code返回0,將會set-cookie,返回一個綁定登錄賬號的cookie:
可成功獲取到msg。
制定攻擊流程:
(1)請求https://a.com/account/login_weixin.html獲取到 msg參數
(2)輪詢請求 https://a.com/account/checkLogin.html?1586329068966&ticket=msg參數其中 ticket參數為 第一步獲取到的msg參數
(3)將二維碼投放出去,釣魚等待受害者掃描
(4)受害者掃描二維碼,輪詢返回登錄成功
(5)獲取此時的cookie。用這個cookie去登錄受害者賬號
Exp:
qrcode.py
此python文件用來獲取二維碼以及輪詢
Index.php:
此頁面用於投放二維碼,供受害者掃描。
攻擊流程:
(1)開啟qrcode.py:
(2)投放惡意頁面:
(3)受害者掃描二維碼
(4)獲取到session:
(5)登錄受害者賬號:
自行腦補下登錄成功的樣子吧。。為了脫敏。。。這篇文章僅僅討論技術。
B網站登錄處存在二維碼劫持漏洞
登錄處:
二維碼登錄流程:
(1)獲取二維碼和 key
(2)輪詢(很長一段時間不會過期)
(3)用戶掃描二維碼或點擊登陸鏈接確認登錄,輪詢將返回openid
(4)登錄
其中,獲取鏈接和key的階段。是沒有做請求來源校驗和csrf token的。意味着任何人任何地點都可以請求獲取二維碼和key:
請求鏈接:
接着輪詢:
請求鏈接:
這里的請求參數中的QRkey就是在上一步獲取二維碼和key時,獲取的響應參數 QRkey。
此時需要用微信掃描二維碼。本人分析了一下,發現二維碼鏈接如下:
http://b.com/login/scan/gQH18DwAAAAAAAAAAS5odHRwOi8vd2VpexxxxxxxxxxxxFNTF1MUEAAgTY5YVeAwRYAgAA
其中 /scan/后的字符串就是我們的QRkey。只不過這個鏈接必須在微信中打開。
微信打開后,輪詢返回了一個openid,這個openid應該是綁定這微信的,同一個微信號返回的openid都是一樣的:
(偶然發現,如果微信沒有自己去改微信號,就是openid的值哦)
獲取到openid后,openid和QRkey構造一下鏈接。如果微信綁定了賬號的,即可登錄。
登錄鏈接:
根據此流程,可構造釣魚頁面。
攻擊流程:
(1)開啟php相關環境,使受害者能夠訪問test.php;運行python腳本(attack.py),開始輪詢。
(2)受害者訪問惡意頁面(test.php),用微信掃描二維碼,然后點擊b網站那里的登錄確認 或者將鏈接直接微信發給受害者,受害者微信處點開
(3)此時attack.py中獲取到openid,組合成登錄鏈接。攻擊者可使用登錄鏈接登錄受害者賬號
使用php和python來寫:
釣魚頁面:
python輪詢:
當有用戶掃描二維碼或點擊鏈接。點擊確認后,獲得openid,組成登錄鏈接:
我們直接訪問這個鏈接,即可成功登錄。
C網站登錄處存在二維碼劫持漏洞
正常請求:(前提:微信綁定了C網站賬號,且在微信處登錄了C網站賬號)
1、網頁端訪問登錄頁面:
2、網頁端持續輪詢,檢查二維碼狀態。這里返回1,表示二維碼還沒有被掃描
3、手機微信端掃描二維碼,發送了一個請求:
響應:
4、網頁端輪詢,返回值 2,表示二維碼已被客戶端掃描,但未確認:
網頁端顯示:
5、手機微信端點擊 “確認登錄電腦端”
6、輪詢接口,返回了登錄成功的cookie值:
即可成功登錄網頁端
攻擊鏈:
1、訪問:https://c.om/xxxx/qrcodelogin/show,獲取 set-cookie:qrtoken
2、用獲取到的qrtoken,輪詢 狀態接口
https://c.om/xxxx/xxxxxx/qrcodeLoginCheck/qrtoken值?callback=jQuery1587040960902
其中:
返回值為1,用戶還沒有掃描二維碼
返回值為2,用戶還沒有點擊確定
返回值帶有參數 xxxxx-passport,登錄成功,xxxxx-passport為登錄憑證
3、已經在微信客戶端登錄過的受害者在微信客戶端打開惡意網頁鏈接,或者微信客戶端掃描惡意網頁的二維碼。
4、惡意網頁先后通過兩個img標簽,依次請求登錄確認網頁、登錄成功接口
5、輪詢狀態接口,獲取 xxxxx-passport,劫持用戶賬號
Demo:
構建輪詢腳本:qrcode.py:(測試發現一個二維碼90秒過期,該腳本可自動重新請求)
構建惡意頁面:qrcode.php
開啟輪詢腳本:
手機微信端訪問惡意頁面。
輪詢處獲得cookie:
以上就是本人在實戰中挖到的劫持漏洞,至於修復方式的話,本人暫時沒想到太多。猜想:微信客戶端點擊確認的時候,加入一個csrf_token可能會好很多。如果大家有什么好的建議,歡迎在評論處分享!
*本文作者:xiaopan233,來自FreeBuf