禅道11.6注入分析
字数 858 2025-08-22 12:23:36
禅道11.6 SQL注入漏洞分析与利用
漏洞概述
禅道11.6版本存在一个SQL注入漏洞,攻击者可以通过构造特定的URL请求直接执行任意SQL语句,获取数据库敏感信息如用户账号密码等。该漏洞位于API模块的getModel方法中,通过call_user_func_array()函数调用导致。
漏洞利用条件
- 需要有效的用户权限(已登录状态)
- 目标系统为禅道11.6版本
漏洞利用POC
http://127.0.0.1/zentao116/api-getModel-api-sql-sql=select+account,password+from+zt_user
技术分析
URL解析机制
禅道的请求类型分为三种:PATH_INFO、PATH_INFO2和GET。漏洞利用使用的是PATH_INFO模式,以"-"方式传参。
- 请求首先由index.php处理,创建应用实例
- 调用
$app->parseRequest()解析请求 - 在
parsePathInfo()函数中,URL以"."分隔,前面部分作为URI,后面部分作为viewType setRouteByPathInfo()函数使用"-"分隔URI并整理为数组:$items[0]为模块名$item[1]为方法名
参数传递过程
- 对于PATH_INFO请求,调用
getParams()函数获取参数 - 使用
mergeParams函数合并参数 - 最终通过
call_user_func_array()调用目标方法:
这相当于call_user_func_array(array($module, $methodName), $this->params);$module::$methodName($this->params)
漏洞根源
漏洞位于/module/api/control.php中的getModel方法:
$result = call_user_func_array(array(&$module, $methodName), $params);
该方法允许直接调用API模块中的sql方法,而sql方法存在SQL注入漏洞:
public function sql($sql)
{
$sql = trim($sql);
echo $sql;
if(strpos($sql, 'select ') === false) return $this->dao->query($sql)->fetchAll();
return $this->dao->query($sql)->fetchAll();
}
该方法直接执行传入的SQL语句,仅做了简单的"select "字符串检查,但检查逻辑存在缺陷,无法有效防止SQL注入。
漏洞修复建议
- 对传入的SQL语句进行严格过滤和参数化处理
- 限制API模块的访问权限
- 更新到最新版本的禅道系统
参考链接
- [渗透笔记]禅道(payload)
- 禅道11.6后台SQL注入漏洞复现分析(URL格式分析)