某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 漏洞触发点
-
关键调用链:
GroupTemplate#getTemplate → ComputationRuleUtil#getValue → PerformanceIndicatorServiceImpl#checkRule → /checkRule接口 -
漏洞原理:
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 组合漏洞利用链
-
利用步骤:
- 首先利用Spring路径遍历漏洞绕过权限检查
- 访问后台
/checkRule接口 - 构造恶意Beetl模板注入payload
-
绕过限制:
- Beetl高版本有黑名单过滤常见命令执行payload
- 可使用反射加载JS构造攻击载荷
4. 漏洞复现
4.1 复现环境搭建
- 获取系统源码(即使过期版本也可用于分析)
- 本地搭建测试环境
4.2 复现步骤
-
构造请求绕过权限:
POST /druid/../checkRule -
发送恶意模板注入payload:
POST /druid/../checkRule HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded rule=恶意Beetl模板代码 -
使用反射加载JS绕过黑名单:
- 构造特殊payload利用反射机制
- 加载JS代码实现命令执行
5. 修复建议
-
Beetl模板引擎修复:
- 升级到最新版本
- 对用户输入进行严格过滤
- 避免直接使用未经验证的输入作为模板
-
Spring框架修复:
- 升级Spring框架到最新安全版本
- 禁用路径遍历特性
-
Shiro配置修复:
- 严格区分前后台接口权限
- 对敏感接口添加二次验证
-
代码层修复:
// 修改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的攻击链,强调了:
- 组件版本安全的重要性
- 输入验证的必要性
- 权限设计的严谨性
- 安全防御的纵深性
通过全面审计系统各组件和自定义代码,可以发现潜在的安全风险,及时修复避免被攻击者利用。