| 标题 | Dromara MaxKey 3.5.13 SQL Injection |
|---|
| 描述 | MaxKey 的"账户策略 / 角色策略 / 组策略"模块将用户可控的 filters 与 orgIdsList 字段以 MyBatis 原始插值 ${} 拼接到 SQL。虽然 StrUtils.checkSqlInjection() 对参数做了关键词黑名单过滤,但黑名单极不完整,可轻易绕过。
受影响 Mapper 片段(mysql / postgresql 版本均存在)
AccountsMapper.xml:
<select id="queryUserNotInStrategy" ...>
SELECT ... FROM users u
<where>
and (${filters})
and u.departmentid in( ${orgIdsList})
</where>
</select>
GroupMemberMapper.xml / RoleMemberMapper.xml 存在相同模式,共计 16+ 处 ${filters} / ${orgIdsList} 原始拼接。
上层调用
AccountsServiceImpl.refreshByStrategy():
public void refreshByStrategy(AccountsStrategy strategy) {
if(StringUtils.isNotBlank(strategy.getOrgIdsList())) {
strategy.setOrgIdsList("'" + strategy.getOrgIdsList().replace(",", "','") + "'");
}
List<UserInfo> userList = queryUserNotInStrategy(strategy);
...
}
对 orgIdsList 仅做简单逗号替换,对 filters 完全未做过滤。
黑名单过滤器可绕过
StrUtils.java:491-518 的 checkSqlInjection():
private static final String SQL_REGEX = ".*([';]+|(--)+|(\\band\\b)|(\\bor\\b)).*";
该正则:
阻止 and / or / ; / -- / '
未阻止 UNION、SELECT、SLEEP、BENCHMARK、UPDATEXML、EXTRACTVALUE
未阻止 /* */ 注释截断
攻击者可用 UNION 注入 / 基于时间盲注。 |
|---|
| 来源 | ⚠️ https://github.com/xpp3901/CVE_APPLY/tree/main/V-M001_MaxKey_Filters_SQL_Injection |
|---|
| 用户 | xpp39 (UID 97299) |
|---|
| 提交 | 2026-04-14 09時55分 (2 月前) |
|---|
| 管理 | 2026-05-02 22時13分 (19 days later) |
|---|
| 状态 | 已接受 |
|---|
| VulDB条目 | 360868 [Dromara MaxKey 直到 3.5.13 StrUtils.java StrUtils.checkSqlInjection filtersfields SQL注入] |
|---|
| 积分 | 20 |
|---|