某协同系统漏洞挖掘过程记录
字数 1077 2025-08-06 08:34:49

某协同系统SQL注入漏洞挖掘与分析教学文档

0x01 漏洞概述

本文档详细记录了对某协同系统的SQL注入漏洞挖掘过程,包括注入点发现、鉴权绕过和最终利用的全流程分析。

0x02 技术背景

DAO层分析

  • DAO(Data Access Object)设计模式用于分离数据访问逻辑与业务逻辑
  • 该系统未使用MyBatis等持久化框架,直接使用原生DAO实现
  • 主要关注SysDao接口及其实现类(BasicDaoImpl, ModeDaoImpl, SysTableDao)

关键方法分析

  • getStringData(String sql):直接执行传入的SQL语句
  • getFieldSetBySql(String sql, ...):通过SQL语句获取数据

0x03 漏洞挖掘过程

1. 寻找注入点

  1. 分析SysTableDao类中的getStringData方法实现:

    String getStringData(String sql, Object[] params, boolean debug) {
        // 直接使用PreparedStatement执行SQL
        // 当params为null时直接执行原始SQL
    }
    
  2. 发现6个JSP调用了getStringData(String)方法,其中share_select.jsp存在可控点:

    <%
    String type = request.getParameter("type");
    String fid = request.getParameter("fid");
    if("2".equals(type)) {
        String sql = "SELECT * FROM table WHERE fid=" + fid;
        String result = sysDao.getStringData(sql);
    }
    %>
    

2. 绕过鉴权机制

  1. Filter分析

    • 系统使用Filter拦截.jsp请求
    • doFilter方法关键逻辑:
      if ((!uri.endsWith(".jsp") || !isNotValidatePage(uri)) 
          && !uri.endsWith(".xml") 
          && !uri.endsWith(".xf") 
          || verificationURL(request, uri, response))
      
  2. 绕过方法

    • 利用request.getRequestURI()特性,构造;绕过:
      /xxxx/share_select.jsp;jpg
      
    • 图片后缀请求会被直接放行
  3. SQL过滤绕过

    • 系统使用sqlValidate方法检测黑名单:
      String[] badStrs = {"exec%20", "execute%20", "drop%20", 
                          "truncate%20", "net%20user%20", 
                          "xp_cmdshell%20", "select%20", 
                          "insert%20", "update%20"};
      
    • 可通过Unicode编码或大小写变异绕过

3. 寻找替代注入点

  1. 分析getFieldSetBySql方法:

    // BasicDaoImpl类中
    getFieldSetBySql(String sql, Object[] params, String tableName) {
        // 直接执行SQL语句
    }
    
  2. FormService中发现调用点:

    public String getFormTableInfo(String relId) {
        String sql = "SELECT * FROM table WHERE relId=" + relId;
        return dao.getFieldSetBySql(sql, null, null);
    }
    
  3. 对应JSP文件validate.jsp中的利用:

    <%
    String json = request.getParameter("json");
    // 解析json
    if("0".equals(type)) {
        formService.getFormTableInfo(relId);
    }
    %>
    

0x04 漏洞利用链

完整利用流程:

  1. 构造请求绕过Filter鉴权
  2. 访问存在SQL注入的JSP端点
  3. 通过参数控制拼接SQL语句
  4. 绕过基础SQL过滤机制

示例Payload:

POST /validate.jsp;jpg HTTP/1.1

{"type":"0","relId":"1 AND 1=CONVERT(int,@@version)"}

0x05 修复建议

  1. DAO层修复

    • 禁止直接拼接SQL语句
    • 强制使用参数化查询
    • 即使params为null也应使用占位符
  2. Filter增强

    • 规范化URL解析,处理;绕过
    • 增加更全面的SQL关键词检测
    • 实现统一的权限校验机制
  3. 服务层修复

    • Service层应进行输入验证
    • 实现白名单机制限制可用字段

0x06 总结

本案例展示了从代码审计到实际利用的完整SQL注入漏洞挖掘过程,重点包括:

  • DAO层不安全编码实践分析
  • JSP鉴权机制的绕过技巧
  • 多层代码审计方法
  • 过滤机制的绕过思路

通过此案例可学习到企业级系统安全审计的基本方法和思路。

某协同系统SQL注入漏洞挖掘与分析教学文档 0x01 漏洞概述 本文档详细记录了对某协同系统的SQL注入漏洞挖掘过程,包括注入点发现、鉴权绕过和最终利用的全流程分析。 0x02 技术背景 DAO层分析 DAO(Data Access Object)设计模式用于分离数据访问逻辑与业务逻辑 该系统未使用MyBatis等持久化框架,直接使用原生DAO实现 主要关注 SysDao 接口及其实现类( BasicDaoImpl , ModeDaoImpl , SysTableDao ) 关键方法分析 getStringData(String sql) :直接执行传入的SQL语句 getFieldSetBySql(String sql, ...) :通过SQL语句获取数据 0x03 漏洞挖掘过程 1. 寻找注入点 分析 SysTableDao 类中的 getStringData 方法实现: 发现6个JSP调用了 getStringData(String) 方法,其中 share_select.jsp 存在可控点: 2. 绕过鉴权机制 Filter分析 : 系统使用Filter拦截.jsp请求 doFilter 方法关键逻辑: 绕过方法 : 利用 request.getRequestURI() 特性,构造 ; 绕过: 图片后缀请求会被直接放行 SQL过滤绕过 : 系统使用 sqlValidate 方法检测黑名单: 可通过Unicode编码或大小写变异绕过 3. 寻找替代注入点 分析 getFieldSetBySql 方法: 在 FormService 中发现调用点: 对应JSP文件 validate.jsp 中的利用: 0x04 漏洞利用链 完整利用流程: 构造请求绕过Filter鉴权 访问存在SQL注入的JSP端点 通过参数控制拼接SQL语句 绕过基础SQL过滤机制 示例Payload: 0x05 修复建议 DAO层修复 : 禁止直接拼接SQL语句 强制使用参数化查询 即使params为null也应使用占位符 Filter增强 : 规范化URL解析,处理 ; 绕过 增加更全面的SQL关键词检测 实现统一的权限校验机制 服务层修复 : Service层应进行输入验证 实现白名单机制限制可用字段 0x06 总结 本案例展示了从代码审计到实际利用的完整SQL注入漏洞挖掘过程,重点包括: DAO层不安全编码实践分析 JSP鉴权机制的绕过技巧 多层代码审计方法 过滤机制的绕过思路 通过此案例可学习到企业级系统安全审计的基本方法和思路。