从getter到jndi之LdapAttribute反序列化链
字数 1288 2025-08-29 22:41:01
LdapAttribute反序列化链分析与利用
前言
在JDK高版本环境下,当TransformerImpl因模块化机制无法使用时,LdapAttribute类提供了一个新的攻击面。该类通过getter方法触发JNDI注入,为反序列化攻击提供了新的利用途径。
LdapAttribute漏洞分析
关键调用链
- 入口点:
LdapAttribute#getAttributeDefinition() - 触发点:
getSchema方法 - 调用路径:
PartialCompositeDirContext.getSchemac_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方法赋值
- 检查ResourceRef是否为
-
执行流程:
- 赋值完成后调用
open()方法 - 如果
readonly=false,则调用save()方法 open()方法会连接pathName地址并解析返回的XML
- 赋值完成后调用
攻击构造
LDAP服务端配置
- test.xml:恶意XML文件
- test.dtd:外部实体定义
利用注意事项
- Jackson存在不稳定性,可能需要多次尝试
- 文件协议(
file://)具有列目录功能,但外带数据限制较大(通常仅限于目录下单个文件)
扩展利用
参考相关研究,该技术还可用于实现RCE(远程代码执行)。
防御建议
- 升级JDK到最新版本
- 限制反序列化操作
- 配置JNDI查找限制
- 禁用不必要的XML外部实体解析