Java代码审计——URL 跳转漏洞

news2025/8/8 2:31:32

目录

(一)URL 跳转漏洞简介

(二)URL 重定向

1.通过 ModelAndView 方式

2.通过返回 String 方式

3.使用 sendRedirect 方式

4.使用 RedirectAttributes 方式

5.通过设置 Header 来进行跳转

(三)URL 跳转漏洞审计

 (四)修复

小结


(一)URL 跳转漏洞简介


        URL 跳转漏洞也叫作 URL 重定向漏洞,由于服务端未对传入的跳转地址进行检查和控制,从而导致攻击者可以构造任意一个恶意地址,诱导用户跳转至恶意站点。因为是从用户可信站点跳转出去的,用户会比较信任该站点,所以 URL 跳转漏洞常用于钓鱼攻击,通过转到攻击者精心构造的恶意网站来欺骗用户输入信息,从而盗取用户的账号和密码等敏感信息,更甚者会欺骗用户进行金钱交易
        URL 跳转漏洞的成因并不复杂,主要是服务端未对传入的跳转 URL 变量进行检查和控制,或者对传入的跳转 URL 变量过滤不严格导致的,图 1 -1  所示为一次 URL跳转攻击
图 1-1 一次 URL 跳转攻击

 

        攻击者首先精心构造一个钓鱼站点 A ,然后利用 URL 跳转漏洞修改目的跳转地址,使原本应跳转到可信任站点 C 的地址变成钓鱼站点 A 。由于用户信任站点B,而钓鱼站点 A 又是从可信任站点 B 中重定向的,因此可能对钓鱼站点 A 同样信任。用户一旦用户输入相关的敏感信息,就可能被攻击者窃取。
        一般来讲,对于 URL 跳转漏洞在黑盒测试时主要的关注点为:注意 URL 中是否带有return、 redirect url jump goto target link 等参数值,并注意观察后跟的 URL 地址的具体格式,再构造相应的 payload 尝试跳转。在白盒审计中我们则会重点关注可以进行URL 跳转的相关方法。

(二)URL 重定向


         Spring MVC 中使用重定向的场景很多,一般有以下几种方法来进行 URL 重定向

1.通过 ModelAndView 方式

public ModelAndView testforward(HttpServletRequest req, HttpServletResponse resp) throws Exception { 
     String url =req.getParameter("url"); 
     String url = "redirect: "+url; 
             return new ModelAndView(url); 
}
        URL 跳转使用方式: http://www.any.com/index.jsp?url=http://www.xxx.com

2.通过返回 String 方式

public String redirect(@RequestParam("url") String url) { 
     return "redirect:" + url; 
 }
        URL 跳转使用方式: http://www.any.com/index.jsp?url=http://www.xxx.com

3.使用 sendRedirect 方式

public static void sendRedirect(HttpServletRequest request, HttpServletResponse response) throws 
IOException{ 
 String url = request.getParameter("url"); 
 response.sendRedirect(url); 
}

4.使用 RedirectAttributes 方式

        对于一般的 URL 跳转,使用 redirect 即可满足要求。如果需要进行参数拼接,则一般使用 RedirectAttributes
@RequestMapping("/RedirectAttributes") 
public String test4(RedirectAttributes redirectAttributes) { 
     redirectAttributes.addAttribute("id","2"); 
         return "redirect:/test/index"; 
}
        URL 跳转使用方式: http://www.any.com/RedirectAttributes
@RequestMapping("/RedirectAttributes") 在方法前面要说明 URL 访问是通过
http://192.168.88.2:8080/RedirectAttributes 来访问,代码中“return "redirect:/test/index";”
就会重定向到 http://192.168.88.2:8080/test/index 这 个 URL ,通过“ redirectAttributes.
addAttribute("id","2") ”传递了 id=2 这个参数,所以最终访问的其实是 http://192.168.88.2:
8080/test/index?id=2 这个 URL 地址。 RequestMapping 的执行效果如图 1 -2  所示
图 1-2 RequestMapping 执行效果

5.通过设置 Header 来进行跳转

 

public static void setHeader(HttpServletRequest request, HttpServletResponse response){ 
 String url = request.getParameter("url"); 
     response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); 
     response.setHeader("Location", url); 
}
        通过“response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY) 设置返回的状态码,“SC_MOVED_PERMANENTLY 301 永久重定向, SC_MOVED_TEMPORARILY” 302 临时重定向。
        URL 跳转使用方式: http://www.any.com/index.jsp?url=http://www.xxx.com
        通过上面这些方法可以总结出 URL 跳转漏洞一些常见的关键字如下:
redirect 
sendRedirect 
ModelAndView 
Location 
addAttribute
引发 URL 跳转漏洞的原因有很多,但大多是以下几点
  • 开发人员不具备安全意识,编写代码时没有考虑任意 URL 跳转漏洞;
