Javaite jndi注入漏洞分析
今年三月份挖的,已获得CNVD编号,近期准备跳槽决定拿出来水一下。
项目介绍
JavaLite 是一个完整的框架集合,用于快速应用程序开发的 Java 生态系统。
项目地址
https://github.com/javalite/javalite
https://javalite.io/
漏洞概述
javalite存在JNDI注入漏洞,该漏洞源于javalite的DB类提供了一些方便的方法用于打开/关闭数据库连接、运行各种类型的查询和执行 SQL 语句。DB类中存在open(String jndiName)函数,其功能是根据已注册的名称从 JNDI 打开连接,由于用户传入的 jndiName 未经校验直接被 ctx.lookup 执行,用户可直接传入ldap恶意链接执行命令。
影响版本
Javalite <= javalite-3.4-j11
漏洞分析
源码地址:https://github.com/javalite/javalite
Javalite框架中org.javalite.activejdbc.DB类,功能如下:
org.javalite.activejdbc.DB存在open(String jndiName)函数,其功能是根据已注册的名称从 JNDI 打开连接。
函数源代码如下,该函数jndiName可控且并未对用户传入内容进行过滤,用户可以自定义方法调用open函数并传入任意数据。在调用open函数时,程序将调用ctx.lookup(jndiName)打开连接。
用户传入的 jndiName 未经校验直接被 ctx.lookup 执行。如果用户控制jndi的值并将恶意数据传递到 oepn() 方法,那么这会导致JNDI注入。
漏洞分析复现
该项目作为一个Java框架,本身无web界面,因此需要在官方提供的Test类进行漏洞复现:
activejdbc\src\test\java\org\javalite\activejdbc\BaseTest2.java#shouldReuseExistingConnection
该漏洞需要使用 JNDI工具辅助复现,可使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具(注意:需要Java版本小于 JDK 8u191)。
GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)
终端开启监听:
Debug调试代码流程如下:
第72行传入了恶意JndiName的值,第73行调用了activejdbc\src\main\java\org\javalite\activejdbc\DB.java#oepn
跟进db.open,用户传入的 jndiName 直接被 ctx.lookup 执行
看一下 lookup 的调用方法,传进 InitialContext#getURLOrDefaultInitCtx
lookup 拿到 name ,getURLScheme匹配 :和 /;之后获取链接内容,getURLContext 解释包含样例:
For example, if the scheme id is “ldap”, and the Context. URL_PKG_PREFIXES property contains “com.widget:com.wiz. jndi”, the naming manager would attempt to load the following classes until one is successfully instantiated:
· com.widget.ldap.ldapURLContextFactory
· com.wiz.jndi.ldap.ldapURLContextFactory
· com.sun.jndi.url.ldap.ldapURLContextFactory
而我们可以控制 lookup 函数的参数,使客户端访问提前设置好的恶意的 ldap服务链接来加载恶意的对象class 字节码文件来实例化,从而执行代码,完成利用。
该类并不存在任何黑/白名单对用户传入进行过滤,用户可直接传入ldap恶意链接执行命令。确定该处存在 jndi注入,可被利用导致命令执行
单步调试,回到activejdbc\src\main\java\org\javalite\activejdbc\DB.java#oepn,在第145行触发命令执行。
修复方式
厂商尚未提供漏洞修补方案,请关注厂商主页及时更新: https://javalite.io/