URL重定向/跳轉漏洞
0x00 相關背景介紹
由於應用越來越多的需要和其他的第三方應用互動,以及在自身應用內部根據不同的邏輯將使用者引向到不同的頁面,譬如一個典型的登入介面就經常需要在認證成功之後將使用者引導到登入之前的頁面,整個過程中如果實現不好就可能導致一些安全問題,特定條件下可能引起嚴重的安全漏洞。
0x01 成因
對於URL跳轉的實現一般會有幾種實現方式:
- META標籤內跳轉
- javascript跳轉
- header頭跳轉
通過以GET或者POST的方式接收將要跳轉的URL,然後通過上面的幾種方式的其中一種來跳轉到目標URL。一方面,由於使用者的輸入會進入Meta,javascript,http頭所以都可能發生相應上下文的漏洞,如xss等等,但是同時,即使只是對於URL跳轉本身功能方面就存在一個缺陷,因為會將使用者瀏覽器從可信的站點導向到不可信的站點,同時如果跳轉的時候帶有敏感資料一樣可能將敏感資料洩漏給不可信的第三方。
譬如一個典型的登入跳轉如下:
<?php
$url=$_GET['jumpto'];
header("Location: $url");
?>
如果jumpto沒有任何限制,所以惡意使用者可以提交
http://www.wooyun.org/login.php?jumpto=http://www.evil.com
來生成自己的惡意連結,安全意識較低的使用者很可能會以為該連結展現的內容是www.wooyun.org從而可能產生欺詐行為,同時由於QQ,淘寶旺旺等線上IM都是基於URL的過濾,同時對一些站點會一白名單的方式放過,所以導致惡意URL在IM裡可以傳播,從而產生危害,譬如這裡IM會認為www.wooyun.org都是可信的,但是通過在IM裡點選上述連結將導致使用者最終訪問evil.com。
0x02 攻擊方式及危害
惡意使用者完全可以借用URL跳轉漏洞來欺騙安全意識低的使用者,從而導致“中獎”之類的欺詐,這對於一些有線上業務的企業如淘寶等,危害較大,同時藉助URL跳轉,也可以突破常見的基於“白名單方式”的一些安全限制,如傳統IM裡對於URL的傳播會進行安全校驗,但是對於大公司的域名及URL將直接允許通過並且顯示會可信的URL,而一旦該URL裡包含一些跳轉漏洞將可能導致安全限制被繞過。
如果引用一些資源的限制是依賴於“白名單方式”,同樣可能被繞過導致安全風險,譬如常見的一些應用允許引入可信站點如youku.com的視訊,限制方式往往是檢查URL是否是youku.com來實現,如果youku.com內含一個url跳轉漏洞,將導致最終引入的資源屬於不可信的第三方資源或者惡意站點,最終導致安全問題。
0x03 實際案例
通過url跳轉突破IM的安全校驗,從而傳播惡意URL
通過url跳轉欺騙交易使用者對URL的信任,從而實現欺詐
c http://hi.baidu.com/rayh4c/blog/item/8fde4b23ffa2045e9822edb9.html
通過URL跳轉繞過應用程式對引用資源的限制,從而導致安全漏洞
d WooYun: 豆瓣電臺認證繞過及csrf防範策略繞過漏洞
藉助未驗證的URL跳轉,可以將應用程式內部敏感的資料傳遞到不安全的第三方區域
0x04 修復方案
理論上講,url跳轉屬於CSRF的一種,我們需要對傳入的URL做有效性的認證,保證該URL來自於正確的地方,限制的方式同防止csrf一樣可以包括:
1 referer的限制
如果確定傳遞URL引數進入的來源,我們可以通過該方式實現安全限制,保證該URL的有效性,避免惡意使用者自己生成跳轉連結
2 加入有效性驗證Token
我們保證所有生成的連結都是來自於我們可信域的,通過在生成的連結里加入使用者不可控的Token對生成的連結進行校驗,可以避免使用者生成自己的惡意連結從而被利用,但是如果功能本身要求比較開放,可能導致有一定的限制。
利用問號繞過限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com 這是一個跳轉連結,跳轉到它的二級域名下,那麼這個問號放哪裡可以繞過呢?其實就是放到它自身的域名前面也就是你新增的想要跳轉的域名的後面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 。那麼,它其實是會跳轉到這個test.com域名下,這個域名是我想要跳轉的任意域名,而後面的它自身域名一定要帶上,不帶上就無法輔助用問號?這個特性來跳轉到指定域名了,而跳轉後,問號和問號後面的內容會變為這樣:http://www.test.com/?login.aaa.com
利用反斜槓和正斜槓繞過限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同樣是在它本身域名錢加上正斜槓,然後正斜槓前面跟上你想跳轉的域名地址
如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com
反斜槓有三種思路
(1)兩個反斜槓繞過方法
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同樣是在它本身域名錢加上兩個反斜槓,然後兩個反斜槓前面跟上你想跳轉的域名地址
如:http://www.aaa.com/acb?Url=http://test.com\\login.aaa.com
(2)一個反斜槓繞過方法
如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com
(3)另一種思路,一個反斜槓一個點
利用.這樣的格式,也就是一個反斜槓加一個點來跳過限制,
如:http://www.aaa.com/acb?Url=http://test.com\.login.aaa.com
利用@繞過URL限制
如果你用這方法在火狐裡進行跳轉,會有彈窗提示,在其它遊覽器則沒有。
如:http://www.aaa.com/acb?Url=http://[email protected]後面的test.com就是要跳轉到的域名,前面的域名都是用來輔助以繞過限制的
利用#號繞過
如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com
利用白名單缺陷繞過限制
有的域名白名單限制是不全的,比如如果想利用一個跳轉,而這個跳轉是通用,在這個公司網站很多子域名等都可以跳轉,那麼你買個域名也不算貴對吧,為什麼這麼說呢,這個問題就是白名單限制不當,比如,當跳轉的域名包含這個網站下的所有域名,比如:http://www.aaa.com/acb?Url=http://login.aaa.com,這個login.aaa.com也可以改成aaa.com同樣可以跳轉對吧,因為白名單裡只要有包含這個域名就直接成功跳轉。那麼當我在這個域名前面加上如testaaa.com,白名單裡會檢查是否包含aaa.com這個域名,包含,然後直接跳轉,而並沒有檢查這個域名的整個資訊,然後可以利用這個問題,直接註冊一個testaaa.com這個域名就可以利用這個跳轉。
多重驗證&跳轉繞過限制
現在很多網站都有多重驗證,比如你登陸賬戶後會出現另一個驗證頁面,輸入手機驗證碼進行驗證,此時這上面的URL很可能存在任意跳轉的問題。
多重跳轉的問題導致可繞過URL限制
比如http://www.aaa.com/acb?Url=http://login.aaa.com/acb?url=http://login.aaa.com。當然,還有多重的,這個結構的多重跳轉你修改最後面的URL就可以達到任意URL跳轉,中間的URL就沒必要動了。
點選觸發達到繞過URL跳轉限制
比如很多登陸頁面的地方,其URL是一個跳轉的URL,如:http://www.aaa.com/acb?Url=http://test.com。你直接修改了後面為任意URL,但是還是停留在原地,似乎沒什麼問題,但是,當你輸入賬號和密碼後點擊登陸按鈕後,就會觸發跳轉,當然,這個賬戶和密碼不一定要對的,隨便都可以,但得視系統而定吧。這個我遇到了很多,比如你修改了域名,然後點選登陸,登陸成功後便可觸發跳轉,這也是一個比較隱蔽的繞過URL限制的跳轉。
利用超連結繞過可信站點限制
比如一個URL,它是可以直接跳轉的,但是一般測試跳轉時大家習慣用www.baidu.com或qq.com這樣的可信站點進行測試,但是有些網站是可以跳轉這些網站的,只要是可信站點且常用,基本都可以跳轉,那麼這就屬於正常的業務邏輯了。難道就這樣錯失一個URL跳轉漏洞了?其實不然,只要你的URL被百度收錄過,那麼直接搜尋你的域名,site:xxx.xxx 因為你在百度裡點選你的域名,它會先是一個302跳轉,而這個302跳轉就是百度下的302跳轉,那麼這樣就可以繞過可信站點的限制,從而達到跳轉到指定URL,當然,百度這個302有點長,你給它進行加密就行。
POST引數中的URL跳轉
當然,這個影響就很小了,比如當你填什麼表格或者需要填寫什麼的,當你上傳圖片,點選下一步的時候,通常下一步就是預覽你填寫的資訊,最後才是提交,當你上傳了圖片後點擊下一步抓包,如果過濾不嚴,你會看到圖片的完整地址包含在POST引數裡,你就可以直接修改這個地址為任意URL,然後到達下一步,這時是確定資訊也就是預覽自己填寫的資訊的正確還是不正確,由於你剛剛修改了圖片地址,這裡是沒有顯示出來的,影象會是一個小XX,當點選圖片右鍵選擇檢視影象時,就會觸發URL跳轉問題,其實這個也可以利用來進行釣魚,釣後臺稽核員的資訊,為什麼呢,比如稽核看到圖片無法載入,一般都會點選檢視圖片,然後跳轉,如果安全意識不知就會造成安全影響。
當然,如果POST引數裡就只是URL跳轉引數,那麼你可以給它轉成GET方式,然後進行跳轉就可以了,只要網站支援這樣的GET方式就行,在Burp Suite裡可以一鍵轉換提交方式,右鍵選擇Change request method就可以!
利用xip.io繞過
請求是http://www.127.0.0.1.xip.io 這個繞過是在SSRF場景中的繞過,比如SSRF你要讀取內網地址,一般都做了限制,可以嘗試用這方法進行繞過限制,從而訪問到內網。
另外一點,URL跳轉涉及的安全問題大家常見的就是釣魚,那麼利用這個思路也可達成一個釣魚問題,如,http://www.qq.com.220.181.57.217.xip.io 當你訪問qq這個域名時,其實這個連結已經被解析到後面這個ip地址上了,那麼實際訪問的就是後面這個IP地址。
參考:https://blog.csdn.net/abwxwx/article/details/45604739?utm_source=blogxgwz3