jshERP3.0 代码审计
字数 1963 2025-08-24 20:49:22

jshERP3.0 代码审计报告与安全加固指南

1. Fastjson反序列化漏洞

漏洞描述

src/main/java/com/jsh/erp/utils/StringUtil.javagetInfo方法中,使用了Fastjson 1.2.55版本进行反序列化操作,且search参数由前端输入可控,导致存在Fastjson反序列化漏洞。

漏洞位置

  • 文件路径: src/main/java/com/jsh/erp/utils/StringUtil.java
  • 方法: getInfo
  • 参数: search(前端可控)

漏洞验证

通过构造恶意JSON数据发送到使用getInfo方法的接口,可触发反序列化漏洞。

修复建议

  1. 升级Fastjson版本:升级到最新稳定版本(1.2.83+)
  2. 使用安全配置
    // 使用安全模式
    ParserConfig.getGlobalInstance().setSafeMode(true);
    
    // 或使用白名单
    ParserConfig.getGlobalInstance().addAccept("com.jsh.erp.");
    
  3. 避免直接反序列化不可信数据:对用户输入进行严格校验

2. SQL注入漏洞

漏洞描述

在MyBatis框架使用中存在SQL注入风险,特别是在PersonMapperEx.xml中,name参数未经过滤直接拼接SQL语句。

漏洞位置

  • 文件路径: src/main/resources/mapper_xml/PersonMapperEx.xml
  • 调用链:
    • PersonMapperEx.xmlPersonComponent.java
  • 参数: name(角色管理处可控)

漏洞验证

在角色管理界面,输入name参数为test' OR '1'='1等SQL注入payload,可验证漏洞存在。

