学习基础的利用方式
前言
[Java的JNDI学习 | Atlant1c`s blog](http://www.atlant1c.cn/2024/02/15/Java的JNDI学习/)
JNDI(Java Naming and Directory Interface)是一个应用程序设计的 API,一种标准的 Java 命名系统接口。JNDI 提供统一的客户端 API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务之间进行交互。
JNDI注入
直接把图拿来
JNDI 注入,即当开发者在定义 JNDI
接口初始化时,lookup()
方法的参数可控,攻击者就可以将恶意的 url
传入参数远程加载恶意载荷,造成注入攻击。
1 | package JNDI; |
JNDI 注入对 JAVA 版本有相应的限制,具体可利用版本如下:
协议 | JDK6 | JDK7 | JDK8 | JDK11 |
---|---|---|---|---|
LADP | 6u211以下 | 7u201以下 | 8u191以下 | 11.0.1以下 |
RMI | 6u132以下 | 7u122以下 | 8u113以下 | 无 |
复现
JNDI+RMI
1 | //RMIClient |
python起一个http服务
1 | python -m http.server 8081 |
JNDI+LDAP
导入依赖
1 | <dependency> |
实例代码
1 | //LDAPServer |
一样的编译Calculator,起服务
总结
Client
端可以通过lookup
来通过特定协议来检索命名对象。
起一个恶意的Server
并且定义一个http
恶意地址,构造恶意的 Reference
类绑定在 RMIServer
的 Registry
里面。原理就这样。
参考: