0x00 相关背景介绍
* k3 E( U( |5 S, n' D8 c( S
# q& X+ v9 u' }1 r9 t$ ^, H由于应用越来越多的需要和其他的第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如果实现不好就可能导致一些安全问题,特定条件下可能引起严重的安全漏洞。
' D. Q8 n6 i1 w) D
4 O# b' z5 K( [! Z0x01 成因
8 |7 S& M9 [# {- k0 ~( _5 k
$ T$ F% n: m7 l7 m" P/ f对于URL跳转的实现一般会有几种实现方式:* D/ ^& N0 c/ A6 f
6 L# k% O8 A* w
META标签内跳转
0 |: C$ \% Z: W9 {8 |( j y& kjavascript跳转 1 }; n" X9 Z6 f. |; X* Q
header头跳转
* `5 j1 N5 T! Y9 o+ N, w - H# w: A- p5 R0 U+ O* |8 Z
4 j: f* D. C+ B9 s: v d8 W通过以GET或者POST的方式接收将要跳转的URL,然后通过上面的几种方式的其中一种来跳转到目标URL。一方面,由于用户的输入会进入 Meta,javascript,http头所以都可能发生相应上下文的漏洞,如xss等等,但是同时,即使只是对于URL跳转本身功能方面就存在一个缺 陷,因为会将用户浏览器从可信的站点导向到不可信的站点,同时如果跳转的时候带有敏感数据一样可能将敏感数据泄漏给不可信的第三方。4 s0 L" o& |9 A
7 q9 ]4 [9 H0 W3 f A) D O/ _
譬如一个典型的登录跳转如下:. ~ n+ G! ]7 S! O
6 A+ X% A% A9 P% ^& r
<?php $url=$_GET['jumpto']; header("Location: $url"); ?>如果jumpto没有任何限制,所以恶意用户可以提交8 j" L, M& W- d* T3 @+ L$ K
7 M5 t b% \+ x. l
http://www.xxx.net/login.php?jumpto=http://www.evil.com来生成自己的恶意链接,安全意识较低的用户很可能会以为该链接展现的内容是www.wooyun.org从而可能产生欺诈行为,同时由于QQ,淘宝 旺旺等在线IM都是基于URL的过滤,同时对一些站点会一白名单的方式放过,所以导致恶意URL在IM里可以传播,从而产生危害,譬如这里IM会认为 www.wooyun.org都是可信的,但是通过在IM里点击上述链接将导致用户最终访问evil.com。
# w& F; n2 z2 V }# \- J! B' e
8 ^7 ~+ C! Q6 \' L0x02 攻击方式及危害
. p6 E: g* P9 r5 N/ }
( a8 m: U4 x2 S# O恶意用户完全可以借用URL跳转漏洞来欺骗安全意识低的用户,从而导致“中奖”之类的欺诈,这对于一些有在线业务的企业如淘宝等,危害较大,同时借 助URL跳转,也可以突破常见的基于“白名单方式”的一些安全限制,如传统IM里对于URL的传播会进行安全校验,但是对于大公司的域名及URL将直接允 许通过并且显示会可信的URL,而一旦该URL里包含一些跳转漏洞将可能导致安全限制被绕过。/ h7 A8 [- `4 V* y( e
/ f; c) ?' [! I+ D# R" C A如果引用一些资源的限制是依赖于“白名单方式”,同样可能被绕过导致安全风险,譬如常见的一些应用允许引入可信站点如youku.com的视频,限 制方式往往是检查URL是否是youku.com来实现,如果youku.com内含一个url跳转漏洞,将导致最终引入的资源属于不可信的第三方资源或 者恶意站点,最终导致安全问题。
5 K9 p1 m+ P7 x. U' g5 c0 y9 W) f/ K% `, s, [
0x03 实际案例
1 S# |- R" \5 G% ~8 b0 w g2 h6 ?
a WooYun: 百度一个URL跳转漏洞* }8 z, R1 }/ D5 Z
* f. l K0 w) l: k2 s7 [通过url跳转突破IM的安全校验,从而传播恶意URL' j3 _* ]4 r& d( }8 ^1 ?) e' \: r( O
! v7 M8 k; m/ W: Ob WooYun: 第五次遇到利用淘宝网网址跳转的网钓& g8 F3 a2 \+ i
8 K v: ]2 z3 x0 f! q( p0 m. V通过url跳转欺骗交易用户对URL的信任,从而实现欺诈- d6 y8 O0 V; ?1 |
" y/ y, G: S; t, y" f8 M7 Nc http://hi.baidu.com/rayh4c/blog/ ... a2045e9822edb9.html
4 M+ r [3 h; c' w, L, K- W
+ z5 N2 L& \$ j% u$ m( W, ~通过URL跳转绕过应用程序对引用资源的限制,从而导致安全漏洞1 y) w3 Y8 U- L1 t# F
# l% j6 \; f# ?6 K p" Z; C, R9 V4 U5 h
d WooYun: 豆瓣电台认证绕过及csrf防范策略绕过漏洞
! e, O6 b) D# K# U' W& R; M2 e( W
: u7 k1 j8 j' ~4 r7 C: g借助未验证的URL跳转,可以将应用程序内部敏感的数据传递到不安全的第三方区域: U7 @4 V" i3 i# L: b( m; c. K
3 b* C6 Y/ J0 G3 { X) j5 n l0x04 修复方案
' B3 x2 f) q+ {- Z" c/ g# _7 a3 x
理论上讲,url跳转属于CSRF的一种,我们需要对传入的URL做有效性的认证,保证该URL来自于正确的地方,限制的方式同防止csrf一样可以包括:
. } f Q7 b# t* b _4 b
* G! V! A8 d3 G4 M& K% s1 referer的限制; ?5 x2 n: [2 o
: y+ H/ \! P: q" k0 o* q9 S( J
如果确定传递URL参数进入的来源,我们可以通过该方式实现安全限制,保证该URL的有效性,避免恶意用户自己生成跳转链接, W* F+ m4 a2 s( O, t; j/ X
9 S( B& V" B1 j, C" A2 加入有效性验证Token
6 K8 v3 b5 m( o# O4 o6 \+ M% v( Q, w. {
我们保证所有生成的链接都是来自于我们可信域的,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验,可以避免用户生成自己的恶意链接从而被利用,但是如果功能本身要求比较开放,可能导致有一定的限制。
8 d# t7 M O) M5 J$ _- n' o( n0 D; W+ K1 i+ |7 m+ q8 D$ Y
|