Fineract-SQL注入漏洞(CVE-2023-25197)原理分析
2023-04-10 14:23:00

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
./gradlew createDB -PdbName=fineract_default
./gradlew bootRun

出现 :fineract-provider:bootRun则运行正常

0x05、漏洞复现


0x06、原理分析

分析前提:

该漏洞需要身份认证通过的前提(漏洞比较鸡肋的原因),对请求体中添加Authorization认证字段才能访问后续的接口

正式分析:

预警通报显示漏洞版本存在sql注入,查看修复版本对漏洞点的修复
核心修复在PaginationParameters.java文件,对构造方法中的orderBysortOrder字段添加了输入校验

新增了输入校验,遍历存在特殊字符则抛出错误


核心就在哪些接口对orderBysortOrder字段进行了sql语句调用

PaginationParameters本类中通过getterorderBysortOrder字段进行获取,通过orderBySqlpaginationSql方法对sql语句进行符加orderBysortOrder字段


接着看PaginationParameters类的实例化,通过instance方法对类进行实例化,意思调用该类的orderBysortOrder字段,则会通过调用该类的instance方法进行实例化

查看该类的调用情况,其中有5个类进行了调用

查看每个类中的调用情况,这些类的调用流程大体上差不多,通过访问的路径进行获取参数字段,然后实例化PaginationParameters

有些类会对paged参数进行判断,然后进入不同的方法,但核心都会调用到自身xxx类的xxxReadPlatformService接口中调用retrievexxx方法

查看retrievexxx方法对PaginationParameters类的处理,找到对应类实现xxxReadPlatformService接口的类,以AuditsApiResource类为例


找到对应调用接口的retrievePaginatedAuditEntries方法

其中paginationParametersDataValidator.validateParameterValues方法会对orderBysortOrder字段进行白名单校验,如果orderBysortOrder字段不是白名单列表中支持的参数,则会抛出错误

此类存在白名单校验的方法均无法实现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/