全稱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.0
是Oauth
協(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
啸罢,并且附上code
和state
编检。
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.cn
。alt
參數(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)劫持。
攻擊流程:
- 需要用戶授權(quán)映之,將網(wǎng)站帳戶與第三方應(yīng)用進(jìn)行綁定拦焚;
- 用戶已經(jīng)登陸網(wǎng)站;
- 黑客構(gòu)造惡意OAuth杠输,引誘用戶點(diǎn)擊赎败;
- 獲取到
code
替換步驟三中URL的code
,如果state
參數(shù)沒有做任何校驗(yàn)的話就劫持成功了蠢甲。
直接修改redirect_url
就能成功的情況很少見僵刮,因?yàn)榉?wù)端會(huì)比對client_id
和redirect_url
是否對應(yīng)。
突破方式:
- 利用
redirect_uri
規(guī)定的子域名中存在的漏洞:-
任意重定向,我們就可以從
referer
中看到code
,達(dá)到一樣的攻擊效果搞糕。 -
HTML注入勇吊,可以當(dāng)作
GET XSS
的一種,頁面引入了外部的惡意資源窍仰,從referer
獲取code
汉规。 - 或者找一個(gè)論壇,發(fā)個(gè)引入外部圖片的帖子驹吮,將
redirect_url
修改成帖子的地址针史,從referer
獲取code
。
-
任意重定向,我們就可以從
- 服務(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ì)同攻擊者的帳號綁定到一起。
攻擊流程:
- 用戶在客戶端網(wǎng)站處于登陸狀態(tài)
- 攻擊者通過OAuth授權(quán)用服務(wù)端小號登陸客戶端網(wǎng)站
- 攻擊者阻斷授權(quán)過程族沃,得到惡意URL
- 誘騙用戶點(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