重定向漏洞备忘录

0x00 原理

做过开发的一定都知道,网站重定向技术分为两种,一种是后台的重定向,比如php,在响应头中写一个location字段,另一种是前台跳转,也就是通过html中的meta标签或者js语言中的函数来跳转。一般来说只能跳转到可信的域名,但如果没有对要跳转的域名做检查或限制,就会造成可以跳转到非可信域名上,比如钓鱼页面。

0x01 漏洞代码分析

比如有下面这段代码:

1
2
3
4
5
<?php
if(isset($_GET['url']) && $_GET['url'] != null){
header('location:'.$_GET['url']);
}
?>

这段代码中未对url参数做任何限制,导致我传入任意域名都会直接跳转过去。

0x02 攻击

比如有一个可信域名mail.com,存在任意跳转的参数url,这时候我构造一个钓鱼页面mail.hacker.com,只要构造成这个链接http://mail.com?url=http://mail.hacker.com发给用户,用户点开连接就会调转到钓鱼页面上,由于钓鱼页面和真实页面外观上一摸一样,安全意识低的用户就会误以为是真实的页面,从而上当受骗。

另外,由于qq,淘宝等url过滤,是基于白名单放行,比如在qq聊天框里发送一个域名,如果这个域名可信,就会显示一个小绿标。如果页面存在重定向漏洞,就会绕过qq、淘宝的这种url检测,让用户误以为是可信的域名。

0x03 防御

我们需要对传入的url做检测和限制,保证该url会跳转到可信的域名上,具体手段:

  1. 对跳转的出口域名写死,或者设置白名单
  2. 全站检测跳转行为,如果检测到跳转行为,就先重定向到一个警示页面,告诫用户将跳转到其他域名(现在各大网站都是这么做的,如 知乎、csdn)

0x04 挖洞

关于如何挖掘此类漏洞,白盒的方法就是检查代码中是否存在跳转相关的代码段,如php中的header('location:'

黑盒的话:

  1. 特别注意站点是否存在oauth登录,这里常常会存在重定向漏洞,
  2. 也可以分析url中的参数名,是否存在诸如urlredirect等字样的参数,再手工或自动化验证。
  3. 也可以从js文件中搜索关键字,在搜索中需要注意大小写的问题

参数字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
returnurl
redirect
redirect_uri
redirect_url
errURL
mainUrl
callback
url
uri
next
target
rurl
dest
destination
redir
out
view
to
image_url
go
return
returnTo
return_to
checkout_url
continue
return_path
a
u
r

绕过姿势

这里需要科普一下url的构成:

1
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

注:中括号[]中的变量为可选参数

scheme:协议,也就是常见的“http”和“https”

user:用户名

password:密码

host:域名,可以只有一级域名,也可以是子域名如www.baidu.com

post:端口号,http端口号就是80,https端口号就是443

path:访问路径,也可以说是资源路径

query:查询参数

fragment:片段,也就是常说的”锚点“,用于定位资源内容

问题就出在,user和password这两个参数是可以省略的,我们常见的url比如https://www.baidu.com是省略了用户名和密码的。有的检测方法只匹配了跟在http://后面的域名,这就出问题了。比如有一个url为http://youku.com:123@baidu.com,用上述的检测方法判定这个域名是”youku.com“,但实际上这个域名是”baidu.com“。那就好了,只要我在用户名处填入一个可信域名,在真实的域名的位置填入一个恶意域名,这样就可以绕过检测从而跳转到恶意网站。

另外经过我的试验,chrome中,一些畸形的url也能被浏览器”智能“地识别纠正过来,这也会造成绕过,如

1
2
3
4
5
6
http::@baidu.com  # 空用户名密码,以及不加双斜杠
http:/baidu.com # 少一个反斜杠
http:///baidu.com # 多一个反斜杠,实际测试中发现n多个反斜杠都没事
http:/@baidu.com
http:baidu.com:@4399.com
...

账号劫持

在oauth处的重定向请求头字段中的敏感信息,如referer等,甚至可以实现账号劫持。参考wooyun-2011-02010

在oauth1.0协议中,oauth_callback参数可重定向到任意网站,在恶意网站接收secret,oauth_token,oauth_verifier关键参数,就可以通过登录接口登录受害者的账户。整个过程只需要受害者点击一个恶意的授权URL即可。


重定向漏洞备忘录
https://wanf3ng.github.io/2022/05/25/重定向漏洞备忘录/
作者
wanf3ng
发布于
2022年5月25日
许可协议