重定向漏洞备忘录
0x00 原理
做过开发的一定都知道,网站重定向技术分为两种,一种是后台的重定向,比如php,在响应头中写一个location
字段,另一种是前台跳转,也就是通过html中的meta标签或者js语言中的函数来跳转。一般来说只能跳转到可信的域名,但如果没有对要跳转的域名做检查或限制,就会造成可以跳转到非可信域名上,比如钓鱼页面。
0x01 漏洞代码分析
比如有下面这段代码:
1 |
|
这段代码中未对url参数做任何限制,导致我传入任意域名都会直接跳转过去。
0x02 攻击
比如有一个可信域名mail.com,存在任意跳转的参数url,这时候我构造一个钓鱼页面mail.hacker.com,只要构造成这个链接http://mail.com?url=http://mail.hacker.com
发给用户,用户点开连接就会调转到钓鱼页面上,由于钓鱼页面和真实页面外观上一摸一样,安全意识低的用户就会误以为是真实的页面,从而上当受骗。
另外,由于qq,淘宝等url过滤,是基于白名单放行,比如在qq聊天框里发送一个域名,如果这个域名可信,就会显示一个小绿标。如果页面存在重定向漏洞,就会绕过qq、淘宝的这种url检测,让用户误以为是可信的域名。
0x03 防御
我们需要对传入的url做检测和限制,保证该url会跳转到可信的域名上,具体手段:
- 对跳转的出口域名写死,或者设置白名单
- 全站检测跳转行为,如果检测到跳转行为,就先重定向到一个警示页面,告诫用户将跳转到其他域名(现在各大网站都是这么做的,如 知乎、csdn)
0x04 挖洞
关于如何挖掘此类漏洞,白盒的方法就是检查代码中是否存在跳转相关的代码段,如php中的header('location:'
黑盒的话:
- 特别注意站点是否存在oauth登录,这里常常会存在重定向漏洞,
- 也可以分析url中的参数名,是否存在诸如
url
、redirect
等字样的参数,再手工或自动化验证。 - 也可以从js文件中搜索关键字,在搜索中需要注意大小写的问题
参数字典:
1 |
|
绕过姿势
这里需要科普一下url的构成:
1 |
|
注:中括号[]中的变量为可选参数
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 |
|
账号劫持
在oauth处的重定向请求头字段中的敏感信息,如referer等,甚至可以实现账号劫持。参考wooyun-2011-02010
在oauth1.0协议中,oauth_callback参数可重定向到任意网站,在恶意网站接收secret,oauth_token,oauth_verifier关键参数,就可以通过登录接口登录受害者的账户。整个过程只需要受害者点击一个恶意的授权URL即可。