CSRF兼Oauth帳戶劫持

全稱Cross-site request forgery呼渣,即跨站請求偽造擂橘,在受害者毫不知情的情況下以其名義發(fā)起請求晌区,比如改昵稱,刷粉絲通贞,添加系統(tǒng)管理員等朗若。

如果經(jīng)常用掃描器的話,可以發(fā)現(xiàn)一大堆CSRF漏洞昌罩,并且看著非常雞肋哭懈。
實(shí)際上這個(gè)漏洞比較有用的地方(危害較大)是用來實(shí)現(xiàn)“帳戶劫持”,可以參考曾經(jīng)的烏云上的呆子不開口的賬戶劫持系列漏洞茎用;以及一些后臺沒有做任何防護(hù)的野雞CMS遣总。

OAuth2.0

如果我們想要登錄新浪微博,而微博又支持第三方登錄例如QQ登錄轨功。那么我們就只能在微博上輸入QQ賬號和密碼旭斥,同時(shí)這個(gè)網(wǎng)站也就知道了QQ賬號和密碼,這勢必會(huì)產(chǎn)生一些安全問題古涧,而OAuth協(xié)議就是為了解決這些安全問題而產(chǎn)生的垂券,Oauth2.0Oauth協(xié)議的升級版。

以微博上用QQ登陸為例羡滑,使用的模式是Authorization Code菇爪。
這里“微博”作為客戶端,“QQ”作為服務(wù)端柒昏。

步驟一

在微博登錄頁點(diǎn)擊QQ登陸的圖標(biāo)凳宙,會(huì)跳轉(zhuǎn)到QQ的網(wǎng)頁,提示“是否授權(quán)微博”獲取你的“QQ頭像”以及“QQ昵稱”昙楚。

https://graph.qq.com/oauth2.0/show?which=Login&display=pc
&client_id=101019034
&response_type=code
&scope=get_info,get_user_info
&redirect_uri=https://passport.weibo.com/othersitebind/bind?site=qq
&state=CODE-gz-1F2ukL-448SQs-VFeXcvwk6Y0I4DO43f41e

其中有五個(gè)參數(shù)需要注意:

  • client_id: 客戶端id近速,標(biāo)識是哪個(gè)客戶端發(fā)起的請求诈嘿,本例是“微博”
  • response_type: 授權(quán)類型,總共六種削葱,這里是“授權(quán)碼模式“
  • scope: 授權(quán)的范圍奖亚,這里是get_info,get_user_info
  • redirect_url: 用戶給予授權(quán)后,會(huì)攜帶授權(quán)碼跳轉(zhuǎn)到此地址析砸,此處是https://passport.weibo.com/othersitebind/bind
  • state:防御CSRF的token昔字。每次授權(quán)請求,客戶端都會(huì)生成一個(gè)state首繁,確保是本人發(fā)出的請求作郭,并將其保存到cookie或session中。授權(quán)成功后弦疮,服務(wù)端原樣返回state,客戶端將其與cookie或session中的值進(jìn)行比對夹攒。

burp可以看到一堆請求,因?yàn)榫W(wǎng)頁會(huì)拉起QQ客戶端做快捷登陸胁塞,直到看到這個(gè)https://graph.qq.com/oauth2.0/login_jump

步驟二

接著向QQ發(fā)起一個(gè)POST請求

POST /oauth2.0/authorize HTTP/1.1
Host: graph.qq.com
Connection: close
Content-Length: 379
Content-Type: application/x-www-form-urlencoded
Referer: https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101019034&response_type=code&scope=get_info%2Cget_user_info&redirect_uri=https%3A%2F%2Fpassport.weibo.com%2Fothersitebind%2Fbind%3Fsite%3Dqq%26state%3DCODE-gz-1HxYDK-2ei53a-oMXN8W54qO0CNyr9971a4%26bentry%3Dminiblog%26wl%3D&display=
Cookie: 一串內(nèi)容

response_type=code&client_id=101019034&redirect_uri=https%3A%2F%2Fpassport.weibo.com%2Fothersitebind%2Fbind%3Fsite%3Dqq%26state%3DCODE-gz-1HxYDK-2ei53a-oMXN8W54qO0CNyr9971a4%26bentry%3Dminiblog%26wl%3D&scope=get_info%2Cget_user_info&state=&switch=&from_ptlogin=1&src=1&update_auth=1&openapi=80901010&g_tk=1929275414&auth_time=1559613258375&ui=66538B17-3A9C-4FD1-ACC4-8D326DCD9B4A

QQ服務(wù)器通過認(rèn)證后咏尝,會(huì)生成一個(gè)授權(quán)碼code,重定向到redirect_url啸罢,并且附上codestate编检。

