某oa命令执行漏洞挖掘思路
字数 1498 2025-08-18 11:36:47

某OA系统命令执行漏洞分析与挖掘思路

0x01 历史漏洞分析

漏洞概述

该OA系统存在一个Ognl表达式注入导致的远程代码执行(RCE)漏洞,通过精心构造的HTTP请求可以在未授权状态下执行任意代码。

漏洞利用条件

  • 目标系统存在未修复的Ognl表达式注入点
  • 攻击者能够发送特制的HTTP请求到目标系统

漏洞利用细节

请求示例

POST /common/common_sort_tree.jsp;.js HTTP/1.1
Host: xx.xx.xx.xx
Accept-Encoding: gzip, deflate
Content-Length: 174
Accept-Language: zh-CN,zh;q=0.8
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
infoAccept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded

rootName={%25Thread.@fe.util.FileUtil@saveFileContext(new%20java.io.File("../web/fe.war/123.jsp"),new%20sun.misc.BASE64Decoder().decodeBuffer("d2hvYW1p"))%25}

关键点分析

  1. JSP访问绕过

    • 系统使用ControllerFilter5过滤器限制对JSP文件的直接访问
    • 利用Tomcat特性使用分号(;)绕过:/common/common_sort_tree.jsp;.js
    • 原理:Tomcat处理URL时会将;xxx/中的分号与斜杠之间的字符串及分号本身去掉
  2. 漏洞触发点

    • common_sort_tree.jsp文件中的rootName参数
    • 参数值直接传入builder.buildExp方法
  3. Ognl表达式执行流程

    rootName参数 → builder.buildExp → compiler生成子表达式列表 → parseMap映射 → objectValueParseImpl → analy方法 → Ognl.getValue → RCE
    
  4. 关键代码逻辑

    • bean.xml中定义了parseMap,指定了标签对应的类方法
    • {%%}对应使用objectValueParseImpl bean
    • 初始化时遍历parseMap,取前两个字符和后两个字符作为起始符和结束符
    • 使用this.analyse.addParse生成mapValue
    • 最终通过Ognl.getValue执行Ognl表达式

0x02 新漏洞挖掘思路

漏洞根源分析

漏洞根本原因是builder.buildExp方法对参数过滤不严格,导致Ognl表达式注入。

扩展攻击面

  1. 方法搜索

    • 发现builder类中除了buildExp外,还有功能相同的build方法
    • 其他方法也间接调用了build方法
  2. 搜索调用点

    • 使用正则表达式[\.| ]+builder\.build搜索调用点
    • 发现多处潜在可利用点
  3. 参数可控性分析

    • 部分调用点的参数通过request.getParameter直接获取
    • 虽然有些参数会经过loginInvokeCtrl.formatLogic格式化,但依然可利用
      • 格式化会在logic前后加标识符
      • compiler会逐层剥离语句,先执行最内层标签
  4. 调用链追踪

    • 追踪executeLogic调用点
    • 发现多处通过request.getParameter直接获取参数
    • 需要满足条件:用户登录或指定的methodNamespringId
    • 这些值也是通过request.getParameter获取,可控
  5. 最终触发点

    • 找到doPost方法及其URL映射路径
    • 确认所有请求参数可控且能传递到漏洞方法

漏洞挖掘方法论

  1. 历史漏洞分析:深入理解已公开漏洞的触发机制
  2. 代码相似性搜索:寻找使用相同危险方法的其他代码路径
  3. 参数传递追踪:从用户输入点到危险方法的完整调用链分析
  4. 访问控制检查:确认漏洞点是否在未授权状态下可访问
  5. 绕过技术研究:分析可能的过滤和防护机制及其绕过方法

