Apache Submarine SQL注入漏洞分析
项目介绍
Apache Submarine(简称 Submarine)是一个端到端的机器学习平台,允许数据科学家创建端到端的机器学习工作流。在Submarine上,数据科学家可以完成 ML 模型生命周期的每个阶段,包括数据探索、数据管道创建、模型训练、服务和监控。
项目地址
https://github.com/apache/submarine
https://submarine.apache.org/zh-cn/
漏洞概述
Apache Submarine的submarine-server模块SysUserRestApi
的queryPageList和list接口存在SQL注入漏洞,攻击者可借助username或email参数注入SQL语句。
影响版本
Apache Submarine <= rel/release-0.7.0
环境搭建
源码下载地址:
https://github.com/apache/submarine/tags
官方部署文档:
https://submarine.apache.org/zh-cn/docs/gettingStarted/quickstart
1、准备环境
Centos7 | 8G内存 |
---|---|
Docker | 无版本要求 |
Kubernetes | 1.15.x - 1.21.x |
kubectl | 1.15.x - 1.21.x |
helm | v3 |
minikube | Latest |
2、启动 minikube 集群
minikube start --vm-driver=docker --cpus 8 --memory 4096 --kubernetes-version v1.21.2
3、克隆项目,通过 helm chart 安装 submarine operator 和依赖
①:Clone the project
git clone https://github.com/apache/submarine.git
②:Install the submarine operator and dependencies by helm chart
cd submarine
helm install submarine ./helm-charts/submarine
③:Create a Submarine custom resource and the operator will create the submarine server, database, etc. for us.
kubectl apply -f submarine-cloud-v2/artifacts/examples/example-submarine.yaml
4、使用kubectl查询pod的状态,确保每个pod都成功Running
kubectl get pods
5、暴露submarine的Web服务,并通过浏览器访问Web页面。
kubectl port-forward --address 192.168.108.153 service/submarine-traefik 32080:80
浏览器访问Web页面:http://192.168.108.153:32080
漏洞分析
api/sys/user/list接口
1、下载Apache Submarine 0.7.0 源代码,使用IDEA打开。
使用maven进行依赖编译。
2、进入submarine-server模块,直接定位到存在SQL注入的代码。
缺陷文件路径:
submarine-rel-release-0.7.0\submarine-server\server-core\src\main\resources\org\apache\submarine\database\mappers\SysUserMapper.xml
代码审计过程中,发现selectAll中使用了${}的格式接收userName和email参数的值,这种写法明显存在安全隐患。
向上跟踪,定位到SysUserMapper。
继续向上跟踪,定位到Servicec层,发现SysUserService.java的queryPageList方法调用了selectAll。
继续向上跟踪,最终定位到Controller层SysUserRestApi.java,发现userName和email的值可控,可借助这两个参数注入恶意SQL语句。
api/sys/dict/list接口
缺陷文件路径:
submarine-rel-release-0.7.0\submarine-server\server-core\src\main\resources\org\apache\submarine\database\mappers\SysDictMapper.xml!](https://img-blog.csdnimg.cn/0f8fe08565d645b38b756bab8339e8fc.png)
代码审计过程中,发现selectAll中使用了${}的格式接收dictCode和dictName参数的值,这种写法明显存在安全隐患。
向上跟踪,定位到SysDictMapper。
继续向上跟踪,定位到Controller层SysDictRestApi.java。
发现dictCode和dictName 的值可控,可借助这两个参数注入恶意SQL语句。
漏洞复现
api/sys/user/list接口
1、访问http://192.168.108.153:32080/user/login登录系统。
Admin用户的初始密码官方文档中没有给出,可通过点击登录页面的
Forgot password——>Already have an account? Sign-In 强行进入系统。
2、打开Burpsuite的抓包代理,进入系统的Manage—>user模块。
刷新该页面,Burpsuite获取到如下数据包:
通过阅读源码知道username和email这两个参数存在SQL注入漏洞,因此使用Burpsuite中的sqlmap插件进行漏洞复现。
最终执行结果如下,证明email和username参数存在SQL注入漏洞。
api/sys/user/list 接口无需身份认证即可访问,因此本漏洞利用上也无需任何身份认证。危害等级较高。
api/sys/dict/list接口
1、本接口同样存在未授权访问漏洞,URL如下:
http://192.168.108.153:32080/api/sys/dict/list?dictCode=demoData&dictName=demoData&column=&field=&order=pageNo=1&pageSize=10
2、数据包如下:
GET /api/sys/dict/list?dictCode=demoData&dictName=demoData&column=&field=&order=pageNo=1&pageSize=10 HTTP/1.1
Host: 192.168.108.153:32080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 4
通过漏洞分析,知道dictCode和dictName这两个参数存在SQL注入漏洞,因此使用Burpsuite中的sqlmap插件进行漏洞复现。
/api/sys/dict/list 接口无需身份认证即可访问,因此本漏洞利用上也无需任何身份认证。危害等级较高。