HTTP/1.1 302 Moved Temporarily
Content-Length: 0
Location: https://passport.weibo.com/othersitebind/bind?site=qq&state=CODE-gz-1HxYDK-2ei53a-oMXN8W54qO0CNyr9971a4&bentry=miniblog&wl=&code=37D4420BA492FB4AD1A3EB9A70A4E029

步驟三

然后GET請求下面的url。在這里"微博"會(huì)向"QQ"比對state是否一致(后臺完成扰才,用戶不可見)允懂。

https://passport.weibo.com/othersitebind/bind?site=qq&state=CODE-gz-1HxYDK-2ei53a-oMXN8W54qO0CNyr9971a4&bentry=miniblog&wl=&code=37D4420BA492FB4AD1A3EB9A70A4E029

state驗(yàn)證通過之后,此時(shí)Oauth驗(yàn)證已經(jīng)結(jié)束衩匣。
“微博”生成一個(gè)alt參數(shù)蕾总,帶著這個(gè)參數(shù)重定向到sina.com.cnalt參數(shù)如果校驗(yàn)通過舵揭,則種下cookie

https://login.sina.com.cn/sso/login.php?entry=qq&url=https%3A%2F%2Fweibo.com%2F&alt=ALT-NTI1NzEzMDI0Mg%3D%3D-1559613258-gz-4E9DA71B5000CCF8AD8D77E6FEEDF206-1&returntype=META&useticket=0&savestate=30

授權(quán)登陸劫持

如果攻擊者偽造redirect_uri為自己的地址谤专,然后誘導(dǎo)用戶發(fā)送該請求,之后獲取的憑證就會(huì)發(fā)送給攻擊者偽造的回調(diào)地址午绳。攻擊者使用該憑證即可登錄用戶賬號,造成授權(quán)劫持。

攻擊流程:

  1. 需要用戶授權(quán)映之,將網(wǎng)站帳戶與第三方應(yīng)用進(jìn)行綁定拦焚;
  2. 用戶已經(jīng)登陸網(wǎng)站;
  3. 黑客構(gòu)造惡意OAuth杠输,引誘用戶點(diǎn)擊赎败;
  4. 獲取到code替換步驟三中URL的code,如果state參數(shù)沒有做任何校驗(yàn)的話就劫持成功了蠢甲。

直接修改redirect_url就能成功的情況很少見僵刮,因?yàn)榉?wù)端會(huì)比對client_idredirect_url是否對應(yīng)。

突破方式:

  1. 利用redirect_uri規(guī)定的子域名中存在的漏洞:
    • 任意重定向,我們就可以從referer中看到code,達(dá)到一樣的攻擊效果搞糕。
    • HTML注入勇吊,可以當(dāng)作GET XSS的一種,頁面引入了外部的惡意資源窍仰,從referer獲取code汉规。
    • 或者找一個(gè)論壇,發(fā)個(gè)引入外部圖片的帖子驹吮,將redirect_url修改成帖子的地址针史,從referer獲取code
  2. 服務(wù)端對redirect_url的校驗(yàn)規(guī)則有問題導(dǎo)致繞過
  • auth.app.com.evil.com
  • evil.com?auth.app.com
  • evil.com?@auth.app.com
  • auth.app.com@evil.com
  • evil.com\auth.app.com
  • evil.com:\auth.app.com
  • evil.com\.auth.app.com
  • evil.com:\@auth.app.com

例子參考
未驗(yàn)證:wooyun-2013-045318 土豆網(wǎng)某處認(rèn)證缺陷可劫持oauth_token
驗(yàn)證繞過:wooyun-2013-045327 繞過網(wǎng)易o(hù)auth認(rèn)證的redirect_uri限制劫持帳號token
較為復(fù)雜實(shí)例:https://xz.aliyun.com/t/3514

綁定劫持

攻擊者抓取客戶端向服務(wù)端發(fā)起綁定請求構(gòu)造惡意url碟狞,并誘騙已經(jīng)登錄客戶端的用戶點(diǎn)擊(比如通過郵件或者QQ等方式)啄枕。認(rèn)證成功后用戶的帳號會(huì)同攻擊者的帳號綁定到一起。

攻擊流程:

  1. 用戶在客戶端網(wǎng)站處于登陸狀態(tài)
  2. 攻擊者通過OAuth授權(quán)用服務(wù)端小號登陸客戶端網(wǎng)站
  3. 攻擊者阻斷授權(quán)過程族沃,得到惡意URL
  4. 誘騙用戶點(diǎn)擊惡意URL频祝,綁定了攻擊者的服務(wù)端小號。另外劫持成功的條件竭业,當(dāng)然也是需要服務(wù)端不驗(yàn)證state智润。

