问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
禅道项目管理系统身份认证绕过分析(QVD-2024-15263)
漏洞分析
禅道项目管理系统存在身份认证绕过漏洞,远程攻击者利用该漏洞可以绕过身份认证,调用任意API接口并修改管理员用户的密码,并以管理员用户登录该系统,配合其他漏洞进一步利用后,可以实现完全接管服务器
### **漏洞描述** 禅道项目管理系统存在身份认证绕过漏洞,远程攻击者利用该漏洞可以绕过身份认证,调用任意API接口并修改管理员用户的密码,并以管理员用户登录该系统,配合其他漏洞进一步利用后,可以实现完全接管服务器 **影响版本:** 16.x <= 禅道项目管理系统< 18.12(开源版) 6.x <= 禅道项目管理系统< 8.12(企业版) 3.x <= 禅道项目管理系统< 4.12(旗舰版) ### **漏洞复现** 根据网上的poc进行复现 首先请求接口 /api.php?m=testcase&f=savexmindimport&HTTP\_X\_REQUESTED\_WITH=XMLHttpRequest,获取到一个cookie ![图片1.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-215ce4a9e996bd668d46bccfb9a5ba1148819854.png) 然后在请求头中设置cookie请求/api.php/v1/users接口,响应为error: no company-browse priv.说明存在漏洞,如果不存在漏洞返回的是Unauthorized ![图片2.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-79e61fc193ef07dc7ca1528a03e44d8246b1553c.png) ### **分析过程** 官方发布的最新版本中,在entry.class.php中对鉴权方式进行了修改 <https://github.com/easysoft/zentaopms/commit/d13ba70016ca981b08f27e08fb934bf1f23a4135> 当用户发起http请求的时候,程序首先会启动一个app实例,接着检查是否有权限,最后才是执行对应模块下面的方法 ![图片3.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-04cfcefbca0d7940a77f9d8a99501af2e6912a4a.png) 由于这个一个利用cookie进行认证绕过的漏洞,首先跟进一下程序的执行过程,看看在哪里创建了cookie 在api.php中,程序首先创建一个app实例api ```php $app = router::createApp('pms', dirname(dirname(\_\_FILE\_\_)), 'api'); ``` 调用了createApp(),程序会执行到router.class.php#startSession()下,在startSession()下断点,该方法会生成一个sessionID ![图片4.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-82ca00e745d414aeff5f006b05057dc57d01b112.png) 得到一个app实例后,接着会执行api.php下的$common->checkEntry()进行权限的验证,在isOpenMethod()中会进行白名单验证,testcase.savexmindimport在白名单范围内,所以会跳过后续的验证,开始执行testcase控制器下的savexmindimport方法 ![图片5.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-2b9f94f23ef506fb37d33caaf4fac5d08ce81869.png) ![图片6.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-da28d25fa347611b327f46bb4a529cb033eee00e.png) 验证请求合法后会导入testcase模块,执行testcase模块下control.php控制器文件的构造方法,在构造方法中会调用Helper:isAjaxRequest()来判断用户请求是否是AJAX请求,判断是否是AJAX请求主要通过判断HTTP\_X\_REQUESTED\_WITH是否等于XMLHttpRequest来实现,我们可以通过GET请求将HTTP\_X\_REQUESTED\_WITH的值传入进去 如果判断出不是AJAX请求的话,程序就会执行后面的return语句提前结束程序 ![图片7.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-3c5a41ce34ad565b01c7f1d976cf854d7c3a1324.png) ![图片8.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-0dfe1fe02d84d76d2e847bf66151fbf4b7889103.png) 通过上面的分析我们得到了cookie的创建流程,下面来分析一下利用cookie绕过验证的过程 得到cookie之后就添加到请求头中访问/api.php/v1/users,程序的权限验证代码在entry.class.php下,这段代码会判断this->app->user的值是否存在和account是否等于guest 我们在这行代码下断点后,可以看到添加了cookie请求之后this->app->user的值是存在的,而且this->app-user->account不等于guest,所以继续执行下面的代码 ![图片9.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-284ed77a43a08f3d977aa5a0cc85bf83faf3cd3a.png) 现在再看看官方修复版本之后的代码变成了 ```php if(!$this->loadModel('user')->isLogon()) throw EndResponseException::create($this->sendError(401, 'Unauthorized')); ``` 跟进到user\\model.php#isLogon()下,这里$user的值通过$this->session->user来获取,而在没登录的情况下session->user的值是为空的 ![图片10.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-949381f561130964476f700ab40f300fa0a36631.png) ![图片11.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-865a5c63d3372f7314b23b8b9b1d4925e9937677.png) 关于程序创建cookie和权限验证的代码已经分析过了,现在来看看能为什么能绕过,当我们直接访问主页的时候也能获取到一个cookie,我们先看看里面的内容是什么 ![图片12.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-6cd31c63aae1ff92d8b0e2bd8dbfa45f13f57dda.png) 在本地电脑上找到sess\_774fhsc4am826jarqraqab5fis的这个文件,这是正常访问的session,再找一个通过漏洞获取到的看看 下图中上面的是正常访问获取的session,下面的是通过访问poc获得的,可以看到里面最大的区别就是下面的多了一个user字段,所以可以看出认证绕过的原因可能是testcase.savexmindimport()方法下某段代码在session中添加了一个user字段,最终导致绕过的! ![图片13.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-a853a926b77aa7117d57d3b0d6f74bf55c16c587.png) 那我们跟进到testcase\\control.php#saveXmindImport()中,可以看到该方法下调用了common\\model.php#deny() ![图片14.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-a9647de28bc006f37976349ab6240e0393b52975.png) 跟进deny(),该方法下会先判断$reload的值,这里$reload默认为true,会执行if语句下的代码,代码中会在$this->app下添加一个user字段,关于字段的值是什么不用关心,因为验证的只是$this->app->user是否为空,最后就会内容将值存入到session里 ![图片15.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-a328c8143caf19ae2834fc53a6e0630e3d8b5c5a.png) 所以调用到deny()的都可以实现认证绕过,例如testcase.getxmindimport也调用了deny() ![图片16.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-43fd5503cb641c5faf618a97e0647f51de30c759.png) ![图片18.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-c23b656ce5ae5d6e0018a0c49da57248ae67ef69.png) ![图片19.png](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-217410f7401aaaaa5a7ba00f943365008b6212de.png)
发表于 2024-05-16 10:44:37
阅读 ( 4134 )
分类:
代码审计
3 推荐
收藏
0 条评论
请先
登录
后评论
kakakakaxi
4 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!