• URL跳转漏洞


    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)无任何检查,直接跳转

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

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

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

    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. 合理充分的校验机制,校验跳转的目标地址,非己方地址时告知用户跳转风险
  • 相关阅读:
    径向基神经网络RBF:Matlab实现RBF神经网络(含例子及代码)
    c++学习27qt(三)Qt自定义控件封装,事件处理,绘画和文件读写
    应用程序通过 Envoy 代理和 Jaeger 进行分布式追踪(一)
    MySQL复合查询和内外连接
    Go 锁扩展
    备受以太坊基金会青睐的 Hexlink,构建亿级用户涌入 Web3的入口
    【二叉树】链式结构的一些操作实现
    2yocto 自启动程序(服务)
    找出字符串中第一个匹配项的下标
    linux下下载部署nginx
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/125996801