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跳轉屬於CSRF的一種,我們需要對傳入的URL做有效性的認證,保證該URL來自於正確的地方,限制的方式同防止csrf一樣可以包括:
1 referer的限制
如果確定傳遞URL參數進入的來源,我們可以通過該方式實現安全限制,保證該URL的有效性,避免惡意用戶自己生成跳轉鏈接
2 加入有效性驗證Token
我們保證所有生成的鏈接都是來自於我們可信域的,通過在生成的鏈接里加入用戶不可控的Token對生成的鏈接進行校驗,可以避免用戶生成自己的惡意鏈接從而被利用,但是如果功能本身要求比較開放,可能導致有一定的限制。
0x04 url跳轉漏洞bypass總結
10種bypass方式:
1. 單斜線"/"繞過 https://www.landgrey.me/redirect.php?url=/www.evil.com 2. 缺少協議繞過 https://www.landgrey.me/redirect.php?url=//www.evil.com 3. 多斜線"/"前綴繞過 https://www.landgrey.me/redirect.php?url=///www.evil.com https://www.landgrey.me/redirect.php?url=////www.evil.com 4. 利用"@"符號繞過 https://www.landgrey.me/redirect.php?url=https://www.landgrey.me@www.evil.com 5. 利用反斜線"\"繞過 https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me 6. 利用"#"符號繞過 https://www.landgrey.me/redirect.php?url=https://www.evil.com#www.landgrey.me 7. 利用"?"號繞過 https://www.landgrey.me/redirect.php?url=https://www.evil.com?www.landgrey.me 8. 利用"\\"繞過 https://www.landgrey.me/redirect.php?url=https://www.evil.com\\www.landgrey.me 9. 利用"."繞過 https://www.landgrey.me/redirect.php?url=.evil (可能會跳轉到www.landgrey.me.evil域名) https://www.landgrey.me/redirect.php?url=.evil.com (可能會跳轉到evil.com域名) 10.重復特殊字符繞過 https://www.landgrey.me/redirect.php?url=///www.evil.com//.. https://www.landgrey.me/redirect.php?url=////www.evil.com//..