水水的记录某微两处SQL注入
字数 1108 2025-08-20 18:18:05

某微系统两处SQL注入漏洞分析与复现

漏洞概述

本文档详细分析了某微系统中发现的两处SQL注入漏洞,包括漏洞原理、环境搭建方法、漏洞复现步骤以及修复建议。这两处漏洞均已在新版本中修复。

环境搭建与绕过方法

由于系统需要导入license证书才能正常使用,但证书生成需要私钥,作者采用了修改源代码的方式绕过验证:

  1. 修改 classbean/api/login/util/LoginUtil.class 中的 beforeCheckUser 函数
  2. 修改 classbean/weaver/login/LicenseCheckLogin.class 中的 getLicUserCheck 函数

修改后需要重新编译替换原文件并重启服务。

第一处SQL注入漏洞

漏洞位置

  • 参数:node
  • 文件:未明确指定,但代码片段显示在处理流程配置的页面

漏洞分析

  1. 服务端接收前端传入的node参数,以"_"为分隔符分为两部分赋值给typevalue
  2. rs.executeSql()处直接将value拼接进SQL语句执行
  3. 查询结果以JSON格式返回

漏洞复现步骤

  1. 构造payload:scope=1&node=wftype_5/if(ascii(substr(user(),1,1))=114,1,0)
  2. 判断数据库用户名第一个字符的ASCII码:
    • 如果条件为真(返回1),执行5/1,返回正常数据
    • 如果条件为假(返回0),执行5/0,因除零错误导致数据库执行错误无数据返回

漏洞验证

通过观察返回结果可以判断条件是否成立,从而实现盲注。

第二处SQL注入漏洞

漏洞位置

  • 参数:userIdentifiers
  • 文件:/mobile/plugin/SyncUserInfo.jsp

漏洞分析

  1. 参数userIdentifiers直接拼接到SQL语句中
  2. 通过大量换行符(%0d%0a)可能用于绕过WAF或其他防护机制
  3. 支持联合查询注入

漏洞复现步骤

  1. 构造联合查询payload:
/mobile/plugin/SyncUserInfo.jsp?userIdentifiers=1,2%29%0a%0d%0a%0d...[大量换行]...%0dunion%20select%201%2C2%2C3%2C4%2Cuser()%2C6%2C7%2C8%20order%20by%208%23
  1. 通过联合查询可以获取数据库信息,如当前用户

修复建议

  1. 对所有用户输入进行严格的参数化查询处理
  2. 使用预编译语句(PreparedStatement)替代直接拼接SQL
  3. 实施最小权限原则,限制数据库账户权限
  4. 对输入参数进行白名单验证
  5. 部署WAF等防护措施

总结

这两处SQL注入漏洞都是由于未对用户输入进行充分过滤和参数化处理导致的。第一处漏洞可以通过布尔盲注方式获取信息,第二处漏洞则可以直接进行联合查询注入。开发人员应重视安全编码实践,避免此类漏洞的出现。

附录

第一处漏洞关键代码

rs.executeSql("select id,workflowname from workflow_base where isvalid='1' and workflowtype="+value);

第二处漏洞关键代码

ps.syncUserInfo(userIdentifiers); // 直接拼接进入SQL语句
某微系统两处SQL注入漏洞分析与复现 漏洞概述 本文档详细分析了某微系统中发现的两处SQL注入漏洞,包括漏洞原理、环境搭建方法、漏洞复现步骤以及修复建议。这两处漏洞均已在新版本中修复。 环境搭建与绕过方法 由于系统需要导入license证书才能正常使用,但证书生成需要私钥,作者采用了修改源代码的方式绕过验证: 修改 classbean/api/login/util/LoginUtil.class 中的 beforeCheckUser 函数 修改 classbean/weaver/login/LicenseCheckLogin.class 中的 getLicUserCheck 函数 修改后需要重新编译替换原文件并重启服务。 第一处SQL注入漏洞 漏洞位置 参数: node 文件:未明确指定,但代码片段显示在处理流程配置的页面 漏洞分析 服务端接收前端传入的 node 参数,以"_ "为分隔符分为两部分赋值给 type 和 value 在 rs.executeSql() 处直接将 value 拼接进SQL语句执行 查询结果以JSON格式返回 漏洞复现步骤 构造payload: scope=1&node=wftype_5/if(ascii(substr(user(),1,1))=114,1,0) 判断数据库用户名第一个字符的ASCII码: 如果条件为真(返回1),执行 5/1 ,返回正常数据 如果条件为假(返回0),执行 5/0 ,因除零错误导致数据库执行错误无数据返回 漏洞验证 通过观察返回结果可以判断条件是否成立,从而实现盲注。 第二处SQL注入漏洞 漏洞位置 参数: userIdentifiers 文件: /mobile/plugin/SyncUserInfo.jsp 漏洞分析 参数 userIdentifiers 直接拼接到SQL语句中 通过大量换行符( %0d%0a )可能用于绕过WAF或其他防护机制 支持联合查询注入 漏洞复现步骤 构造联合查询payload: 通过联合查询可以获取数据库信息,如当前用户 修复建议 对所有用户输入进行严格的参数化查询处理 使用预编译语句(PreparedStatement)替代直接拼接SQL 实施最小权限原则,限制数据库账户权限 对输入参数进行白名单验证 部署WAF等防护措施 总结 这两处SQL注入漏洞都是由于未对用户输入进行充分过滤和参数化处理导致的。第一处漏洞可以通过布尔盲注方式获取信息,第二处漏洞则可以直接进行联合查询注入。开发人员应重视安全编码实践,避免此类漏洞的出现。 附录 第一处漏洞关键代码 第二处漏洞关键代码