CVE-2025-24813: Seafile Server 未授权 SQL 注入漏洞分析

0x00 漏洞背景与详情

  • 漏洞名称:Seafile Server 未授权 SQL 注入漏洞
  • CVE 编号:CVE-2025-24813
  • 影响组件:Seafile Server (Seahub 组件)
  • 风险等级:高危 (High)
  • 影响版本
    • Seafile Server < 11.0.12
    • Seafile Server 12.0.x < 12.0.4
  • 身份验证:不需要 (Unauthenticated)

Seafile 是一款开源的企业级文件同步与共享解决方案。该漏洞存在于其 Web 前端组件 Seahub 中。由于系统在处理共享链接相关的 API 请求时,未能对用户传入的参数进行严格的清洗和参数化处理,导致攻击者可以在未授权的情况下执行恶意的 SQL 语句。

0x01 漏洞原理分析

漏洞的触发点位于 Seafile 的 RESTful API 接口 /api/v2.1/share-links/ 中。该接口的主要功能是校验共享链接(Share Link)的有效性及获取链接关联的文件路径信息。

由于该接口通常用于匿名用户访问公开共享文件的场景,因此默认允许未授权访问。

漏洞成因: 在处理 GET 请求中的 path 参数时,Seahub 后端(基于 Django 框架)未能正确使用 ORM 的安全查询方法,而是错误地采用了原生的字符串拼接逻辑来构建 SQL 查询。 当攻击者在 path 参数中注入恶意 SQL 载荷(如单引号 'UNION SELECT 等)时,这些载荷会逃逸出原有的查询逻辑,被数据库引擎作为 SQL 指令直接执行,从而造成了典型的 SQL 注入漏洞。

0x02 漏洞 POC 与高级利用姿势

基础 POC 与数据提取

以下是验证和利用该漏洞的基础 HTTP 请求示例:

1. 基础报错/布尔检测

GET /api/v2.1/share-links/?path=%27%20OR%201=1-- HTTP/1.1
Host: <your-seafile-server>

2. 数据提取 (Union-Based 注入): 通过 UNION SELECT 可以将目标数据附带在正常的查询结果中返回(以提取数据库版本为例):

GET /api/v2.1/share-links/?path=%27%20UNION%20SELECT%201,2,3,VERSION(),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20-- HTTP/1.1
Host: <your-seafile-server>

(注:实际利用时,UNION 查询的字段数需与 Seafile 对应版本数据库表结构严格匹配)

高级利用姿势与实战场景

在实战中,仅仅证明漏洞存在是不够的,红队通常会利用以下高级姿势实现权限提升或深入控制:

1. Session 劫持与后台接管

Seafile 使用 Django 框架管理会话。攻击者可以通过 SQL 注入直接读取 django_session 表,提取其中处于活跃状态的高权限(管理员)的 session_key

  • 随后,攻击者只需在浏览器中伪造该 Cookie(如 sessionid=<session_key>),即可绕过登录页面,直接接管管理员账户。

2. WAF 绕过技巧

由于该接口是标准的文件路径查询接口,部分 WAF 可能会拦截明显的 SQL 关键字。

  • 编码绕过:利用 URL 双重编码(如 %2527 替代 %27)或 Unicode 编码绕过前端的简单正则检测。
  • 函数替换:使用数据库自带的字符转换函数(如 MySQL 的 CHAR()HEX())动态构造敏感字符串,规避 WAF 对敏感表名(如 django_session)的拦截。

3. 深入 RCE (理论与特定配置场景)

  • Session 反序列化:如果目标系统由于某些历史原因或错误配置,使用了不安全的 Session 序列化引擎(如 Python 的 pickle),攻击者可以通过 SQL 注入使用 UPDATE 语句篡改 django_session 表中的 session_data 字段,写入恶意的序列化对象。当服务器反序列化加载该 Session 时,将直接触发远程代码执行(RCE)。
  • UDF/写入 WebShell:如果 Seafile 数据库连接用户配置不当拥有 FILE 权限,且数据库配置了宽松的 secure_file_priv,攻击者可通过 INTO OUTFILE 尝试向 Web 目录写入后门脚本。

0x03 应急排查与日志痕迹分析建议

1. Web 访问日志排查

检查反向代理层(如 Nginx 或 Apache)的 access.log

  • 过滤请求路径为 /api/v2.1/share-links/ 的记录。
  • 重点关注 path 参数中是否包含 SQL 注入的特征字符串,例如:%27 (单引号), UNION, SELECT, --, SLEEP, BENCHMARK 等。
  • 异常 Payload 示例
    GET /api/v2.1/share-links/?path=%27+AND+%28SELECT+1+FROM+%28SELECT+COUNT%28%2A%29...

2. 应用层与数据库日志分析

  • Seafile 应用日志 (seahub.log): 在 Seahub 的运行日志中搜索 Internal Server ErrorSQL syntax error 等报错信息。关注日志中打印的原始 SQL 查询语句,查看是否存在未闭合的引号或明显的恶意拼接。
  • 数据库审计: 如果数据库开启了通用查询日志或慢查询日志,可以重点排查针对 share_linkdjango_session 表的异常、高频提取查询。

0x04 修复与缓解建议

  1. 官方补丁(首选): Seafile 官方已在后续版本中修复了该漏洞。请尽快升级到以下安全版本:
    • 11.0.12 或更高版本。
    • 12.0.4 或更高版本。
  2. 代码级加固: 在二次开发或维护 Django 应用时,必须确保所有数据库交互均通过 ORM 提供的安全 API 进行,严禁直接使用字符串格式化拼装 SQL 语句。
  3. 临时防御措施: 在无法立即升级的情况下,可在 Nginx/WAF 层配置临时规则,对 /api/v2.1/share-links/ 接口的 path 参数进行严格校验,拦截包含 SQL 保留字或特殊符号(如单引号)的异常请求。

0x05 参考资料