0x03 防御建议

  1. 输入过滤

    • 对所有用户输入进行严格过滤
    • 禁止特殊字符和Ognl表达式关键字
  2. 访问控制

    • 加强JSP文件的访问控制
    • 避免使用Tomcat特性绕过
  3. 安全编码

    • 避免直接执行用户提供的表达式
    • 使用白名单机制限制可执行的操作
  4. 依赖管理

    • 更新Ognl库到最新安全版本
    • 禁用危险的功能和方法
  5. 安全审计

    • 定期进行代码安全审计
    • 特别关注表达式解析相关的代码

通过这种系统化的漏洞分析方法,不仅可以发现已知漏洞的变种,还能挖掘出系统中其他潜在的安全问题。

某OA系统命令执行漏洞分析与挖掘思路 0x01 历史漏洞分析 漏洞概述 该OA系统存在一个Ognl表达式注入导致的远程代码执行(RCE)漏洞,通过精心构造的HTTP请求可以在未授权状态下执行任意代码。 漏洞利用条件 目标系统存在未修复的Ognl表达式注入点 攻击者能够发送特制的HTTP请求到目标系统 漏洞利用细节 请求示例 关键点分析 JSP访问绕过 : 系统使用 ControllerFilter5 过滤器限制对JSP文件的直接访问 利用Tomcat特性使用分号( ; )绕过: /common/common_sort_tree.jsp;.js 原理:Tomcat处理URL时会将 ;xxx/ 中的分号与斜杠之间的字符串及分号本身去掉 漏洞触发点 : common_sort_tree.jsp 文件中的 rootName 参数 参数值直接传入 builder.buildExp 方法 Ognl表达式执行流程 : 关键代码逻辑 : bean.xml 中定义了 parseMap ,指定了标签对应的类方法 {%%} 对应使用 objectValueParseImpl bean 初始化时遍历 parseMap ,取前两个字符和后两个字符作为起始符和结束符 使用 this.analyse.addParse 生成 mapValue 最终通过 Ognl.getValue 执行Ognl表达式 0x02 新漏洞挖掘思路 漏洞根源分析 漏洞根本原因是 builder.buildExp 方法对参数过滤不严格,导致Ognl表达式注入。 扩展攻击面 方法搜索 : 发现 builder 类中除了 buildExp 外,还有功能相同的 build 方法 其他方法也间接调用了 build 方法 搜索调用点 : 使用正则表达式 [\.| ]+builder\.build 搜索调用点 发现多处潜在可利用点 参数可控性分析 : 部分调用点的参数通过 request.getParameter 直接获取 虽然有些参数会经过 loginInvokeCtrl.formatLogic 格式化,但依然可利用 格式化会在 logic 前后加标识符 compiler 会逐层剥离语句,先执行最内层标签 调用链追踪 : 追踪 executeLogic 调用点 发现多处通过 request.getParameter 直接获取参数 需要满足条件:用户登录或指定的 methodName 和 springId 这些值也是通过 request.getParameter 获取,可控 最终触发点 : 找到 doPost 方法及其URL映射路径 确认所有请求参数可控且能传递到漏洞方法 漏洞挖掘方法论 历史漏洞分析 :深入理解已公开漏洞的触发机制 代码相似性搜索 :寻找使用相同危险方法的其他代码路径 参数传递追踪 :从用户输入点到危险方法的完整调用链分析 访问控制检查 :确认漏洞点是否在未授权状态下可访问 绕过技术研究 :分析可能的过滤和防护机制及其绕过方法 0x03 防御建议 输入过滤 : 对所有用户输入进行严格过滤 禁止特殊字符和Ognl表达式关键字 访问控制 : 加强JSP文件的访问控制 避免使用Tomcat特性绕过 安全编码 : 避免直接执行用户提供的表达式 使用白名单机制限制可执行的操作 依赖管理 : 更新Ognl库到最新安全版本 禁用危险的功能和方法 安全审计 : 定期进行代码安全审计 特别关注表达式解析相关的代码 通过这种系统化的漏洞分析方法,不仅可以发现已知漏洞的变种,还能挖掘出系统中其他潜在的安全问题。