0x00、前言
Fineract-SQL注入漏洞(CVE-2023-25197)原理分析,还有个编号CVE-2023-25196是一起的sql注入的漏洞,但编号CVE-2023-25196在官方提出的补丁即1.8.3版本中仅修复了个获取时间的方式,未找到sql注入的修复的情况,重要修复在1.8.4版本中修复的。
0x01、Fineract描述
Apache Fineract 是一个开源的系统,用于核心银行系统平台化建设。为创业者、金融机构和服务提供商提供了一个可靠、健壮的、可负担得起的金融服务解决方案。
0x02、漏洞描述
该项目受影响版本存在SQL注入漏洞,由于SQLInjectionValidator.java中对于单引号等特殊元素处理不当,具备登录权限的攻击者可在处理分页时通过控制sortOrder、orderBy参数进行SQL注入。
0x03、漏洞范围
1.4 <= Apache Fineract版本 <= 1.8.3
0x04、环境搭建
下载漏洞版本环境:(本文下载版本1.8.3)
https://github.com/apache/fineract/
运行前提需要安装mysql/MariaDB数据库,默认运行端口3306,如果使用本地运行则需要确认数据库的连接用户密码是root/mysql,否则会构建报错
本地运行:
./gradlew createDB -PdbName=fineract_tenants |
出现 :fineract-provider:bootRun
则运行正常
0x05、漏洞复现
0x06、原理分析
分析前提:
该漏洞需要身份认证通过的前提(漏洞比较鸡肋的原因),对请求体中添加Authorization
认证字段才能访问后续的接口
正式分析:
预警通报显示漏洞版本存在sql注入,查看修复版本对漏洞点的修复
核心修复在PaginationParameters.java文件,对构造方法中的orderBy
、sortOrder
字段添加了输入校验
新增了输入校验,遍历存在特殊字符则抛出错误
核心就在哪些接口对orderBy
、sortOrder
字段进行了sql语句调用
PaginationParameters
本类中通过getter
对orderBy
、sortOrder
字段进行获取,通过orderBySql
和paginationSql
方法对sql语句进行符加orderBy
、sortOrder
字段
接着看PaginationParameters
类的实例化,通过instance
方法对类进行实例化,意思调用该类的orderBy
、sortOrder
字段,则会通过调用该类的instance
方法进行实例化
查看该类的调用情况,其中有5个类进行了调用
查看每个类中的调用情况,这些类的调用流程大体上差不多,通过访问的路径进行获取参数字段,然后实例化PaginationParameters
类
有些类会对paged
参数进行判断,然后进入不同的方法,但核心都会调用到自身xxx类的xxxReadPlatformService接口中调用retrievexxx方法
查看retrievexxx方法对PaginationParameters
类的处理,找到对应类实现xxxReadPlatformService接口的类,以AuditsApiResource
类为例
找到对应调用接口的retrievePaginatedAuditEntries
方法
其中paginationParametersDataValidator.validateParameterValues
方法会对orderBy
、sortOrder
字段进行白名单校验,如果orderBy
、sortOrder
字段不是白名单列表中支持的参数,则会抛出错误
此类存在白名单校验的方法均无法实现sql注入,因此需要找到调用方法中不存在白名单校验的类
找到其中调用PaginationParameters
实例化的类RecurringDepositAccountsApiResource
(搜索按字母排序这个也是排在最后,前面的类每个都看了都进行了白名单检测,一度怀疑漏洞点触发位置的排查思路是否不正确,直到看完最后一个类的最后一个调用方法才看到没有进行检测,不得不说这些挖漏洞的作者确实心细)
其中当paged
参数为false
或者不存在时,调用this.depositAccountReadPlatformService.retrieveAll
方法
该方法直接调用paginationSql
方法追加了orderBy/sortOrder
字段,未进行白名单校验,直接执行了sql语句
因此该类当paged
参数不存在或者为false
时,即存在sql注入漏洞
分析没有直接给出poc,网上还没有公开poc,但原理调用比较简单,看完自己调试也大体能找到漏洞位置,就暂不直接贴出来了,主要是学习分析思路。
0x07、漏洞修复
官方以推出修复版本1.8.4
核心修复在PaginationParameters.java文件,对构造方法中的orderBy、sortOrder字段添加了输入校验
新增了输入校验,遍历存在特殊字符则抛出错误
该修复方式直接从根源上初始调用实例化该类时就对orderBy、sortOrder字段进行了校验过滤
0x08、参考链接
https://www.oscs1024.com/hd/MPS-2023-3839
https://github.com/apache/fineract/