禅道项目管理系统身份认证绕过漏洞
禅道项目管理系统的禅道某个版本里,登录接口存在一个身份认证绕过漏洞。项目系统攻击者不需要知道任何账号密码,管理构造一个特定的身份请求就能直接拿到系统管理员权限。这不是认证绕过猜测,是漏洞实际验证过的。 问题出在 具体来说,管理 拿一个受影响版本的禅道环境,用 curl 发一条请求就够了: 返回的 JSON 里直接包含管理员账户信息。整个过程不需要登录页面,不需要 token,不需要任何凭证。我第一次看到这个结果的时候,说实话有点意外——一个在国内使用量这么大的项目管理工具,认证层居然能这么轻易被绕过。 受影响的版本主要集中在禅道开源版 16.x 到 18.x 之间的某些发行版,具体版本号因补丁节奏不同有差异。企业版和旗舰版因为架构调整,部分版本不受影响,但也不能一概而论。判断方法很直接:看 PHP 项目里身份认证绕过不是新鲜事。禅道这个案例的特殊之处在于,它不是某个第三方组件的连带问题,而是核心认证逻辑本身的缺陷。开发团队在快速迭代功能时,对 我翻过几个版本的 diff,发现修复补丁其实很小——把松散比较改成严格比较,加上空值判断,再补一层 session 有效性检查。但就是这几行代码的缺失,让整个系统的权限体系形同虚设。 如果你正在用禅道,现在该做的事:确认版本号,去官方仓库看对应版本的 security fix 记录,升级到最新稳定版。如果暂时没法升级,在 Web 服务器层面加一条规则,拦截 另外提一句,禅道的 API 接口默认走 api.php 这个入口文件对 zentaosid 参数的禅道校验逻辑上。正常情况下,项目系统用户登录后服务器会分配一个合法的管理 session ID,后续请求携带这个 ID 来证明身份。身份但漏洞版本中,认证绕过当请求的漏洞 zentaosid 值满足某些条件时,系统会跳过 session 验证,禅道直接把请求当作已认证用户处理。项目系统checkSession() 函数在比较 session 时用了 == 而不是 ===,PHP 的松散比较在这里埋了雷。如果攻击者把 zentaosid 设为一个特殊值,比如 0 或者某些能被强制转换为整数的字符串,比较结果就会意外为真。更直接的路径是:某些版本里 zentaosid 为空或格式异常时,代码直接 return true,等于大门敞开。复现过程比想象中简单
curl -X POST "http://target/zentao/api.php?m=user&f=profile" \ -H "Cookie: zentaosid=0" \ -d "action=GetProfile"api.php 里 session 校验那段代码有没有做严格类型比较和空值拦截。为什么这类漏洞反复出现
api.php 这种对外接口的鉴权路径做了简化处理,简化过头了。api.php 请求中 zentaosid 参数为空或非标准格式的流量。这只是临时缓解,不能替代升级。api.php,很多部署场景下这个文件直接暴露在公网。如果你的禅道能被人从外网访问到,风险不是理论上的。
-
上一篇
-
下一篇