java之url任意跳转漏洞

news2024/11/28 20:43:45

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")
        @ResponseBody
        public static void setHeader(HttpServletRequest request, HttpServletResponse response) {
            String url = request.getParameter("url");
            response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301 redirect
            response.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")
        @ResponseBody
        public 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/https
                if (!url1.getProtocol().equals("https") && !url1.getProtocol().equals("http")) {
                    return null;
                }
    ​
                // 如果满足黑名单返回null
                if (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.coloradmin.cn/o/1851299.html

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

相关文章

操作系统实验一:实验环境搭建与系统调用(在VMWare中安装xv6)

目录 一、实验目的 二、具体任务安排 1.实验环境搭建 2.系统调用 近来有空闲&#xff0c;把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正&#xff0c;有更好的方法也期待您的分享~ 一、实验目的 在Windows中安装VMWare虚拟机、在虚拟机中编译安装Qemu、最终…

【软件工程】【22.04】p1

关键字&#xff1a; 软件需求规约基本性质、数据字典构成、内聚程度最高功能内聚、公有属性、RUP实体类、评审、测试序列、软件确认过程、CMMI能力等级 软件需求分类、DFD数据流图组成&#xff08;实体&#xff09;、经典详细设计、数据耦合、关联多重性、状态图、黑盒测试、…

常见的Wi-Fi蓝牙模组

在嵌入式领域&#xff0c;常见的Wi-Fi蓝牙模组确实包括多个知名品牌&#xff0c;如乐鑫、安信可和移远等&#xff0c;以前可能你听的最多的是ESP8266&#xff0c;不过今天讨论的是Wi-Fi蓝牙模组&#xff0c;而8266本身并不内置蓝牙功能&#xff0c;不在介绍范围。而拿到模块之后…

4、MFC:菜单栏、工具栏与状态栏

菜单栏、工具栏与状态栏 1、菜单栏1.1 简介1.2 创建属性设置菜单消息成员函数 1.3 实例 2、工具栏2.1 简介工具栏属性2.2 创建消息CToolBar类的主要成员函数 2.3 实例 3、状态栏3.1 简介3.2 创建CStatusBar类状态栏创建 3.3 实例 1、菜单栏 1.1 简介 菜单在界面设计中是经常使…

高斯算法的原理及其与常规求和方法的区别

高斯算法的原理 高斯算法的原理源于数学家卡尔弗里德里希高斯在他少年时期发现的一种求和方法。当时老师让学生们计算1到100的和&#xff0c;高斯发现了一种快速计算的方法。 高斯注意到&#xff0c;如果将序列的首尾两数相加&#xff0c;结果总是相同的。例如&#xff1a; …

GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国

快手可灵大模型推出图生视频功能“纯血”鸿蒙大战苹果AI&#xff0c;华为成败在此一举大模型低价火拼间&#xff0c;智谱AI“钱途”黯淡手握新“王者”&#xff0c;腾讯又跟渠道干上了“美食荒漠”杭州&#xff0c;走出一个餐饮IPOGPT-4o一夜被赶超&#xff0c;Anthropic推出Cl…

关于Windows系统下redis的闪退问题。

一、问题分析 首先&#xff0c;有这个问题的一般是如下操作&#xff1a; 1、在运行项目时发现无法连接到redis服务器&#xff0c; 2、进入Redis安装目录(如图)——>鼠标双击打开redis-server.exe&#xff0c;然后闪退&#xff0c; 3、运行redis-cli时提示&#xff1a;“由…

【招聘贴】JAVA后端·唯品会·BASE新加坡

作者|老夏&#xff08;题图&#xff1a;公司业务介绍页&#xff09; “ 请注意&#xff0c;这两个岗是BASE新加坡的&#xff0c;欢迎推荐给身边需要的朋友&#xff08;特别是在新加坡的&#xff09;。” VIP海外业务-产品技术团队&#xff0c;这两个岗位属于后端工程组的岗&…

STM32之二:时钟树

目录 1. 时钟 2. STM3时钟源&#xff08;哪些可以作为时钟信号&#xff09; 2.1 HSE时钟 2.1.1 高速外部时钟信号&#xff08;HSE&#xff09;来源 2.1.2 HSE外部晶体电路配置 2.2 HSI时钟 2.3 PLL时钟 2.4 LSE时钟 2.5 LSI时钟 3. STM32时钟&#xff08;哪些系统使用时…

机器学习课程复习——逻辑回归

1. 激活函数 Q:激活函数有哪些? SigmoidS型函数Tanh 双曲正切函数

【技巧】Leetcode 201. 数字范围按位与【中等】

数字范围按位与 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;left 5, right 7 输出&#xff1a;4 解题思路 …

外部存储器

外部存储器是主存的后援设备&#xff0c;也叫做辅助存储器&#xff0c;简称外存或辅存。 它的特点是容量大、速度慢、价格低&#xff0c;可以脱机保存信息&#xff0c;属于非易失性存储器。 外存主要有&#xff1a;光盘、磁带、磁盘&#xff1b;磁盘和磁带都属于磁表面存储器…

three.js 第八节 - gltf加载器、解码器

// ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入hdr加载器&#xff08;专门加载hdr的&#xff09; import { RGBELoader } from three/examples/jsm/loaders…

工业web4.0UI风格令人惊艳

工业web4.0UI风格令人惊艳

6月27日云技术研讨会 | 中央集中架构新车型功能和网络测试解决方案

会议摘要 “软件定义汽车”新时代下&#xff0c;整车电气电气架构向中央-区域集中式发展已成为行业共识&#xff0c;车型架构的变革带来更复杂的整车功能定义、更多的新技术的应用&#xff08;如SOA服务化、TSN等&#xff09;和更短的车型研发周期&#xff0c;对整车和新产品研…

【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using HuffmanTree TreeNode *;结构体包含三个成员&#xff1a; data 是一个 ElemType 类型的变量&#xff0c;用于存储哈夫曼树节点的数据。left 是一个指向 TreeNode 类型的指针&#xf…

如何混淆 net core 8 架构 C# 编译程序

如何混淆 net core 8 架构 C# 编译程序 一、使用混淆工具 .NET Reactor V6.9二、net core 8 架构 C# 编译程序&#xff08;发布的单文件&#xff09;1、通过发布的单文件程序&#xff0c;可以直接在 .NET Reactor 拖入或打开 &#xff0c;勾选自己需要的保护功能。2、勾选自己需…

不同交换机之间相同VLAN间主机通信

1、搭建网络拓扑 搭建拓扑&#xff0c;分配IP地址&#xff0c;划分vlan&#xff0c;分配端口 2、配置交换机 //进入全局配置模式 Switch>enable Switch#config terminal Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#hostname SW1 …

湖南(市场调研)源点咨询 新产品上市前市场机会调研与研究分析

湖南源点调研认为&#xff1a;无论是创业公司&#xff0c;还是在公司内部探索新的项目或者新的产品线等&#xff0c;首先都要做“市场机会分析与调研“&#xff0c;要真正思考并解答以下疑问&#xff1a; 我们的目标客户群体是谁&#xff0c;他们如何决策&#xff1f; 我们所…

算法:渐进记号的含义及时间复杂度计算

渐进记号及时间复杂度计算 渐近符号渐近记号 Ω \Omega Ω渐进记号 Θ \Theta Θ渐进记号小 ο \omicron ο渐进记号小 ω \omega ω渐进记号大 O \Omicron O常见的时间复杂度关系 时间复杂度计算&#xff1a;递归方程代入法迭代法套用公式法 渐近符号 渐近记号 Ω \Omega Ω …