从getter到jndi之LdapAttribute反序列化链
字数 1288 2025-08-29 22:41:01

LdapAttribute反序列化链分析与利用

前言

在JDK高版本环境下,当TransformerImpl因模块化机制无法使用时,LdapAttribute类提供了一个新的攻击面。该类通过getter方法触发JNDI注入,为反序列化攻击提供了新的利用途径。

LdapAttribute漏洞分析

关键调用链

  1. 入口点LdapAttribute#getAttributeDefinition()
  2. 触发点getSchema方法
  3. 调用路径
    • PartialCompositeDirContext.getSchema
    • c_resolveIntermediate_nns方法
    • LdapCtx.c_lookup方法
    • decodeObject方法

漏洞原理

LdapAttribute类通过getter方法最终调用了LdapCtx.c_lookup(),这是JNDI注入中的关键方法之一。在JDK高版本下,可以通过LDAP反序列化来绕过JNDI注入限制,但需要相应的gadget支持。

利用场景分析

JDBCParty案例

  • 环境:JDK 17,Tomcat 10.1.31
  • 存在漏洞点:/dbtest路由存在反序列化和JDBC连接
  • 依赖情况:
    • Jackson
    • Fastjson2
    • Tomcat 10.1.31
    • 无直接可用的反序列化链

利用限制

  1. TransformerImpl因模块化不可用
  2. JDBC连接URL不可控
  3. 需要寻找替代的利用链

利用方案

使用LdapAttribute类

将反序列化转换为JNDI注入,适用于JDK高版本环境。

Tomcat环境下的替代方案

在Tomcat 10中,可以使用MemoryUserDatabaseFactory工程类实现:

  1. XXE攻击
  2. 文件写入

MemoryUserDatabaseFactory分析

  1. 关键方法getObjectInstance

    • 检查ResourceRef是否为org.apache.catalina.UserDatabase
    • 实例化MemoryUserDatabase对象
    • 从Reference中提取pathnamereadonly参数
    • 调用setter方法赋值
  2. 执行流程

    • 赋值完成后调用open()方法
    • 如果readonly=false,则调用save()方法
    • open()方法会连接pathName地址并解析返回的XML

攻击构造

LDAP服务端配置

  1. test.xml:恶意XML文件
  2. test.dtd:外部实体定义

利用注意事项

  1. Jackson存在不稳定性,可能需要多次尝试
  2. 文件协议(file://)具有列目录功能,但外带数据限制较大(通常仅限于目录下单个文件)

扩展利用

参考相关研究,该技术还可用于实现RCE(远程代码执行)。

防御建议

  1. 升级JDK到最新版本
  2. 限制反序列化操作
  3. 配置JNDI查找限制
  4. 禁用不必要的XML外部实体解析

参考资源

  1. JNDI注入相关研究
  2. Tomcat MemoryUserDatabase利用
  3. RCE利用技术
LdapAttribute反序列化链分析与利用 前言 在JDK高版本环境下,当TransformerImpl因模块化机制无法使用时,LdapAttribute类提供了一个新的攻击面。该类通过getter方法触发JNDI注入,为反序列化攻击提供了新的利用途径。 LdapAttribute漏洞分析 关键调用链 入口点 : LdapAttribute#getAttributeDefinition() 触发点 : getSchema 方法 调用路径 : PartialCompositeDirContext.getSchema c_resolveIntermediate_nns 方法 LdapCtx.c_lookup 方法 decodeObject 方法 漏洞原理 LdapAttribute类通过getter方法最终调用了 LdapCtx.c_lookup() ,这是JNDI注入中的关键方法之一。在JDK高版本下,可以通过LDAP反序列化来绕过JNDI注入限制,但需要相应的gadget支持。 利用场景分析 JDBCParty案例 环境:JDK 17,Tomcat 10.1.31 存在漏洞点: /dbtest 路由存在反序列化和JDBC连接 依赖情况: Jackson Fastjson2 Tomcat 10.1.31 无直接可用的反序列化链 利用限制 TransformerImpl因模块化不可用 JDBC连接URL不可控 需要寻找替代的利用链 利用方案 使用LdapAttribute类 将反序列化转换为JNDI注入,适用于JDK高版本环境。 Tomcat环境下的替代方案 在Tomcat 10中,可以使用 MemoryUserDatabaseFactory 工程类实现: XXE攻击 文件写入 MemoryUserDatabaseFactory分析 关键方法 : getObjectInstance 检查ResourceRef是否为 org.apache.catalina.UserDatabase 实例化 MemoryUserDatabase 对象 从Reference中提取 pathname 和 readonly 参数 调用setter方法赋值 执行流程 : 赋值完成后调用 open() 方法 如果 readonly=false ,则调用 save() 方法 open() 方法会连接 pathName 地址并解析返回的XML 攻击构造 LDAP服务端配置 test.xml :恶意XML文件 test.dtd :外部实体定义 利用注意事项 Jackson存在不稳定性,可能需要多次尝试 文件协议( file:// )具有列目录功能,但外带数据限制较大(通常仅限于目录下单个文件) 扩展利用 参考相关研究,该技术还可用于实现RCE(远程代码执行)。 防御建议 升级JDK到最新版本 限制反序列化操作 配置JNDI查找限制 禁用不必要的XML外部实体解析 参考资源 JNDI注入相关研究 Tomcat MemoryUserDatabase利用 RCE利用技术