URL跳转漏洞(URL重定向漏洞),跳转漏洞一般用于钓鱼攻击。

https://link.zhihu.com/?target=https://edu.lagou.com/

原理:
        URL跳转漏洞本质上是利用Web应用中带有重定向功能的业务,将用户从一个网站重定向到另一个网站。其最简单的利用方式为诱导用户访问http://www.aaa.com?returnUrl=http://www.evil.com,借助www.aaa.com让用户访问www.evil.com,这种漏洞被利用了对用户和公司都是一种损失。

1、使用场景

(1)登录功能一直是URL跳转漏洞的重灾区,用户访问网站某个业务,当涉及到账号角色权限的时候一定需要跳转到登陆界面,为了确保用户体验认证结束之后需要自动返回用户之前浏览的页面。这一去一回之间就产生了URL跳转漏洞的隐患。

        举个例子,比如用户正在访问http://www.aaa.com/detail?sku=123456的商品,添加购物车时触发登录操作,跳转到统一登陆认证页面进行登录,这时的访问链接为http://login.aaa.com?returnUrl=http://www.aaa.com/detail?sku=123456,认证成功之后浏览器继续返回商品详情页面方便用户进行购买操作。若login.aaa.com对returnUrl参数检查不严格甚至未检查,通过该链接可跳转至任意网站。

        登录之后302跳转到百度首页,此处returnUrl未进行任何检查,可任意跳转到第三方页面。与登录功能同理,网站的退出功能同样存在URL跳转漏洞的风险。其他类似的跳转功能还有短信验证码认证之后跳转、分享或者收藏之后跳转、给第三方授权之后跳转,他们的共同特点都是从一个页面为了某种操作进入另一个页面,操作之后返回原页面继续浏览。有的多步操作业务中,点击下一步按钮时会传递fromUrl参数,该参数会成为返回上一步的超链接,如下所示: 

        甚至有的业务中callback参数也存在URL跳转漏洞。常见的参数值有return、redirect、url、jump、goto、target、link等,平时挖漏洞的过程中不妨关注下请求中是否含有比较完整的URL地址,对该类参数进行下测试。 

(2)如果 lagou.com 下的某个 web 应用程序存在这个漏洞,恶意攻击者可以发送给用户一个 lagou.com 的链接,但是用户打开后,却来到钓鱼网站页面,将会导致用户被钓鱼攻击,账号被盗,或账号相关财产被盗。

(3)漏洞发生的场景:

  1. 用户登录、统一身份认证处,认证完后会跳转
  2. 用户分享、收藏内容过后,会跳转
  3. 跨站点认证、授权后,会跳转
  4. 站内点击其它网址链接时,会跳转
  5. 业务完成后跳转
    • 比如修改密码,修改完成后跳转登陆页面,绑定银行卡,绑定成功后返回银行卡充值等页面
    • 比如评价系统,填写完问卷调查、客服评价等业务操作后跳转页面

(4)漏洞出现的原因:

  • 写代码时没有考虑过任意URL跳转漏洞,或者根本不知道/不认为这是个漏洞;
  • 写代码时考虑不周,用取子串、取后缀等方法简单判断,代码逻辑可被绕过;
  • 对传入参数做一些奇葩的操作(域名剪切/拼接/重组)和判断,适得其反,反被绕过;
  • 原始语言自带的解析URL、判断域名的函数库出现逻辑漏洞或者意外特性,可被绕过;
  • 原始语言、服务器/容器特性、浏览器等对标准URL协议解析处理等差异性导致被绕过。

(5)常见的参数名

  • redirect
  • redirect_to
  • redirect_url
  • url
  • jump
  • jump_to
  • target
  • to
  • link
  • linkto
  • domain

2、URL跳转漏洞挖掘

后面假设源域名为:www.abc.com 要跳转过去的域为:www.evil.com (钓鱼)

(1)无任何检查,直接跳转

//获取参数
String url = request.getParameter("returnUrl");
//重定向
response.sendRedirect(url);

(2)域名字符串检测欺骗,代码不完善,存在漏洞

//获取参数
String url = request.getParameter("returnUrl");
//判断是否包含域名
if (url.indexOf("www.abc.com ") !=-1){
    response.sendRedirect(url);
}

http://www.abc.com?returnUrl=http://www.abc.com.evil.com
http://www.abc.com?returnUrl=http://www.evil.com/www.abc.com

(3)bypass方式

http://www.aaa.com?returnUrl=http://www.aaa.com.evil.com
http://www.aaa.com?returnUrl=http://www.evil.com/www.aaa.com

若再配合URL的各种特性符号,绕过姿势可是多种多样。比如

利用问号?:
http://www.aaa.com?returnUrl=http://www.evil.com?www.aaa.com
利用反斜线:
http://www.aaa.com?returnUrl=http://www.evil.comwww.aaa.com
http://www.aaa.com?returnUrl=http://www.evil.com\www.aaa.com
利用@符号:
http://www.aaa.com?returnUrl=http://www.aaa.com@www.evil.com
利用井号#:

http://www.aaa.com?returnUrl=http://www.evil.com#www.aaa.com
http://www.aaa.com?returnUrl=http://www.evil.com#www.aaa.com?www.
aaa.com

缺失协议:
http://www.aaa.com?returnUrl=/www.evil.com
http://www.aaa.com?returnUrl=//www.evil.com
多次跳转,即aaa公司信任ccc公司,ccc公司同样存在漏洞或者提供跳转服务:
http://www.aaa.com?returnUrl=http://www.ccc.com?jumpto=http://www.evil.com

3、防护方案

限制referer、添加token,这样可以避免恶意用户构造跳转链接到处散播,修复该漏洞最根本的方法还是上述的严格检查跳转域名

  1. 代码固定跳转地址,不让用户控制变量
  2. 跳转目标地址采用白名单映射机制 比如1代表edu.lagou.com,2代表job.lagou.com,其它记录日志
  3. 合理充分的校验机制,校验跳转的目标地址,非己方地址时告知用户跳转风险
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