某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}
关键点分析
-
JSP访问绕过:
- 系统使用
ControllerFilter5过滤器限制对JSP文件的直接访问 - 利用Tomcat特性使用分号(
;)绕过:/common/common_sort_tree.jsp;.js - 原理:Tomcat处理URL时会将
;xxx/中的分号与斜杠之间的字符串及分号本身去掉
- 系统使用
-
漏洞触发点:
common_sort_tree.jsp文件中的rootName参数- 参数值直接传入
builder.buildExp方法
-
Ognl表达式执行流程:
rootName参数 → builder.buildExp → compiler生成子表达式列表 → parseMap映射 → objectValueParseImpl → analy方法 → Ognl.getValue → RCE -
关键代码逻辑:
bean.xml中定义了parseMap,指定了标签对应的类方法{%%}对应使用objectValueParseImplbean- 初始化时遍历
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库到最新安全版本
- 禁用危险的功能和方法
-
安全审计:
- 定期进行代码安全审计
- 特别关注表达式解析相关的代码
通过这种系统化的漏洞分析方法,不仅可以发现已知漏洞的变种,还能挖掘出系统中其他潜在的安全问题。