一、概述
服務端未對傳入的跳轉url變量進行檢查和控制,可導致惡意用戶構造一個惡意地址,誘導用戶跳轉到惡意網站。跳轉漏洞一般用于釣魚攻擊,通過跳轉到惡意網站欺騙用戶輸入用戶名和密碼來盜取用戶信息,或欺騙用戶進行金錢交易;還可以造成xss漏洞。
常見的可能產生漏洞的參數名redirect,redirect_to,redirect_url,url,jump,jump_to,target,to,link,linkto,domain
定義:借助未驗證的URL跳轉,將應用程序引導到不安全的第三方區域,從而導致的安全問題。
url跳轉常見出現的地方(即漏洞產生的地方)
- 登陸跳轉我認為是最常見的跳轉類型,認證完后會跳轉,所以在登陸的時候建議多觀察url參數
- 用戶分享、收藏內容過后,會跳轉
- 跨站點認證、授權后,會跳轉
- 站內點擊其它網址鏈接時,會跳轉
- 在一些用戶交互頁面也會出現跳轉,如請填寫對客服評價,評價成功跳轉主頁,填寫問卷,等等業務,注意觀察url。
- 業務完成后跳轉這可以歸結為一類跳轉,比如修改密碼,修改完成后跳轉登陸頁面,綁定銀行卡,綁定成功后返回銀行卡充值等頁面,或者說給定一個鏈接辦理VIP,但是你需要認證身份才能訪問這個業務,這個時候通常會給定一個鏈接,認證之后跳轉到剛剛要辦理VIP的頁面。
二、URL跳轉漏洞原理
黑客利用URL跳轉漏洞來誘導安全意識低的用戶點擊,導致用戶信息泄露或者資金的流失。其原理是黑客構建惡意鏈接(鏈接需要進行偽裝,盡可能迷惑),發在QQ群或者是瀏覽量多的貼吧/論壇中。 安全意識低的用戶點擊后,經過服務器或者瀏覽器解析后,跳到惡意的網站中。
惡意鏈接需要進行偽裝,經常的做法是熟悉的鏈接后面加上一個惡意的網址,這樣才迷惑用戶。
諸如偽裝成像如下的網址,你是否能夠識別出來是惡意網址呢?
http://gate.baidu.com/index?act=go&url=http://t.cn/RVTatrd
http://qt.qq.com/safecheck.html?flag=1&url=http://t.cn/RVTatrd
http://tieba.baidu.com/f/user/passport?jumpUrl=http://t.cn/RVTatrd
三、攻擊方式及危害
惡意用戶完全可以借用URL跳轉漏洞來欺騙安全意識低的用戶,從而導致“中獎”之類的欺詐,這對于一些有在線業務的企業如淘寶等,危害較大,同時借助URL跳轉,也可以突破常見的基于“白名單方式”的一些安全限制,如傳統IM里對于URL的傳播會進行安全校驗,但是對于大公司的域名及URL將直接允許通過并且顯示會可信的URL,而一旦該URL里包含一些跳轉漏洞將可能導致安全限制被繞過。
如果引用一些資源的限制是依賴于“白名單方式”,同樣可能被繞過導致安全風險,譬如常見的一些應用允許引入可信站點如youku.com的視頻,限制方式往往是檢查URL是否是youku.com來實現,如果youku.com內含一個url跳轉漏洞,將導致最終引入的資源屬于不可信的第三方資源或者惡意站點,最終導致安全問題。
四、實現方式
- Header頭跳轉
- JAVAscript跳轉
- META標簽跳轉
通過以GET或者POST的方式接收將要跳轉的URL,然后通過上面的幾種方式的其中一種來跳轉到目標URL。一方面,由于用戶的輸入會進入Meta,JavaScript,http頭所以都可能發生相應上下文的漏洞,如xss等等,但是同時,即使只是對于URL跳轉本身功能方面就存在一個缺陷,因為會將用戶瀏覽器從可信的站點導向到不可信的站點,同時如果跳轉的時候帶有敏感數據一樣可能將敏感數據泄漏給不可信的第三方。
這里我們舉個Header頭跳轉實現方式:
<?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里點擊上述鏈接將導致用戶最終訪問www.evil.com這個惡意網址。
五、繞過URL跳轉限制
1.利用?號繞過限制
比如: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
2.利用反斜杠和正斜杠繞過限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同樣是在它本身域名錢加上正斜杠,然后正斜杠前面跟上你想跳轉的域名地址,如:http://www.aaa.com/acb?Url=
http://test.com/login.aaa.com
反斜杠有三種思路
①兩個反斜杠繞過方法
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同樣是在它本身域名錢加上兩個反斜杠,然后兩個反斜杠前面跟上你想跳轉的域名地址
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com
②一個反斜杠繞過方法
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com
③另一種思路,一個反斜杠一個點
利用.這樣的格式,也就是一個反斜杠加一個點來跳過限制,
如:http://www.aaa.com/acb?Url=
http://test.com.login.aaa.com
3.利用@繞過URL限制
如果你用這方法在火狐里進行跳轉,會有彈窗提示,在其它游覽器則沒有。
如:http://www.aaa.com/acb?Url=http://login.aaa.com@test.com后面的test.com就是要跳轉到的域名,前面的域名都是用來輔助以繞過限制的
4.利用#號繞過
如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com
5.利用白名單缺陷繞過
有的域名白名單限制是不全的,比如如果想利用一個跳轉,而這個跳轉是通用,在這個公司網站很多子域名等都可以跳轉,那么你買個域名也不算貴對吧,為什么這么說呢,這個問題就是白名單限制不當,比如,當跳轉的域名包含這個網站下的所有域名,比如:
http://www.aaa.com/acb?Url=http://login.aaa.com,這個login.aaa.com也可以改成aaa.com同樣可以跳轉對吧,因為白名單里只要有包含這個域名就直接成功跳轉。那么當我在這個域名前面加上如testaaa.com,白名單里會檢查是否包含aaa.com這個域名,包含,然后直接跳轉,而并沒有檢查這個域名的整個信息,然后可以利用這個問題,直接注冊一個testaaa.com這個域名就可以利用這個跳轉。
6.多重驗證&跳轉繞過限制
現在很多網站都有多重驗證,比如你登陸賬戶后會出現另一個驗證頁面,輸入手機驗證碼進行驗證,此時這上面的URL很可能存在任意跳轉的問題。多重跳轉的問題導致可繞過URL限制
比如http://www.aaa.com/acb?Url=http://login.aaa.com/acb?url=http://login.aaa.com。當然,還有多重的,這個結構的多重跳轉你修改最后面的URL就可以達到任意URL跳轉,中間的URL就沒必要動了。
7.點擊觸發達到繞過URL跳轉限制
比如很多登陸頁面的地方,其URL是一個跳轉的URL,如:http://www.aaa.com/acb?Url=http://test.com。你直接修改了后面為任意URL,但是還是停留在原地,似乎沒什么問題,但是,當你輸入賬號和密碼后點擊登陸按鈕后,就會觸發跳轉,當然,這個賬戶和密碼不一定要對的,隨便都可以,但得視系統而定吧。這個我遇到了很多,比如你修改了域名,然后點擊登陸,登陸成功后便可觸發跳轉,這也是一個比較隱蔽的繞過URL限制的跳轉。
8.POST參數中的URL跳轉
當你填什么表格或者需要填寫什么的,當你上傳圖片,點擊下一步的時候,通常下一步就是預覽你填寫的信息,最后才是提交,當你上傳了圖片后點擊下一步抓包,如果過濾不嚴,你會看到圖片的完整地址包含在POST參數里,你就可以直接修改這個地址為任意URL,然后到達下一步,這時是確定信息也就是預覽自己填寫的信息的正確還是不正確,由于你剛剛修改了圖片地址,這里是沒有顯示出來的,圖像會是一個小XX,當點擊圖片右鍵選擇查看圖像時,就會觸發URL跳轉問題,其實這個也可以利用來進行釣魚,釣后臺審核員的信息(引用)
9.利用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地址。
六、url跳轉修復
1.若跳轉的URL事先是可以確定的,包括url和參數的值,則可以在后臺先配置好,url參數只需傳對應url的索引即可,通過索引找到對應具體url再進行跳轉;
2.若跳轉的URL事先不確定,但其輸入是由后臺生成的(不是用戶通過參數傳人),則可以先生成好跳轉鏈接然后進行簽名,而跳轉cg首先需要進行驗證簽名通過才能進行跳轉;
3.若1和2都不滿足,url事先無法確定,只能通過前端參數傳入,則必須在跳轉的時候對url進行按規則校驗:即控制url是否是你們公司授權的白名單或者是符合你們公司規則的url:
function checkURL ( sURL) {
return (/^(https?://)?[w-.]+.(yourDomainA|yourDomainB|yourDomainC).com($|/|)/i).test(sUrl)||(/^[w][w/.-_%]+$/i).test(sUrl)||(/^[/][^/]/i).test(sUrl) ? true : false; }
4.XSS漏洞的注意事項 :跳轉url檢測中也加入了CRLF頭部注入漏洞的檢測邏輯, 具體就是在請求參數中加入了%0d%0a這種測試代碼,需要對這些參數進行刪除處理(事實上:在判斷到一個參數中包含 %00 -> %1f 的控制字符時都是不合法的,需對其進行刪除)。
七、如何防御
理論上講,url跳轉屬于CSRF的一種,我們需要對傳入的URL做有效性的認證,保證該URL來自于正確的地方,限制的方式同防止csrf一樣可以包括:
1.referer的限制
如果確定傳遞URL參數進入的來源,我們可以通過該方式實現安全限制,保證該URL的有效性,避免惡意用戶自己生成跳轉鏈接
2.加入有效性驗證Token
我們保證所有生成的鏈接都是來自于我們可信域的,通過在生成的鏈接里加入用戶不可控的Token對生成的鏈接進行校驗,可以避免用戶生成自己的惡意鏈接從而被利用,但是如果功能本身要求比較開放,可能導致有一定的限制。
參考:
https://juejin.cn/post/6844903772930441230
http://drops.xmd5.com/static/drops/papers-58.html
https://blog.csdn.net/pro20/article/details/105731095
https://segmentfault.com/a/1190000021968717