參考實(shí)例:https://gh0st.cn/archives/2018-04-28/1

越權(quán)訪問

scope權(quán)限控制不當(dāng)帶來的安全風(fēng)險(xiǎn)
參考:從“黑掉Github”學(xué)Web安全開發(fā)

防御方式:

  • 驗(yàn)證 HTTP Referer 字段
  • 在請求地址中添加一次性token
  • 在 HTTP 頭中自定義屬性并驗(yàn)證

點(diǎn)擊劫持

顧名思義,用戶點(diǎn)擊某個(gè)按鈕未辆,卻觸發(fā)了不是用戶真正意愿的事件(亦是偽造了用戶的請求)窟绷。

攻擊者使用一個(gè)或多個(gè)透明的iframe,覆蓋在一個(gè)網(wǎng)頁上咐柜,然后誘使用戶在該頁面上進(jìn)行操作兼蜈,此時(shí)用戶將在不知情的情況下點(diǎn)擊透明的iframe頁面。攻擊者既可以通過點(diǎn)擊劫持設(shè)計(jì)一個(gè)獨(dú)立的惡意網(wǎng)站拙友,執(zhí)行釣魚攻擊等为狸;也可以與 XSS 和 CSRF 攻擊相結(jié)合,突破傳統(tǒng)的防御措施遗契,提升漏洞的危害程度辐棒。

實(shí)例:https://www.cnblogs.com/lovesong/p/5248483.html
論劫持代碼,綁定劫持那節(jié)的例子會(huì)更好些牍蜂。

防御方式:

  • javascript禁止內(nèi)嵌
if (self == top) {
    document.getElementsByTagName("body")[0].style.display = 'block';
} else {
    top.location = self.location;
}
  • X-FRAME-OPTIONS漾根,一個(gè)專門解決點(diǎn)擊劫持的HTTP頭,有三個(gè)可選值:
    • DENY:瀏覽器會(huì)拒絕當(dāng)前頁面加載任何frame頁面鲫竞;
    • SAMEORIGIN:frame頁面的地址只能為同源域名下的頁面辐怕;
    • ALLOW-FROM origin:允許frame加載的頁面地址;

拖拽劫持

目前很多瀏覽器都開始支持Drag & Drop的API从绘。對于用戶來說寄疏,拖拽使他們的操作更加簡單是牢。瀏覽器中的拖拽對象可以是一個(gè)鏈接,也可以是一段文字陕截,還可以從一個(gè)窗口拖拽到另外一個(gè)窗口驳棱,因此拖拽是不受同源策略限制的。
"拖拽劫持"的思路是誘使用戶從隱藏的不可見iframe中"拖拽"出攻擊者希望得到的數(shù)據(jù)艘策,然后放到攻擊者能控制的另外一個(gè)頁面中蹈胡,從而竊取數(shù)據(jù)。

目前除了《白帽子講web安全》里面有一個(gè)實(shí)例朋蔫,沒看到比較新的例子罚渐。

參考
https://gh0st.cn/archives/2018-02-12/1
https://www.cdxy.me/?p=695

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驯妄,隨后出現(xiàn)的幾起案子荷并,更是在濱河造成了極大的恐慌,老刑警劉巖青扔,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件源织,死亡現(xiàn)場離奇詭異,居然都是意外死亡微猖,警方通過查閱死者的電腦和手機(jī)谈息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凛剥,“玉大人侠仇,你說我怎么就攤上這事±缰椋” “怎么了逻炊?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長犁享。 經(jīng)常有香客問我余素,道長,這世上最難降的妖魔是什么炊昆? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任桨吊,我火速辦了婚禮,結(jié)果婚禮上凤巨,老公的妹妹穿的比我還像新娘屏积。我一直安慰自己,他們只是感情好磅甩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姥卢,像睡著了一般卷要。 火紅的嫁衣襯著肌膚如雪渣聚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天僧叉,我揣著相機(jī)與錄音奕枝,去河邊找鬼。 笑死瓶堕,一個(gè)胖子當(dāng)著我的面吹牛隘道,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郎笆,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谭梗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宛蚓?” 一聲冷哼從身側(cè)響起激捏,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凄吏,沒想到半個(gè)月后远舅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痕钢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年图柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片任连。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚤吹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出课梳,到底是詐尸還是另有隱情距辆,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布暮刃,位于F島的核電站跨算,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏椭懊。R本人自食惡果不足惜诸蚕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氧猬。 院中可真熱鬧背犯,春花似錦、人聲如沸盅抚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妄均。三九已至柱锹,卻和暖如春哪自,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禁熏。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工壤巷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞧毙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓胧华,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宙彪。 傳聞我的和親對象是個(gè)殘疾皇子矩动,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容