二維碼劫持案例分析


引言

微信掃描二維碼登錄網站,相信很多網站登錄中都有這個功能。但是這個功能使用不當,將會出現劫持漏洞。話不多說,直接分享三個實戰挖掘的案例,三個的實現方式都不一樣(已脫敏).

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:

請求鏈接:

http://b.com/xxxx/getWxQrcode?xxx=xxxx(GET參數不重要)

接着輪詢:

請求鏈接:

https://b.com/xxxx/checkWxQRState?QRkey=QRkey

這里的請求參數中的QRkey就是在上一步獲取二維碼和key時,獲取的響應參數 QRkey。

此時需要用微信掃描二維碼。本人分析了一下,發現二維碼鏈接如下:

http://b.com/login/scan/gQH18DwAAAAAAAAAAS5odHRwOi8vd2VpexxxxxxxxxxxxFNTF1MUEAAgTY5YVeAwRYAgAA

其中 /scan/后的字符串就是我們的QRkey。只不過這個鏈接必須在微信中打開。

微信打開后,輪詢返回了一個openid,這個openid應該是綁定這微信的,同一個微信號返回的openid都是一樣的:

(偶然發現,如果微信沒有自己去改微信號,就是openid的值哦)

獲取到openid后,openid和QRkey構造一下鏈接。如果微信綁定了賬號的,即可登錄。

登錄鏈接:

https://b.com/xxxx/qrWxLogin?openid=oo6-IuOhwxxxxxxxx_hOI&QRkey=gQH18DwAAAAAAAAAAS5odHRwOi8vd2Vpxxxxxxxxxxxxxxxxx4SU1xxxxxxxSU1EAAgTY5YVeAwRYAgAA

根據此流程,可構造釣魚頁面。

攻擊流程:

(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM