java之url任意跳转漏洞

1 漏洞介绍

URLRedirect url重定向漏洞也称url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,url重定向主要用来钓鱼,比如url跳转中最常见的跳转在登陆口,支付口,也就是一旦登陆将会跳转任意自己构造的网站,如果设置成自己的url则会造成钓鱼。url跳转常见的地方包括:

  1. 登陆跳转我认为是最常见的跳转类型,认证完后会跳转,所以在登陆的时候建议多观察url参数

  2. 用户分享、收藏内容过后,会跳转

  3. 跨站点认证、授权后,会跳转

  4. 站内点击其它网址链接时,会跳转

  5. 在一些用户交互页面也会出现跳转,如请填写对客服评价,评价成功跳转主页,填写问卷,等等业务,注意观察url。

  6. 业务完成后跳转这可以归结为一类跳转,比如修改密码,修改完成后跳转登陆页面,绑定银行卡,绑定成功后返回银行卡充值等页面,或者说给定一个链接办理VIP,但是你需要认证身份才能访问这个业务,这个时候通常会给定一个链接,认证之后跳转到刚刚要办理VIP的页面。

    2 审计方法

    结合业务场景,通过关键字在web层(Controller、Servlet类文件)中搜索一下关键字,确定漏洞的依据就是看是否直接转发、直接跳转、直接重定向的目的URL是源于前端且没有处理。常见关键字如下:

    • redirect

    • url

    • redirectUrl

    • callback

    • return_url

    • toUrl

    • ReturnUrl

    • fromUrl

    • redUrl

    • request

    • redirect_to

    • redirect_url

    • jump

    • jump_to

    • target

    • to

    • goto

    • linklinkto

    • domain

    • oauth_callback

    3 审计案例

    3.1 案例1-302 redirect

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body><form action="/urlRedirection/setHeader" method="get" enctype="multipart/form-data"><input type="text" name="url" ><input type="submit"></form>
    </body>
    </html>
    @Controller
    @RequestMapping("/urlRedirection")
    public class URLRedirectionController {
    ​//去重定向前端页面@GetMapping("/toRedirectPage")public String toRedirectPage(){System.out.println("重定向漏洞页面");return "Demo13";}
    //302跳转
    @GetMapping("/urlRedirection")public void urlRedirection(HttpServletRequest request, HttpServletResponse response) throws IOException {String url = request.getParameter("url");response.sendRedirect(url);}
    }

    通过上述代码,能够得出,urlRedirection方法接收了源于form表单的参数后直接通过

    response.sendRedirect(url)重定向,也就是说直接访问了来自前端url参数的url。

    当提交之后会直接跳转到百度页面,因此具有一定的风险性

    需要注意的是外部网址必须加http.www,只写域名仍然在改服务器上

    3.2 案例2-301 redirect

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body><form action="/urlRedirection/setHeader" method="get" enctype="multipart/form-data"><input type="text" name="url" ><input type="submit"></form>
    </body>
    </html>
        //去重定向前端页面@GetMapping("/toRedirectPage")public String toRedirectPage(){System.out.println("重定向漏洞页面");return "Demo13";}@RequestMapping("/setHeader")@ResponseBodypublic static void setHeader(HttpServletRequest request, HttpServletResponse response) {String url = request.getParameter("url");response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301 redirectresponse.setHeader("Location", url);}

    同案例1的失效效果一样,只不过是后端发生跳转的类型不一致而已。

    3.3 案例3-urlRedirection重定向

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body><form action="/urlRedirection/setHeader" method="get" enctype="multipart/form-data"><input type="text" name="url" ><input type="submit"></form>
    </body>
    </html>
    @GetMapping("/redirect")
    public String redirect(@RequestParam("url") String url) {
    return "redirect:" + url;
    }

    同案例1、2的效果一样,只不过是后端发生跳转的类型不一致而已。初次外获取参数的形式不一样,通过注解获取的。

    四、修复意见(二选一)

    1、将重定向改成转发

    转发(前往),服务器内部的重定向,在Servlet中通过RequestDispatcher转发给另一个程序处理请

    求,请求的数据依然在。所以forward相当于客户端向服务器发送一次请求,服务器处理两次,请求数

    据不会消失且URL地址只变化一次。因为转发只能在服务器内部进行(内部跳转),不会跳转到外

    部。参考代码如下:

    <%@ page contentType="text/html; charset=UTF-8" %>
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <form action="/urlRedirection/forward" method="get" enctype="multipart/form-data"><input type="text" name="url" ><input type="submit"></form>
    </body>
    </html>
        @RequestMapping("/forward")@ResponseBodypublic static void forward(HttpServletRequest request, HttpServletResponse response) {String url = request.getParameter("url");RequestDispatcher rd = request.getRequestDispatcher(url);try {rd.forward(request, response);} catch (Exception e) {e.printStackTrace();}}

    此时在提交百度一下,你就知道,发现无法跳转成功

    2、白名单与黑名单相结合的限制

    就是将需要重定向的目的URL整理成白名单,在进行重定向前匹配,如果不在白名单中禁止重定向。

    相关白名单校验参考代码如下:

        /*** 同时支持一级域名和多级域名,相关配置在resources目录下url_safe_domain.xml文件。* 优先判断黑名单,如果满足黑名单return null。** @param url the url need to check* @return Safe url returns original url; Illegal url returns null;*/public String checkURL(String url) throws IOException {if (null == url){return null;}try {URL url1 = new URL(url);String host = url1.getHost();// 必须http/httpsif (!url1.getProtocol().equals("https") && !url1.getProtocol().equals("http")) {return null;}
    ​// 如果满足黑名单返回nullif (blackDomains.contains(host)){return null;}for(String blockDomain: blackDomains) {if(host.endsWith("." + blockDomain)) {return null;}}
    ​// 支持多级域名if (safeDomains.contains(host)){return url;}
    ​// 支持一级域名for(String safedomain: safeDomains) {if(host.endsWith("." + safedomain)) {return url;}}return null;} catch (NullPointerException | MalformedURLException e) {e.printStackTrace();return null;}}
    }
    ​

    例如黑名单和白名单的配置如下

    safeDomains=127.0.0.1,127.0.0.2
    blackDomains=baidu.com,qq.com

    当输入baidu.com时,将无法跳转。

    当将baidu.com添加到白名单,同时从黑名单中剔除出去,将成功跳转

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

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

相关文章

Xshell7免费版下载安装使用

​一、下载安装​ 1.打开官网下载 https://www.xshell.com/zh/free-for-home-school/ 2.选择合适的下载路径&#xff0c;点击下载按钮&#xff0c;然后按照提示完成安装。 二、Xshell7的使用&#xff0c;Xhell连接Linux 1.连接之前&#xff0c;确保在Linux中开启SSH。参考&a…

Ubuntu 查看设备温度

要在Ubuntu中查看设备的温度&#xff0c;可以使用一些命令行工具来获取系统硬件的温度信息。下面列出了几种常用的方法&#xff1a; 方法 1: 使用 sensors 命令 sensors 命令用于读取和显示系统中的传感器数据&#xff0c;包括CPU温度和其他硬件传感器的信息。首先需要安装 l…

HAL-按键-MultiButton使用记录

title: HAL-按键-MultiButton使用记录 tags: STM32HalCubemax 文章目录 HAL-按键-MultiButton使用记录值得注意的是注意源函数里面有个类似“心跳“的东西 往期内容基础库HAL cubemax VSCODE GCC HAL-按键-MultiButton使用记录 MultiButton 是一个开源的轻量的按键判断的函数…

LANG、LC_MESSAGES和LC_ALL

在Linux系统中&#xff0c;环境变量LANG、LC_MESSAGES和LC_ALL用于控制系统和应用程序的语言和区域设置&#xff08;locale&#xff09;。它们的具体作用如下&#xff1a; LANG&#xff1a; LANG是最基本的环境变量&#xff0c;用于指定系统的默认语言和区域设置。它是一个全局…

YOLOv8中的C2f模块

文章目录 一、结构概述二、模块功能 一、结构概述 C2f块:首先由一个卷积块(Conv)组成&#xff0c;该卷积块接收输入特征图并生成中间特征图特征图拆分:生成的中间特征图被拆分成两部分&#xff0c;一部分直接传递到最终的Concat块&#xff0c;另一部分传递到多个Botleneck块进…

QT基础 - 文本文件读写

目录 零. 前言 一.读取文件 二. 写入文件 三. 和二进制读写的区别 零. 前言 在 Qt 中&#xff0c;对文本文件进行读写操作是常见的任务之一。这对于保存和加载配置信息、处理数据文件等非常有用。 Qt 提供了多种方式来读写文本文件&#xff0c;使得文件操作变得相对简单和…

SwiftUI 6.0(iOS 18)ScrollView 全新的滚动位置(ScrollPosition)揭秘

概览 在只有方寸之间大小的手持设备上要想体面的向用户展示海量信息&#xff0c;滚动视图&#xff08;ScrollView&#xff09;无疑是绝佳的“东牀之选”。 在 SwiftUI 历史的长河中&#xff0c;总觉得苹果对于 ScrollView 视图功能的升级是在“挤牙膏”。这不&#xff0c;在本…

“浔川AI翻译机v3.0”即将上线!

1 浔川AI翻译机简介&#xff1a; 浔川AI翻译机是一种基于人工智能技术开发的翻译设备。它能够实时将一种语言的文本或口语翻译成另一种语言&#xff0c;使得不同语言之间的交流更加便捷。浔川AI翻译机利用深度学习算法和大数据训练模型&#xff0c;能够自动识别和理解输入的语…

spire.Pdf 将pdf转成image

一、nuget安装 <ItemGroup><PackageReference Include"Spire.PDF" Version"10.6.7" /></ItemGroup> 二、直接上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO;namespace …

Mysql常用函数及技巧

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ 一、round()函数 round()函数用于将数字四射侮辱到指定的小数位&#xff0c;语法如下&#xff1a; round(number, decimals)number…

乱弹篇(35)掩耳盗铃与两三十年

成语“ 掩耳盗铃 ”&#xff0c;比喻自己欺骗自己&#xff0c;明明是掩盖不住的事情偏要想法子掩盖。它多用来讽刺那些做事不想让别人知道&#xff0c;却偏偏又引起他人注意的人。 现在网络上以新浪微博和邪恶的“800727”为典型的自媒体平台和其掌控者&#xff0c;就是现代版…

【Linux基础】基础环境配置

设置APT源 进入源文本设置&#xff1a; vim /etc/apt/sources.list 配置源&#xff1a; #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib#阿里云 deb http:…

提升研发效率:三品PLM解决方案在汽车汽配行业的实践

随着全球汽车市场的快速发展&#xff0c;中国汽车汽配行业迎来了前所未有的发展机遇。然而&#xff0c;在这一过程中&#xff0c;企业也面临着诸多挑战&#xff0c;如研发能力的提升、技术资料管理的复杂性、以及跨部门协作的困难等。为了应对这些挑战&#xff0c;三品产品生命…

Flink assignTimestampsAndWatermarks 深度解析:时间语义与水印生成

目录 概述 时间语义 时间戳分配 水印的作用 最佳实践 案例分析 注意事项 应用场景 概述 在Apache Flink中,assignTimestampsAndWatermarks是一个重要的方法,它允许数据流处理程序根据事件时间(event time)分配时间戳和生成水印(watermarks)。这个方法通常用于处理…

模式分解算法-满足3NF的无损且保持函数依赖的分解算法、满足BCNF的无损连接分解算法

一、引言 1、对指定的关系模式&#xff0c;若范式级别较低&#xff0c;为第一范式或第二范式&#xff0c;由于存在数据冗余或更新异常问题&#xff0c;在实际中一般是不可用的&#xff0c;关系模式的规范化就是将满足低一级的关系模式分解为若干满足高一级范式的关系模式的集合…

金融与教育领域的等保测评分析

简介 等保测评是指信息系统安全等级保护测评&#xff0c;它是根据国家相关法律法规和标准&#xff0c;对信息系统安全等级进行的评估和认证。金融与教育领域作为关键信息基础设施的重要组成部分&#xff0c;其信息系统安全尤为重要。本文将对这两个领域的等保测评进行分析&…

Python轻松设置Excel单元格数字显示格式

Excel作为强大的数据处理与分析工具&#xff0c;不仅能够存储大量数据&#xff0c;还支持复杂的数据处理与可视化功能。而如何恰当地展示Excel表格中的数据是Excel文件制作的关键之一。这便涉及到Excel单元格数字格式的设置。数字格式不仅关乎数据的美学呈现&#xff0c;如货币…

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明&#xff0c;刚开始接触可能在理解上会有些困难&#xff0c;可以简单地把它理解为一个盲盒&#xff0c;你可以任意猜测盒子有什么东西&#xff0c;并认为这些东西真正存在而进行处理&#xff0c;等到真正打开时&#xff0…

网上的流量卡真的可以免费领取吗?

网上的流量卡真的可以免费领取吗&#xff1f;当然可以&#xff0c;目前运营商推出的流量卡都是可以免费领取的。 有很多朋友私信给小编&#xff0c;听说流量卡是免费领取的就觉得不太靠谱&#xff0c;其实这种想法是不对的&#xff0c;首先大家要换位思考一下&#xff0c;如果我…

计算机建模| FIT3139 Computational Modelling and Simulation – PAPER 1

本次澳洲写主要为计算机建模相关的限时测试 Question 1 [10 marks 5 5 ] This question is about errors and computer arithmetic. A) Determine an expression that approximates the condition number for the following function: f(x) e3x21 B) Explain what are the …