前言
发点之前记录的笔记,主要记录了一些关键点。如果某一点看不懂就去学习吧。
JNDI注入
- jndi本质就是存放各种引用,客户端拿到引用再去找对应的对象
- RMI
- 利用rmi反序列化。
- RMI客户端的上下文环境允许访问远程Codebase。
- 属性 java.rmi.server.useCodebaseOnly 的值必需为false。
- 从JDK 6u45、7u21开始,java.rmi.server.useCodebaseOnly 的默认值就是true。当该值为true时,将禁用自动加载远程类文件
- RMI + JNDI Reference
- 使用了Reference对象
- RMI服务返回一个JNDI Naming Reference,受害者解码Reference时会去我们指定的Codebase远程地址加载恶意Factory类
- 原理上并非使用RMI Class Loading机制的,因此不受 java.rmi.server.useCodebaseOnly 系统属性的限制
- JDK 6u132, JDK 7u122, JDK 8u113 限制了JNDI Reference远程加载Object Factory类的特性
- LDAP + JNDI Reference
- 使用了Reference对象
- LDAP也能返回JNDI Reference对象,利用过程与上面RMI Reference基本一致
- 利用LDAP服务的Reference远程加载Factory类
- JDK 11.0.1、8u191、7u201、6u211之后com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被调整为false
- JDK 8u191 bypass 利用本地的Factory类执行命令
- 使用了ResourceRef对象
- 可以在返回的Reference中指定Factory Class
- 在tomcat8之后,最常用org.apache.naming.factory.BeanFactory配合javax.el.ELProcessor达到rce目的
- javax.management.loading.MLet,是 JDK 自带的。无法rce可用于gadget探测
- groovy.lang.GroovyClassLoader
- new org.yaml.snakeyaml.Yaml().load(String)。 SnakeYaml比Groovy更常见。
- new com.thoughtworks.xstream.XStream().fromXML(String)。XStream同样常见
- org.mvel2.sh.ShellSession#exec(String)
- com.sun.glass.utils.NativeLibLoader是JDK的类,它有一个loadLibrary(String)方法。
- 更多见ref
- JDK 8u191 bypass 利用反序列化Gadget完成命令执行
- 直接返回Java对象,如果对象的javaSerializedData 属性值不为空,则客户端的 obj.decodeObject() 方法就会对这个字段的内容进行反序列化
- 依赖各种Gadget,如cc链
ref
- https://paper.seebug.org/942/
- https://tttang.com/archive/1405/