String url = request.getParameter("url"); 
response.sendRedirect(url);

  • 开发人员具有一定的安全意识,但是编写代码时考虑不够缜密,采用取关键字、取后缀等方法简单判断要跳转的地址,使代码逻辑可被绕过;
String trustUrl = "www.domain.com"; 
String url = request.getParameter("returnUrl"); 
if (url.substring(0,trustUrl.length()) == trustUrl) 
{ 
 response.sendRedirect(url); 
}
此处开发者认为只要判定传入的 URL 地址前若干位为其事先设置好的白名单的地址,则认为该地址是安全和可信的地址,并执行跳转。但对于上述字符串检测操作,均可以采用欺骗手法或者配合 URL 的各种特性符号绕过判断,如下所示
www.test.com/?redirectUrl=http://www.domain.com.hacker.net。
www.test.com/?redirectUrl=http://www.domain.com/www.hacker.net。
www.test.com/?redirectUrl=http://www.domain.com?www.hacker.net。
www.test.com/?redirectUrl=http://www.domain.com@www.hacker.net。
www.test.com/?redirectUrl=http://www.domain.com#www.hacker.net。
  • 开发人员对于传入的 URL地址进行切割、拼接,导致攻击者可以利用其代码本身的逻辑进行绕过;
  • 由于使用的开发语言的特性、服务器/容器特性、浏览器特性等对标准 URL 协议解析处理等差异性导致被绕过;
  • 由于使用的开发语言的某些判断域名的函数库出现逻辑漏洞或者意外特性,导致被绕过。

(三)URL 跳转漏洞审计


        这次的审计示例,笔者用实际 Java 漏洞代码案例来进行演示。与之前类似,我们先搜索 URL 跳转常见关键字,定位到可能存在问题的代码段,如图 3 -1  所示
图 3-1 定位到可能存在问题的代码段

      

    通过搜索我们不难找到 RedirectController.java 文件中存在 sendRedirect 关键字,接着我们只需和 XSS 漏洞一样查看前后逻辑以及参数是否可控。这里可以清晰地看见程序是通过 GET 方法获得 url 参数,随后拼入 sendRedirect 方法进行跳转的,如图 3-2 所示

图 3-2 拼入 sendRedirect 方法进行跳转

 

        整个漏洞的产生十分简单,因此我们的漏洞利用也相对简单。只需根据 Spring MVC的 RequestMapping 找到对应路由并拼入 url 参数,将 url 参数值改为需要跳转的地址即可,在真实情况下一般为钓鱼页面,通过 url 参数传入“ http://www.xxx.com ”后,发现302 已经跳转到了“ http://www.xxx.com ”这个地址,如图 3 -3  所示
图 3-3 漏洞利用

 (四)修复


针对跳转逻辑的漏洞有很多修复方式,具体如下
  • 若跳转的 URL 事先是可以确定的,那么设置好白名单,并且采用全匹配的方式去检索关键字/域名;也可以先配置好相关参数,只需传对应 URL 的索引即可通过索引找到对应的具体 URL,然后再进行跳转。
  • 若事先无法确定跳转的 URL,且并不是由用户通过参数传入的,那么可以首先生成跳转链接,然后进行签名,只有通过验证签名才能进行跳转。
  • 若跳转的 URL 事先无法确定,并且是由用户通过参数传入的,则必须在跳转时对传入的 URL 进行详细校验,包括但不局限于:是否是白名单内的 URL,是否包含有相关特殊字符,是否处理好不规则协议、不规则地址的请求等方式。

小结


        URL 跳转漏洞容易被安全人员忽视,认为其仅能够进行钓鱼攻击,但其实在各种复杂的实际场景中,URL 跳转漏洞也可以引起 XSS 等漏洞,因此绝不可以忽视其危害性。目前若发现此类型漏洞并汇报给国外厂商,汇报者可以获得几十到几百美元不等的报酬,可以看出厂商对于此类型漏洞的重视。对于安全审计人员来说,审计该类型漏洞时,不仅要重点关注上文中提到的关键参数和关键函数,还应对开发者编写的跳转限制规则进行 fuzzing 测试,判断是否有可用的特殊字符或者特殊编码来绕过限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elastic 概述

引言 1.1 海量数据 在海量数据中执行搜索功能时,如果使用MySQL,效率太低。 1.2 全文检索 在海量数据中执行搜索功能时,如果使用MySQL,效率太低。 1.3 高亮显示 将搜索关键字,以红色的字体展示。 ES概述 ES 也是一个n…

加锁和解锁-ReentrantLock详解-AQS-并发编程(Java)

文章目录1 AQS1.1 概念1.2 两种锁机制1.3 公平锁和非公平锁1.3 锁竞争1.4 条件变量2 ReentrantLock2.1 简介2 加锁2.1 加锁成功2.2 加锁失败2.2.1 tryAcquire()2.2.2 addWaiter()2.2.3 acquireQueued()2.2.3.1 主方法2.2.3.2 shouldParkAfterFailedAcquire()2.2.3.3 parkAndChe…

LeetCode 84.柱状图中最大的矩形