修复建议

  1. 使用预编译语句
    <!-- 错误方式 -->
    SELECT * FROM person WHERE name = '${name}'
    
    <!-- 正确方式 -->
    SELECT * FROM person WHERE name = #{name}
    
  2. 特殊场景处理(如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. 输入过滤:对特殊字符进行转义处理

3. XSS漏洞

漏洞描述

系统多处用户输入未做过滤直接存储和展示,如在备注处插入<script>alert('hack')</script>可触发XSS。

漏洞位置

  • 参数: inforows(前端可控)
  • 处理流程:
    • 通过body.getInfo()body.getRows()获取
    • 直接存入数据库
    • 前端展示时未做转义

漏洞验证

在任意可输入文本的字段(如备注)插入XSS payload,观察是否执行。

修复建议

  1. 输入过滤
    import org.springframework.web.util.HtmlUtils;
    
    String safeInput = HtmlUtils.htmlEscape(userInput);
    
  2. 输出编码:在展示用户数据时进行HTML编码
  3. 内容安全策略(CSP)
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    
  4. 设置HttpOnly标志:防止Cookie被JavaScript读取

4. 登录绕过漏洞

漏洞描述

过滤器配置不当导致可通过特定URL绕过登录认证。

绕过方式

  1. 访问URL包含doc.htmlregister.htmllogin.html
  2. URL中包含../a.ico/../等路径遍历(V2.0版本还支持.css.png
  3. URL以/user/login/user/registerUser/v2/api-docs开头

漏洞验证

构造如下请求验证绕过:

http://example.com/../a.ico/../v2/api-docs

修复建议

  1. 使用安全框架:集成Spring Security或Shiro
  2. 严格路径校验
    // 禁用路径遍历
    request.setAttribute(WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE, request.getContextPath());
    
  3. 重写过滤器逻辑
    • 明确认证需求
    • 使用严格匹配而非包含判断
    • 禁用特殊字符绕过
  4. 权限控制:实现基于角色的访问控制(RBAC)

5. Spring Boot信息泄露

风险描述

虽然不直接构成漏洞,但暴露的接口信息可能帮助攻击者发现其他漏洞。

暴露内容

  • /v2/api-docs:API文档
  • 其他开发端点

加固建议

  1. 生产环境配置
    # 关闭开发端点
    management.endpoints.web.exposure.include=health,info
    # 禁用Swagger文档
    springfox.documentation.enabled=false
    
  2. 访问控制:限制管理端口的访问IP
  3. 自定义错误页面:避免泄露堆栈信息

综合加固方案

  1. 依赖管理

    • 升级所有已知漏洞组件
    • 使用dependency-check-maven定期扫描
  2. 安全编码规范

    • 所有用户输入视为不可信
    • 实施参数化查询
    • 实施输出编码
  3. 安全测试

    <!-- 在pom.xml中添加安全测试工具 -->
    <dependency>
        <groupId>org.owasp</groupId>
        <artifactId>dependency-check-maven</artifactId>
        <version>6.5.3</version>
    </dependency>
    
  4. 监控与日志

    • 记录所有安全相关事件
    • 监控异常请求模式
  5. 持续教育

    • 对开发团队进行安全编码培训
    • 建立代码审查流程,重点关注安全漏洞

附录:漏洞速查表

漏洞类型 风险等级 修复优先级 影响模块 修复方法
Fastjson反序列化 高危 立即 工具类 升级+安全配置
SQL注入 高危 立即 角色管理 预编译+过滤
XSS 中危 全系统 输入过滤+输出编码
登录绕过 高危 立即 认证模块 安全框架+严格校验
信息泄露 低危 配置 关闭开发端点
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+) 使用安全配置 : 避免直接反序列化不可信数据 :对用户输入进行严格校验 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,可验证漏洞存在。 修复建议 使用预编译语句 : 特殊场景处理 (如ORDER BY): 建立允许排序字段白名单 使用枚举限制可排序字段 输入过滤 :对特殊字符进行转义处理 3. XSS漏洞 漏洞描述 系统多处用户输入未做过滤直接存储和展示,如在备注处插入 <script>alert('hack')</script> 可触发XSS。 漏洞位置 参数: info 和 rows (前端可控) 处理流程: 通过 body.getInfo() 和 body.getRows() 获取 直接存入数据库 前端展示时未做转义 漏洞验证 在任意可输入文本的字段(如备注)插入XSS payload,观察是否执行。 修复建议 输入过滤 : 输出编码 :在展示用户数据时进行HTML编码 内容安全策略(CSP) : 设置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 开头 漏洞验证 构造如下请求验证绕过: 修复建议 使用安全框架 :集成Spring Security或Shiro 严格路径校验 : 重写过滤器逻辑 : 明确认证需求 使用严格匹配而非包含判断 禁用特殊字符绕过 权限控制 :实现基于角色的访问控制(RBAC) 5. Spring Boot信息泄露 风险描述 虽然不直接构成漏洞,但暴露的接口信息可能帮助攻击者发现其他漏洞。 暴露内容 /v2/api-docs :API文档 其他开发端点 加固建议 生产环境配置 : 访问控制 :限制管理端口的访问IP 自定义错误页面 :避免泄露堆栈信息 综合加固方案 依赖管理 : 升级所有已知漏洞组件 使用dependency-check-maven定期扫描 安全编码规范 : 所有用户输入视为不可信 实施参数化查询 实施输出编码 安全测试 : 监控与日志 : 记录所有安全相关事件 监控异常请求模式 持续教育 : 对开发团队进行安全编码培训 建立代码审查流程,重点关注安全漏洞 附录:漏洞速查表 | 漏洞类型 | 风险等级 | 修复优先级 | 影响模块 | 修复方法 | |---------|---------|-----------|---------|---------| | Fastjson反序列化 | 高危 | 立即 | 工具类 | 升级+安全配置 | | SQL注入 | 高危 | 立即 | 角色管理 | 预编译+过滤 | | XSS | 中危 | 高 | 全系统 | 输入过滤+输出编码 | | 登录绕过 | 高危 | 立即 | 认证模块 | 安全框架+严格校验 | | 信息泄露 | 低危 | 中 | 配置 | 关闭开发端点 |