URL跳轉原理:
由於越來越多的需要和其他第三方應用交互,以及在自身應用內部根據不同的邏輯將用戶引向到不同的頁面,譬如一個典型的登錄接口就經常需要在認證成功之后將用戶引導到登錄之前的頁面,整個過程中如果實現不好就可能導致一些安全問題,特定條件下可能引起嚴重的安全漏洞。
攻擊方式及危害:
惡意用戶完全可以借用URL跳轉漏洞來欺騙安全意識低的用戶,從而導致”中獎”之類的欺詐,這對於一些有在線業務的企業如淘寶等,危害較大,同時借助URL跳轉,也可以突破常見的基於“白名單方式”的一些安全限制,如傳統IM里對於URL的傳播會進行安全校驗,但是對於大公司的域名及URL將直接允許通過並且顯示會可信的URL,而一旦該URL里包含一些跳轉漏洞將可能導致安全限制被繞過。
如果引用一些資源的限制是依賴於“白名單方式”,同樣可能被繞過導致安全風險,譬如常見的一些應用允許引入可信站點如baidu.com的視頻,限制方式往往是檢查URL是否是baidu.com來實現,如果baidu.com內含一個url跳轉漏洞,將導致最終引入的資源屬於不可信的第三方資源或者惡意站點,最終導致安全問題。
客戶端跳轉(重定向):
客戶端跳轉也被稱為URL重定向,用戶瀏覽器的地址欄URL會有明顯的變化。
比如,當前頁面為http://www.test.com/a.php,當點擊“登錄”按鈕后會指向http://test.com/login.php,頁面發生了變化,這就是客戶端跳轉。
比如index.jsp中含有重定向語句,代碼如下:
<%
response.sendRedirect("a,jsp");
%>
當瀏覽器請求index.jsp后,收到302指示(也叫重定向)就會立刻進行跳轉。
服務端跳轉(請求轉發):
服務端跳轉也稱為URL轉發,服務端跳轉時,用戶瀏覽的地址欄URL是不會變化的。
比如,當前頁面URL為http://www.test.com/a.php,當單機“登錄”按鈕后,瀏覽器地址欄的URL沒變,但是頁面會發生變化。
還有一些跳轉不屬於轉發,也不屬於重定向,而是直接向服務器發送請求,比如,一個簡單的<a>標簽:
<a href = "http://www.test.com/a.jsp"> 安全測試 </a>
釣魚攻擊:
模擬網站或者軟件,幾乎與官方的軟件完全相同,連域名也非常相似。
如何繞過URL跳轉:
1.利用問號繞過限制
利用問號,這是一個特性,利用問號可以成功繞過URL限制。
比如: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
反斜杠有三種思路:
(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
3.利用白名單缺陷繞過限制
有的域名白名單限制是不全的,比如如果想利用一個跳轉,而這個跳轉是通用,在這個公司網站很多子域名等都可以跳轉,那么你買個域名也不算貴,為什么這么說呢,這個問題就是白名單限制不當。
比如,當跳轉的域名包含這個網站下的所有域名,比如:http://www.aaa.com/acb?url=http://login.aaa.com,這個longin.aaa.com也可以改成aaa.com同樣可以跳轉,因為白名單里只要包含這個域名就直接成功跳轉。那么當我在這個域名前加上如test.aaa.com,白名單里會檢測是否包含aaa.com這個域名,包含,然后直接跳轉,而並沒有檢測這個域名的整個信息,然后可以利用這個問題,直接注冊一個test.aaa.com這個域名就可以利用這個跳轉。
4.利用@繞過URL限制
如果用這方法在火狐里進行跳轉,會有彈窗提示,在其他瀏覽器則沒有。
如:http://www.aaa.com/acb?url=http://login.aaa.com@test.com
后面的test.com就是要跳轉到的域名,前面的域名都是用來輔助繞過限制的。
5.多重驗證&跳轉繞過限制
限制的很多網站都有多重驗證,比如你登錄賬戶后會出現另一個驗證頁面,輸入手機驗證碼進行驗證,此時這上面的URL很可能存在任意跳轉的問題。
多重跳轉的問題導致可繞過URL限制
比如http://www.aaa.com/acb?url=http://login.aaa.com/acb?url=http://login.aaa.com,當然,還有多重的,這個結構的多重跳轉你修改最后面的URL就可以達到任意URL跳轉,中間的URL就沒必要動了。
6.點擊觸發達到繞過URL跳轉限制
比如很多登錄頁面的地方,其URL是一個跳轉的URL,如:http://;www.aaa.com/acb?url=http://test.com。你直接修改了后面為任意URl,但是還是停留在原地,似乎沒什么問題,但是,當你輸入賬號和密碼后點擊登錄按鈕后,就會觸發跳轉,當然,這個賬戶和密碼不一定要對的,隨便都可以,視系統而定。比如你修改了域名,然后點擊登錄,登錄成功后便可觸發跳轉,這也是一個比較隱蔽的繞過URL限制的跳轉。
7.利用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地址。
8.利用超鏈接繞過可信站點限制
當然,這個影響就很小了,比如當你填什么表格或者需要填寫什么的,當你上傳圖片,點擊下一步的時候,通常下一步就是預覽你填寫的信息,最后才是提交,當你上傳了圖片后點擊下一步抓包,如果過濾不嚴,你會看到圖片的完整地址包含在POST參數里,你就可以直接修改這個地址為任意URL,然后到達下一步,這時是確定信息也就是預覽自己填寫的信息是正確還是不正確,由於你剛剛修改了圖片地址,這里是沒有顯示出來的,圖片會是一個小XX,當點擊圖片右鍵選擇查看圖像時,就會觸發URL跳轉問題,其實這個也可以利用來進行釣魚,釣后台審核員的信息,為什么呢,比如審核員看到圖片無法加載,一般都會點擊查看圖片,然后跳轉,如果安全意識不知就會造成安全影響。
當然,如果POST參數里就只是URL跳轉參數,那么你就可以給它轉成GET方式,然后進行跳轉就可以了,只要網站支持這樣的GET方式就行,在burpsuite里可以一鍵轉換提交方式,右鍵選擇change request methon就可以。
9.POST參數中的URL跳轉
比如一個URL,它是可以直接跳轉的,但是一般測試跳轉時習慣用www.baidu.com或qq.com這樣的可信站點進行測試,但是有些網站是可以跳轉這些網站的,只要是可信站點且常用,基本都可以跳轉,那么這就屬於正常的業務邏輯了。難道就這樣錯失一個URL跳轉漏洞了?其實不然,只要你的URL被百度收錄過,那么直接搜索你的域名,site:xxx.xxx 因為你在百度里點擊你的域名,它會先是一個302跳轉,而這個302跳轉就是你百度下的302跳轉,那么這樣就可以繞過可信站點的限制,從而達到跳轉到指定URL,當然,百度這個302有點長,你給它進行加密就行。
10.利用#號繞過
如:http://www.aaa.com/acb?url=http://test.com#login.aaa.com
修復方案:
我們需要對傳入的URL做有效性的驗證,保證該URL來自於正確的地方,限制的方式同防止csrf一樣可以包括;
1.referer的限制
如果確定傳遞url參數進入的來源,我們可以通過該方式來實現安全限制,保證該url的有效性,避免惡意用戶自己生成跳轉鏈接
2.加入有效性驗證Token
我們保證所有生成的鏈接都是來自於我們可信域的,通過在生成的鏈接里加入用戶不可控的Token對生成的鏈接進行校驗,可以避免用戶生成自己的惡意鏈接從而被利用,但是如果功能本身要求比較開放,可能導致有一定的限制。