今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一…

pdf生成:puppeteer

一、Puppeteer Puppeteer是Google Chrome团队出品的一款无界面Chrome工具,它提供了丰富的API,让开发者像鼠标一样控制浏览器的各种行为。Puppeteer是一个Node库,提供发了一个高级API来通过DevTools协议控制Chromium或Chrome。Puppeteer默认以…

SDN实战团技术分享(三十八):DPDK助力NFV与云计算

DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理。 什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库;对于开发者来说,它可能是一个实践包处…

配置鼠标右键edit with notepad

注:notepad为一个轻量级的代码文本编辑器,还可以安装代码对比工具等,大大提供办公效率,十分方便。安装后,可能右键无法直接用notepad打开,需要在软件中,选择文件打开,本文介绍如果设…

内网Windows Git Server部署

疫情下,公司与家用电脑切换,导致代码更新接不上,最最最重要公司代码不能上传外网,因此内网 Git Server部署这稿子。 Server部署主要安装【Java、Git、TortoiseGit、Gitblit】前三为傻瓜安装,重点为Gitblit配置修改及部…

Flutter高仿微信-第36篇-单聊-语音通话

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 目前市场上第三方音频接口的价格高的吓人 语音通话价格: 5元/千分钟…

大规模ddos攻击事件,ddos攻击会暴露ip吗

1月4日,谷歌云安全可靠性工程师Damian Menscher在推特上表示,根据CVE-2021-22205漏洞利用报告,有攻击者正在利用 GitLab 托管服务器上的安全漏洞来构建僵尸网络,并发起规模惊人的分布式拒绝服务攻击(DDoS)其…

产品新人必看:入职前的准备及快速适应产品工作

​我第一次做分享,没有什么经验,不知道能不能讲好。 我先自我介绍一下,我是从UED转产品的,我现在这家公司已经快干了一年了,我是去年的5月份入职的。 求职期间陪学也帮了我很多忙,我基本上是全天有什么问…

线上课和线下课各自优缺点,PLC工程师进阶上位机应该知道

先说线上课优点: 价格较低, 视频学习,可以随时随地学习,不用辞职学习,降低职业风险 缺点: 没有学习氛围,对于自制能力差的同学,很难坚持下去 没有老师指点,一旦遇到问题很…

利用Amber热力学积分计算相对自由能变化

上周四,何博士为大家在北鲲云的直播间分享了Amber热力学积分计算相对自由能变化(直播回放可在视频号:北鲲云-直播回放中查看)。 直播结束后有很多小伙伴来向我们要PPT资料,这里何博士也为大家准备了文字版本的教程。将…

企业实战!基于Harbor搭建企业镜像仓库

企业实战!基于Harbor搭建企业镜像仓库 虽然Docker官方提供了Docker Hub作为公共的Registry服务器,给到用户进行镜像的保存和管理工作。但对于企业而言,考虑到安全性和网络效率等原因,通常会搭建私有的Registry服务器,用…

<C++>深度学习多态

目录 一、概念 二、多态的定义及实现 虚函数重写的两个例外: C11override 和 rinal 三、抽象类 接口继承和实现继承 四、多态的原理 五、单继承和多继承中的虚函数表 六、继承和多态常见的面试题 一、概念 概念:通俗来说,就是多种形…

Redis数据库redisDb源码分析

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、组织方式 Redis服务器将所有的数据库 都保存在src/server.h/redisServer结构中的db数组中。db数组的每个entry都是src/server.h/redisDb结构,每个redisDb结构代表一个数据库。Redis默认有16个数据库。 1.1…

TDengine安装使用

引言 近期,听说了时序数据库TDengine,本人的好奇心又出来了,同是时序数据库的InfluxDB不也挺好的嘛?通过一些网上的资料以及些简单的实际操作,本人得出的结论是: 数据量少时,InfluxDB的性能好些…

MCE | TGF-β 信号通路

转化生长因子 (Transforming growth factor beta,TGF-β) 是一类多功能的细胞因子,可由多种组织细胞产生。TGF-β 信号通路是由众多成员的多功能细胞因子,与相应的受体、细胞内信号转导分子组成的通路,能影响疾病发生和发展&#…

win10利用minikube在自己的电脑上搭建k8s

首先默认你的电脑上装了docker,没有的话参考这篇 下面开始步入正题: 步骤讲解 首先下载minikube,点击这个链接,根据自己的环境生成相应的配置命令,我自己的话是64位win10系统,管理员打开cmd运行命令如下&#xff1a…

Flutter高仿微信-第33篇-单聊-图片

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 详情请参考 Flutter高仿微信-第29篇-单聊 , 这里只是提取图片实现的…

更简洁的参数校验,使用 SpringBoot Validation 对参数进行校验

在开发接口时,如果要对参数进行校验,你会怎么写?编写 if-else 吗?虽然也能达到效果,但是不够优雅。 今天,推荐一种更简洁的写法,使用 SpringBoot Validation 对方法参数进行校验,特…