jshERP3.0 代码审计
字数 1963 2025-08-24 20:49:22
jshERP3.0 代码审计报告与安全加固指南
1. Fastjson反序列化漏洞
漏洞描述
在src/main/java/com/jsh/erp/utils/StringUtil.java的getInfo方法中,使用了Fastjson 1.2.55版本进行反序列化操作,且search参数由前端输入可控,导致存在Fastjson反序列化漏洞。
漏洞位置
- 文件路径:
src/main/java/com/jsh/erp/utils/StringUtil.java - 方法:
getInfo - 参数:
search(前端可控)
漏洞验证
通过构造恶意JSON数据发送到使用getInfo方法的接口,可触发反序列化漏洞。
修复建议
- 升级Fastjson版本:升级到最新稳定版本(1.2.83+)
- 使用安全配置:
// 使用安全模式 ParserConfig.getGlobalInstance().setSafeMode(true); // 或使用白名单 ParserConfig.getGlobalInstance().addAccept("com.jsh.erp."); - 避免直接反序列化不可信数据:对用户输入进行严格校验
2. SQL注入漏洞
漏洞描述
在MyBatis框架使用中存在SQL注入风险,特别是在PersonMapperEx.xml中,name参数未经过滤直接拼接SQL语句。
漏洞位置
- 文件路径:
src/main/resources/mapper_xml/PersonMapperEx.xml - 调用链:
PersonMapperEx.xml→PersonComponent.java
- 参数:
name(角色管理处可控)
漏洞验证
在角色管理界面,输入name参数为test' OR '1'='1等SQL注入payload,可验证漏洞存在。
修复建议
- 使用预编译语句:
<!-- 错误方式 --> SELECT * FROM person WHERE name = '${name}' <!-- 正确方式 --> SELECT * FROM person WHERE name = #{name} - 特殊场景处理(如ORDER BY):
- 建立允许排序字段白名单
- 使用枚举限制可排序字段
public enum SafeOrderColumn { NAME("name"), AGE("age"); private String columnName; SafeOrderColumn(String columnName) { this.columnName = columnName; } public static boolean isValid(String columnName) { // 检查是否在白名单中 } } - 输入过滤:对特殊字符进行转义处理
3. XSS漏洞
漏洞描述
系统多处用户输入未做过滤直接存储和展示,如在备注处插入<script>alert('hack')</script>可触发XSS。
漏洞位置
- 参数:
info和rows(前端可控) - 处理流程:
- 通过
body.getInfo()和body.getRows()获取 - 直接存入数据库
- 前端展示时未做转义
- 通过
漏洞验证
在任意可输入文本的字段(如备注)插入XSS payload,观察是否执行。
修复建议
- 输入过滤:
import org.springframework.web.util.HtmlUtils; String safeInput = HtmlUtils.htmlEscape(userInput); - 输出编码:在展示用户数据时进行HTML编码
- 内容安全策略(CSP):
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"> - 设置HttpOnly标志:防止Cookie被JavaScript读取
4. 登录绕过漏洞
漏洞描述
过滤器配置不当导致可通过特定URL绕过登录认证。
绕过方式
- 访问URL包含
doc.html、register.html或login.html - URL中包含
../a.ico/../等路径遍历(V2.0版本还支持.css和.png) - URL以
/user/login、/user/registerUser、/v2/api-docs开头
漏洞验证
构造如下请求验证绕过:
http://example.com/../a.ico/../v2/api-docs
修复建议
- 使用安全框架:集成Spring Security或Shiro
- 严格路径校验:
// 禁用路径遍历 request.setAttribute(WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE, request.getContextPath()); - 重写过滤器逻辑:
- 明确认证需求
- 使用严格匹配而非包含判断
- 禁用特殊字符绕过
- 权限控制:实现基于角色的访问控制(RBAC)
5. Spring Boot信息泄露
风险描述
虽然不直接构成漏洞,但暴露的接口信息可能帮助攻击者发现其他漏洞。
暴露内容
/v2/api-docs:API文档- 其他开发端点
加固建议
- 生产环境配置:
# 关闭开发端点 management.endpoints.web.exposure.include=health,info # 禁用Swagger文档 springfox.documentation.enabled=false - 访问控制:限制管理端口的访问IP
- 自定义错误页面:避免泄露堆栈信息
综合加固方案
-
依赖管理:
- 升级所有已知漏洞组件
- 使用dependency-check-maven定期扫描
-
安全编码规范:
- 所有用户输入视为不可信
- 实施参数化查询
- 实施输出编码
-
安全测试:
<!-- 在pom.xml中添加安全测试工具 --> <dependency> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>6.5.3</version> </dependency> -
监控与日志:
- 记录所有安全相关事件
- 监控异常请求模式
-
持续教育:
- 对开发团队进行安全编码培训
- 建立代码审查流程,重点关注安全漏洞
附录:漏洞速查表
| 漏洞类型 | 风险等级 | 修复优先级 | 影响模块 | 修复方法 |
|---|---|---|---|---|
| Fastjson反序列化 | 高危 | 立即 | 工具类 | 升级+安全配置 |
| SQL注入 | 高危 | 立即 | 角色管理 | 预编译+过滤 |
| XSS | 中危 | 高 | 全系统 | 输入过滤+输出编码 |
| 登录绕过 | 高危 | 立即 | 认证模块 | 安全框架+严格校验 |
| 信息泄露 | 低危 | 中 | 配置 | 关闭开发端点 |