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…

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;在本…

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 …

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

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

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

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

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

一、引言 1、对指定的关系模式&#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;如果我…

Ubuntu配置ssh+vnc(完整版)

Ubuntu配置sshvnc&#xff08;完整版&#xff09; 1 配置ssh 1. 安装openssh-server&#xff0c;配置开机自启 # 更新包 sudo apt-get update # 安装openssh-server sudo apt-get install -y openssh-server # 启动服务 sudo service ssh start # 配置开机自启 sudo systemc…

细说MCU定时器模块的输入捕捉功能的实现方法

目录 一、工程背景 二、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、 配置定时器TIM1 4、 配置定时器TIM13 5、配置串口 6、配置中断 7、配置系统时钟 三、代码修改 1、使能TIM1输入捕捉功能和TIM3的PWM输出功能 2、自定义变量 3、重定义回调函数 4、输出到…

【国际化I18n使用方法】vue2使用i18简单实现多语种切换,刷新保持,动态数据处理

效果图 使用流程 总结就是&#xff0c;安装好插件后&#xff0c;配置几个语言的js文件&#xff0c;每个词都要在每个js内写一遍对应的语言&#xff0c;然后通过切换js文件拿到对应的语言&#xff0c;实现翻译的效果。然后当前使用什么语言保存到本地&#xff0c;这样刷新就可以…

【进阶篇-Day4:使用JAVA编写石头迷阵游戏】

目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码&#xff1a; 1、绘制界面 上述思路是&#xff1a;使用一个二维数组存放图片的编号&#xff0c;然后在后持遍历即可获取对应的图片。 代码如下&#xff1a; package com.itheima.s…

取代煤气灶,新能源电燃灶真有那么牛吗

在当今社会&#xff0c;能源问题日益凸显&#xff0c;能源危机的警钟不断敲响。与此同时&#xff0c;人们对于生活品质和安全环保的要求也越来越高。在这样的背景下&#xff0c;一种号称能取代燃气灶和电磁炉的新能源电燃灶——华火电燃灶进入了人们的视野。 华火电燃灶的出现似…

SpringBoot整合justauth实现多种方式的第三方登陆

目录 0.准备工作 1.引入依赖 2.yml文件 3. Controller代码 4.效果 参考 0.准备工作 你需要获取三方登陆的client-id和client-secret 以github为例 申请地址&#xff1a;Sign in to GitHub GitHub 1.引入依赖 <?xml version"1.0" encoding"UTF-8&quo…

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…

Linux常用命令(16)—awk命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

Java 10新特性介绍

Java 10是Java平台的一个重要更新&#xff0c;它引入了多项新特性和改进。以下是一些主要的新特性&#xff1a; 局部变量类型推断&#xff08;var关键字&#xff09; Java 10允许使用var关键字来声明局部变量&#xff0c;而无需显式指定变量的类型。编译器会根据变量赋值的上下…