1、概念
开放重定向(Open Redirect
),也叫URL跳转漏洞,是指服务端未对传入的跳转URL变量进行检查和控制,导致诱导用户跳转到恶意网站,由于是从可信站点跳转出去,用户会比较信任。
注:本文中www.xxx.com和www.evil.com均非真实网站,只是举个例子
2、漏洞原理
URL跳转三种实现方式:
- META标签内跳转
javascript
跳转header
头跳转
观察响应包,每种跳转方式对应的漏洞和利用方法也不同。
漏洞产生原因:
- 代码层忽视URL跳转漏洞,或不知道/不认为这是个漏洞;
- 代码层过滤不严,用取子串、取后缀等方法简单判断,代码逻辑可被绕过;
- 对传入参数操作(域名剪切/拼接/重组)和判断不当,导致绕过;
- 原始语言自带的解析URL、判断域名的函数库出现逻辑漏洞或者意外特性;
- 服务器/容器特性、浏览器等对标准URL协议解析处理等差异性导致被绕过;
3、漏洞危害
URL跳转漏洞本身属于低危漏洞,但可以结合其他漏洞加以深入利用,主要的利用方式不仅限于钓鱼攻击,包括:
- xss漏洞:通过
javascript:alert(0)
或CRLF
; - 获取用户权限(伪造钓鱼网站、窃取登录凭证token);
- 绕过检测(窃取
CSRF token
,绕过SSRF
、RCE黑名单); - 高级利用方法(配合其他功能/漏洞)。
利用姿势不局限于上述几种。
如何挖掘url跳转漏洞-业务场景
1、登录退出授权认证
2、业务完成处(注册找回密码充值绑定银行卡某业务办理404跳转)
3、用户交互处(评论问卷分享收藏点击站内链接或其他用户)
4、漏洞构造漏洞 (任意上传后的html,引用其跳转)
5、跨站点认证、授权后,会跳转
6、浏览器或页面的返回,基于referer,可以尝试修改
7、登录处小技巧
1
登录:http://www.xxx.com/login/?url=http://www.evil.com
2
退出:http://
www.xxx
.com
/
logout
/?url=http://www.evil.com
3
尝试把 login 改为
logout
8、跳转目录的,
1
https:
/
/www.xxx.com/
?redirect=
/user/info
.php
2
修改为
3
https:
/
/www.xxx.com/
[email protected]
这种情况通常@也可以跳转,大胆的去尝试
9、点击触发达到绕过URL跳转限制
1
https:
/
/www.xxx.com/
?redirect=
/user/info
.php
2
修改为
3
https:
/
/www.xxx.com/
[email protected]
这种情况通常@也可以跳转,大胆的去尝试 1234
比如很多登陆页面的地方,其URL是一个跳转的URL 如:
http://www.xxx.com/acb?Url=http://www.evil.com
你直接修改了后面为任意URL,但是还是停留在原地,似乎没什么问题,但是,当你输入账号和密码后点击登陆按钮后,就会触发跳转。
当然,这个账户和密码不一定要对的,随便都可以,但得视系统而定吧。这个我遇到了很多,比如你修改了域名,然后点击登陆,登陆成功后便可触发跳转,这也是一个比较隐蔽的绕过URL限制的跳转。
10、POST参数中的URL跳转
当然,这个影响就很小了,比如当你填什么表格或者需要填写什么的
当你上传图片,点击下一步的时候,通常下一步就是预览你填写的信息,最后才是提交。
举个例子,当你上传了图片后点击下一步抓包,如果过滤不严,你会
看到图片的完整地址包含在POST参数里,你就可以直接修改这个地址为任意URL,然后到达下一步。这时是确定信息也就是预览自己填写的信息的正确还是不正确,由于你刚刚修改了图片地址,这里是没有显示出来的,图像会是一个小XX。
(当点击图片右键选择查看图像时,就会触发URL跳转问题,其实这个也可以利用来进行钓鱼,钓后台审核员的信息。)
为什么呢,比如审核看到图片无法加载,一般都会点击查看图片,然后跳转,如果安全意识不知就会造成安全影响。当然,如果POST参数里就只是URL跳转参数,那么你可以给它转成GET方式,然后进行跳转就可以了,只要网站支持这样的GET方式就行。在Burp Suite
里可以一键转换提交方式,右键选择Change request method
就可以!
Fuzz
根据这些点我们可以考虑利用fuzz
来对其进行探查出跳转漏洞
fuzz
中理解为分 2 种
- 盲 fuzz 来找跳转参数
- 针对性找跳转参数
常见的参数名
收集了一些常见的跳转参数名
1
redirect
2
url
3
redirectUrl
4
callback
5
return_url
6
toUrl
7
ReturnUrl
8
fromUrl
9
redUrl
10
request
11
redirect_to
12
redirect_url
13
jump jump_to
14
target
15
to
16
goto
17
link
18
linkto
19
domain
20
oauth_callback
21
Out
22
Dout
23
goreturn
24
returnTo
25
logout
26
register
27
login
28
path
29
redirectURI
30
redir
31
returl
32
share
33
wap
34
src
35
source
36
u
37
display
38
sourceURl
39
imageURL
40
linkurl
41
service
42
redirect_uri
43
destUrl
44
oauth
45
r_url
46
returnUri
47
locationUrl
48
qurl
49
data
50
ext
51
clickurl
52
next
53
callback_url
54
jump_url
55
click?u
56
originUrl
57
sp_url
58
rit_url
59
forward_url
60
forward success
61
recurl
62
j?url
63
uri
64
allinurl
65
q
66
linkAddress
67
location
68
pic
69
burl
70
backurl
71
origin
72
page
73
u1
74
action
75
action_url
76
dest
白盒代码审计参考
几种语句和框架版本常见的URL跳转代码如下,可用作白盒代码审计参考:
Java:
1
response.sendRedirect(request.getParameter(
"url"
));
PHP:
1
$redirect_url
=
$_GET
[
'url'
];
2
header(
"Location: "
.
$redirect_url
);
.NET:
1
string
redirect_url =
request
.QueryString[
"url"
];
2
Response
.Redirect(redirect_url);
Django:
1
redirect_url =
request
.
GET
.
get
(
"url"
)
2
HttpResponseRedirect(redirect_url)
3
Flask: redirect_url =
request
.form[
'url']
4
redirect(redirect_url) Rails: redirect_to params[:url]
Flask:
1
redirect_url
= request.form[
'url'
]
2
redirect
(redirect_url)
Rails:
1
redirect_to
params
[:url]
URL跳转漏洞bypass总结
tips:URL跳转绕过方式类似SSRF,可以参考SSRF的bypass方式
另外有两个小技巧
- 校验目录 可能会校验某个路径的目录
- 可能需要登录
1
|@www.evil.com
2
/www.evil.com
3
//www.evil.com
4
///www.evil.com
5
////www.evil.com
6
www.evil.com
7
\www.evil.com
8
\www.evil.com
9
\\www.evil.com
10
/www.evil.com
11
@www.evil.com
12
?www.evil.com
0x01:利用"@"符号绕过
1
http:
//
[email protected]
0x02:利用"?"号绕过
1
http:
//www.xxx.com?www.evil.com
0x03:利用"#"符号绕过
1
http://www.xxx.com
#www.evil.com
0x04
1
http:
//www.xxx.com/www.evil.com
0x05
1
http:
//www.baidu.comwww.evil.com
0x06:利用"."绕过
1
http:
//www.xxx.com.evil.com
2
http:
//xxx.com.evil.com
3
或
4
https:
//www.xxx.com/redirect.php?url=.evil
(可能会跳转到evil.com域名,也可能会跳转到www.xxx.com.evil域名)
0x07:xip.io绕过
1
http:
//www.xxx.com.<替换IP地址>.xip.io
0x08利用白名单缺陷绕过限制
1
evil.com
#百度找一个黄网跳转证明危害
或者比如,当跳转的域名包含这个网站下的所有域名,比如:http://www.xxx.com/acb?Url=http://login.xxx.com.
这个login.xxx.com
也可以改成xxx.com
同样可以跳转对吧
因为白名单里只要有包含这个域名就直接成功跳转。那么当我在这个域名前面加上如testxxx.com
,白名单里会检查是否包含xxx.com
这个域名,如果包含,就直接跳转,而并没有检查这个域名的整个信息,然后可以利用这个问题,直接注册一个testxxx.com
这个域名,就可以利用这个跳转。
0x09:利用超链接多重验证绕过可信站点限制
比如一个URL,它是可以直接跳转的,但是一般测试跳转时大家习惯用 www.baidu.com
或qq.com
这样的可信站点进行测试,但是有些网站是可以跳转这些网站的。
只要是可信站点且常用,基本都可以跳转,那么这就属于正常的业务逻辑了,难道就这样错失一个URL跳转漏洞了?
其实不然,只要你的URL被百度收录过,那么直接搜索你的域名,site:xxx.xxx
因为你在百度里点击你的域名,它会先是一个302跳转,而这个302跳转就是百度下的302跳转,那么这样就可以绕过可信站点的限制,从而达到跳转到指定URL。
当然,百度这个302有点长,你给它进行加密就行。
插入截断字符
1
%00 &0a %0d %07
其它绕过思路
其他思路:使用IP地址、IPv6地址、更换ftp、gopher协议
- 跳转到IP地址,而不是域名;
- 跳转到IPV6地址,而不是IPv4地址;
- 将要跳转到的IP地址用10进制、8进制、16进制形式表示;
1
例如,
baidu
IP
:183
.232
.231
.172
2
转16进制:
b7
e8
e7
ac
3
再转8进制:026772163654
原文始发于微信公众号(梅苑安全学术):URL跳转漏洞挖掘
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论