java安全JNDI注入总结笔记

/ 默认分类 / 0 条评论 / 7067 浏览

本站的所有程序和文章,仅限用于学习和研究目的;不得用于商业或者非法用途,否则,一切后果请用户自负!!

前言

发点之前记录的笔记,主要记录了一些关键点。如果某一点看不懂就去学习吧。

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/

本文最后编辑时间为: 2022-03-07

如本文对你有帮助,点击广告支持一下吧,创造不易。

safe6