Anima JNDI注入漏洞分析
今年三月份挖的,已获得CNVD编号,近期准备跳槽决定拿出来水一下。
项目介绍
Anima是一个提供数据库操作功能的组件,例如SQL和Stream。简单的DSL语法,支持多种数据库,与Java8集成良好,支持多种关系映射。
简单的DSL
H2、MySQL、SQLite、PostgreSQL、Oracle、SqlServer
主页支持
配置灵活
连接池支持
支持LocalDate、LocalDateTime
支持lambda表达式
关系 ( hasOne、hasMany、belongsTo)
SQL 性能统计
基于Java8
项目地址
https://github.com/hellokaton/anima
漏洞概述
Anima存在JNDI注入漏洞,该漏洞源于Anima提供一个实例Sql2o负责为数据库或数据源指定 jdbc-url、用户名和密码。并且允许根据用户给定的数据源创建到远程数据库的 jdbc 连接。当用户实例化Sql2o时,未对传入参数进行合法性校验,用户可直接传入ldap恶意链接执行命令。
影响版本
Anima <= v0.3.1
基本用法
Examples
漏洞分析
Anima提供一个实例Sql2o(src\main\java\org\sql2o\Sql2o.java)负责为数据库或数据源指定 jdbc-url、用户名和密码。Sql2o实例允许根据用户给定的数据源创建到远程数据库的 jdbc 连接。当用户实例化Sql2o时,未对传入数据源参数进行校验,因此存在JNDI注入漏洞。
该项目无web界面,因此需要再官方提供的Test类进行漏洞复现:
src\test\java\org\sql2o\QueryTest.java#testCreateQueryWithKeyNames
该漏洞需要使用 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)
终端开启监听:
传入dataSource,debug调试代码:
传入Sql2o
跟进JndiDataSource.getJndiDatasource(jndiLookup),getJndiDatasource方法获取用户传入的 jndiLookup进行查找,但并未对内容进行校验
看一下 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注入,可被利用导致命令执行
修复方式
目前厂商暂未发布修复方案。