Zentao Privilege Escalation
2024-10-14 08:32:30
漏洞分析
https://github.com/easysoft/zentaopms/commit/695055c6b1d2e6a8c944bdbc38308c06820c40ce?diff=split&w=0[framework/api/entry.class.php]
此文件修改了两处
!isset($this->app->user) -> !isset($this->app->user->account)
return $this->send(403xxx) -> die($this->send(403))
第二处修改则是权限绕过得一处关键,return
虽然会渲染出403页面但不会中断流程,而die
则是直接中断不会再向下执行。
[framework/base/router.class.php]
修改了条件判断顺序将HTTP_TOKEN
分支上移
[module/common/model.php]
此处修改较多,移除了checkNewEntry
函数,流程不会在checkNewEntry
中return false
中断后续的token认证流程。[www/api.php]
此处为进入checkEntry
做了前提条件
关键条件是$this->app->user从哪里设置
发现在[module/common/model.php#deny]
方法中进行了设置
- $user->rights
这里$account
是没有内容的所以$user->rights=false
- $user->groups
$account
是没有内容的所以$user->groups=[]
$user->admin=false
后面将1
$user->admin = strpos($this->app->company->admins, ",{$user->account},") !== false;//$user->account=null
$user
赋值给$this->app->user
虽然user内容为不过已经可以绕过1
2
3
4
5{
["rights"]=>bool(false)
["groups"]=>array(0) {}
["admin"]=>bool(false)
}framework/api/entry.class.php
中401
接下来就是怎么进入到deny
方法中而且要求调用时参数为两个或者传入的第三个参数为true并且路由在openMethods
列表中
符合条件的有三个
- testcase.getxmindimport
- testcase.showxmindimport
- testcase.savexmindimport
在构造方法中还要满足isAjaxRequest
条件
构造poc
1 | /api.php?m=testcase&f=getxmindimport&HTTP_X_REQUESTED_WITH=XMLHttpRequest&productID=1&branch=1 |
获取到cookie
使用cookie请求api接口