首页 网络安全 正文

FineAdmin.Mvc SQL注入CVE-2026-67689

摘要

栋科技漏洞库关注到 FineAdmin.Mvc 相关版本中存在一个排序子句 SQL 注入漏洞,已被追踪为CVE-2026-67689,CVSS 3.X评分 9.8。

FineAdmin.Mvc 是开源 ASP.NET MVC5 通用权限后台管理系统,基于 ok-admin v2.0 前端模板重构而来,系统采用GPL-3.0开源协议。

一、基本情况

FineAdmin.Mvc 轻量化、上手简单,内置完整权限底座、数据字典、登录日志、系统配置。拿来即可开发 OA、CRM、企业管理后台。

FineAdmin.Mvc SQL注入CVE-2026-67689

FineAdmin.Mvc 自带分页查询、条件筛选、表格导出通用封装,精细化按钮级别权限管控,主打快速搭建带 RBAC 权限体系管理后台。

栋科技漏洞库关注到 FineAdmin.Mvc 相关版本中存在一个排序子句 SQL 注入漏洞,已被追踪为CVE-2026-67689,CVSS 3.X评分 9.8。

二、漏洞分析

CVE-2026-67689漏洞是 FineAdmin.Mvc 的分页列表接口中,field、order 参数中存在的 SQL 注入漏洞。

FineAdmin.Mvc 的分页列表接口将未经校验的排序参数拼接到 SQL ORDER BY 子句中,

远程攻击者在具备登录会话并提交恶意 field 或 order 参数时可注入数据库表达式,

造成数据库信息泄露并可能进一步影响数据机密性、完整性和可用性。

具体来说,FineAdmin.Mvc V1.0 及更早版本的 BaseService.GetListByFilter() 和 GetPageUnite() ,

直接使用 pageInfo.field 与 pageInfo.order 构造 ORDER BY,相关分页列表端点在 MySQL 后端被利用执行错误型或延时型 SQL 注入。

BaseService.GetListByFilter()、GetPageUnite() 方法直接通过 string.Format() ,

将 pageInfo.field、pageInfo.order 拼接至 SQL 的 ORDER BY 语句内,未做白名单校验与过滤净化处理。

MySQL 的 ORDER BY 子句支持表达式、子查询、函数调用,

攻击者可利用 EXTRACTVALUE()、UPDATEXML() 实现报错注入,或是借助 SLEEP() 实现时间盲注。

1、漏洞位置

文件路径:FineAdmin.Service\BaseService.cs 第 68–74 行(GetListByFilter / GetPageUnite 两处函数)

漏洞接口:GET /Permissions/User/List

2、攻击方式

远程攻击,需要拥有已登录授权会话(接口带有 [HandlerLogin] 登录校验特性)。

三、POC概念验证

1、报错注入 —— 获取数据库名称:

管理员已设置登录后刷新可查看

2、预期返回结果:

{"state":"error","message":"XPATH syntax error: '~fineadmin~'"}
## Root Cause

`BaseService.cs:68-74`:

```csharp
if (!string.IsNullOrEmpty(pageInfo.field))
{
    _orderBy = string.Format(" ORDER BY {0} {1}", pageInfo.field, pageInfo.order);
}

PageInfo 模型(FineAdmin.Model\PageInfo.cs)由 MVC 模型绑定器直接通过 HTTP 请求参数自动赋值。

在拼接 SQL 语句前,程序未对 field、order 字段做任何校验。

3、漏洞影响

攻击面较广,共计 5 个以上接口受此漏洞影响;

MySQL 环境下的 ORDER BY 注入相比普通字符型注入拥有更多利用手段。

4、修复方案

采用严格白名单校验机制:

private static readonly HashSet<string> AllowedSortFields = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    "Id", "Account", "RealName", "CreateTime", "UpdateTime"
};
private static readonly HashSet<string> AllowedSortOrders = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    "ASC", "DESC"
};

if (!string.IsNullOrEmpty(pageInfo.field) && AllowedSortFields.Contains(pageInfo.field)
    && AllowedSortOrders.Contains(pageInfo.order))
{
    _orderBy = $" ORDER BY `{pageInfo.field}` {pageInfo.order}";
}
else
{
    _orderBy = " ORDER BY CreateTime DESC";
}

四、影响范围

FineAdmin.Mvc ≤ 1.0

五、修复建议

FineAdmin.Mvc>1.0

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接