某HR系统组合漏洞挖掘过程
字数 1210 2025-08-23 18:31:24

HR系统组合漏洞挖掘与分析教学文档

1. 漏洞背景

本文档详细分析某HR系统中存在的组合漏洞,包括:

  • Beetl模板引擎远程代码执行漏洞
  • Spring框架低版本登录绕过漏洞
  • Shiro鉴权配置不当问题

2. 漏洞环境

  • 系统类型:人才管理系统
  • 技术栈:
    • Beetl模板引擎(国内开发的类似Freemarker的模板引擎)
    • Spring框架(低版本存在漏洞)
    • Shiro权限框架

3. 漏洞分析过程

3.1 Beetl模板引擎RCE漏洞分析

3.1.1 漏洞触发点

  1. 关键调用链

    GroupTemplate#getTemplate → ComputationRuleUtil#getValue → PerformanceIndicatorServiceImpl#checkRule → /checkRule接口
    
  2. 漏洞原理

    • ComputationRuleUtil#getValue方法中调用了GroupTemplate#getTemplate
    • 该方法拼接了s2参数,该参数来源于String src输入参数
    • 经过rule方法处理后,如果输入不包含@sum@avg则直接返回原始输入

3.1.2 代码分析

// ComputationRuleUtil#getValue方法关键代码
public static Object getValue(String src, Map<String, Object> map) {
    // ...
    GroupTemplate gt = new GroupTemplate();
    Template t = gt.getTemplate(s2); // s2是可控的输入
    // ...
}

// rule方法处理逻辑
private static String rule(String src) {
    if (!src.contains("@sum") && !src.contains("@avg")) {
        return src; // 直接返回未过滤的输入
    }
    // ...其他处理
}

3.1.3 利用条件

  • 需要找到调用ComputationRuleUtil#getValue的方法
  • 最终定位到PerformanceIndicatorServiceImpl#checkRule方法
  • 该方法参数从外部接收且未做过滤

3.2 后台接口访问绕过

3.2.1 Shiro鉴权问题

  • /checkRule接口被配置为后台接口
  • 前台用户正常情况下无法访问

3.2.2 Spring低版本登录绕过

  • 系统使用低版本Spring框架
  • 存在路径遍历漏洞:/druid/../xxxx形式可绕过权限检查
  • 利用此方式可访问到后台路由/checkRule

3.3 组合漏洞利用链

  1. 利用步骤

    • 首先利用Spring路径遍历漏洞绕过权限检查
    • 访问后台/checkRule接口
    • 构造恶意Beetl模板注入payload
  2. 绕过限制

    • Beetl高版本有黑名单过滤常见命令执行payload
    • 可使用反射加载JS构造攻击载荷

4. 漏洞复现

4.1 复现环境搭建

  1. 获取系统源码(即使过期版本也可用于分析)
  2. 本地搭建测试环境

4.2 复现步骤

  1. 构造请求绕过权限:

    POST /druid/../checkRule
    
  2. 发送恶意模板注入payload:

    POST /druid/../checkRule HTTP/1.1
    Host: target.com
    Content-Type: application/x-www-form-urlencoded
    
    rule=恶意Beetl模板代码
    
  3. 使用反射加载JS绕过黑名单:

    • 构造特殊payload利用反射机制
    • 加载JS代码实现命令执行

5. 修复建议

  1. Beetl模板引擎修复

    • 升级到最新版本
    • 对用户输入进行严格过滤
    • 避免直接使用未经验证的输入作为模板
  2. Spring框架修复

    • 升级Spring框架到最新安全版本
    • 禁用路径遍历特性
  3. Shiro配置修复

    • 严格区分前后台接口权限
    • 对敏感接口添加二次验证
  4. 代码层修复

    // 修改ComputationRuleUtil#getValue方法
    public static Object getValue(String src, Map<String, Object> map) {
        // 添加输入验证
        if (src == null || containsMaliciousCode(src)) {
            throw new SecurityException("Invalid input");
        }
        // ...原有逻辑
    }
    
    private static boolean containsMaliciousCode(String input) {
        // 实现恶意代码检测逻辑
    }
    

6. 总结

本案例展示了如何通过组合多个漏洞实现从权限绕到RCE的攻击链,强调了:

  1. 组件版本安全的重要性
  2. 输入验证的必要性
  3. 权限设计的严谨性
  4. 安全防御的纵深性

通过全面审计系统各组件和自定义代码,可以发现潜在的安全风险,及时修复避免被攻击者利用。

HR系统组合漏洞挖掘与分析教学文档 1. 漏洞背景 本文档详细分析某HR系统中存在的组合漏洞,包括: Beetl模板引擎远程代码执行漏洞 Spring框架低版本登录绕过漏洞 Shiro鉴权配置不当问题 2. 漏洞环境 系统类型:人才管理系统 技术栈: Beetl模板引擎(国内开发的类似Freemarker的模板引擎) Spring框架(低版本存在漏洞) Shiro权限框架 3. 漏洞分析过程 3.1 Beetl模板引擎RCE漏洞分析 3.1.1 漏洞触发点 关键调用链 : 漏洞原理 : ComputationRuleUtil#getValue 方法中调用了 GroupTemplate#getTemplate 该方法拼接了 s2 参数,该参数来源于 String src 输入参数 经过 rule 方法处理后,如果输入不包含 @sum 和 @avg 则直接返回原始输入 3.1.2 代码分析 3.1.3 利用条件 需要找到调用 ComputationRuleUtil#getValue 的方法 最终定位到 PerformanceIndicatorServiceImpl#checkRule 方法 该方法参数从外部接收且未做过滤 3.2 后台接口访问绕过 3.2.1 Shiro鉴权问题 /checkRule 接口被配置为后台接口 前台用户正常情况下无法访问 3.2.2 Spring低版本登录绕过 系统使用低版本Spring框架 存在路径遍历漏洞: /druid/../xxxx 形式可绕过权限检查 利用此方式可访问到后台路由 /checkRule 3.3 组合漏洞利用链 利用步骤 : 首先利用Spring路径遍历漏洞绕过权限检查 访问后台 /checkRule 接口 构造恶意Beetl模板注入payload 绕过限制 : Beetl高版本有黑名单过滤常见命令执行payload 可使用反射加载JS构造攻击载荷 4. 漏洞复现 4.1 复现环境搭建 获取系统源码(即使过期版本也可用于分析) 本地搭建测试环境 4.2 复现步骤 构造请求绕过权限: 发送恶意模板注入payload: 使用反射加载JS绕过黑名单: 构造特殊payload利用反射机制 加载JS代码实现命令执行 5. 修复建议 Beetl模板引擎修复 : 升级到最新版本 对用户输入进行严格过滤 避免直接使用未经验证的输入作为模板 Spring框架修复 : 升级Spring框架到最新安全版本 禁用路径遍历特性 Shiro配置修复 : 严格区分前后台接口权限 对敏感接口添加二次验证 代码层修复 : 6. 总结 本案例展示了如何通过组合多个漏洞实现从权限绕到RCE的攻击链,强调了: 组件版本安全的重要性 输入验证的必要性 权限设计的严谨性 安全防御的纵深性 通过全面审计系统各组件和自定义代码,可以发现潜在的安全风险,及时修复避免被攻击者利用。