水水的记录某微两处SQL注入
字数 1108 2025-08-20 18:18:05
某微系统两处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,因除零错误导致数据库执行错误无数据返回
- 如果条件为真(返回1),执行
漏洞验证
通过观察返回结果可以判断条件是否成立,从而实现盲注。
第二处SQL注入漏洞
漏洞位置
- 参数:
userIdentifiers - 文件:
/mobile/plugin/SyncUserInfo.jsp
漏洞分析
- 参数
userIdentifiers直接拼接到SQL语句中 - 通过大量换行符(
%0d%0a)可能用于绕过WAF或其他防护机制 - 支持联合查询注入
漏洞复现步骤
- 构造联合查询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
- 通过联合查询可以获取数据库信息,如当前用户
修复建议
- 对所有用户输入进行严格的参数化查询处理
- 使用预编译语句(PreparedStatement)替代直接拼接SQL
- 实施最小权限原则,限制数据库账户权限
- 对输入参数进行白名单验证
- 部署WAF等防护措施
总结
这两处SQL注入漏洞都是由于未对用户输入进行充分过滤和参数化处理导致的。第一处漏洞可以通过布尔盲注方式获取信息,第二处漏洞则可以直接进行联合查询注入。开发人员应重视安全编码实践,避免此类漏洞的出现。
附录
第一处漏洞关键代码
rs.executeSql("select id,workflowname from workflow_base where isvalid='1' and workflowtype="+value);
第二处漏洞关键代码
ps.syncUserInfo(userIdentifiers); // 直接拼接进入SQL语句