破绽概要
Joomla 在海内应用较多,是一套应用 PHP 和 MySQL 开发的开源、跨平台的内容管理系统 (CMS)。
Joomla 4.0.0 至 4.2.7 版本中的 ApiRouter.php#parseApiRoute 在解决用户的 Get 申请时未对申请参数无效过滤,导致攻击者可向 Joomla 服务端点发送蕴含 public=true 参数的申请 (如:/api/index.php/v1/config/application?public=true&key=value) 进行未受权拜访。
- 修复计划:在 4.2.8 版本中对破绽进行了修复,倡议用户将 Joomla 降级至 4.2.8 及以上版本
- 破绽链接:https://www.oscs1024.com/hd/M…
以下内容来自公众号《平安日记》Erikten 对该破绽的剖析:
0x00 环境搭建
间接去 Github 上下载即可
https://github.com/joomla/joomla-cms/releases/tag/4.2.8
0x01 破绽剖析
这个破绽的实质就是一个变量笼罩导致的越权,咱们能够去 diff 一下,看看官网是怎么修复这个变量笼罩破绽的
`https://github.com/joomla/joomla-cms/commit/5897df8ee39056fbd37624eeeeff1b81e24d84ef#diff-865580463b5f16d45dc41be7d57bf9f2ab7dd875215c2ad0471247f63b9e1b4c`
array_key_exists() 的作用就是判断数组中是否蕴含指定的键名,如果存在 public 这个键为 true,接着通过 unset() 间接销毁这个变量。到这里聪慧的你指定晓得大略是怎么事儿了,就是笼罩了 public 这个变量,导致的越权
咱们间接在第一处红框哪里打断点,这里为了不便复现破绽,先正文掉补丁,拜访
/api/index.php/v1/config/application?public=true&key=value
能够看到 $query 接管了咱们申请的参数
持续往下跟,会进行一个正则匹配,看看咱们的申请形式以及门路是否非法
咱们间接强制跳转到循环体内,能够看到 $vars 的值是获取的路由的默认值,这里 public 的值是 false
这里因为 $route 下的 routeVariables 值为空,所以不会进入循环体
接着通过 $route->getController() 获取以后 route 的 controller,里边的值别离对应控制器以及其下的办法名字
敲黑板敲黑板,接下来就是真正实现变量笼罩的中央,程序通过 array_merge() 来将多个变量合并到同一个数组下,能够看到此时 $vars 下边的 public 是 false 的
然而通过 array_merge() 解决,将 $query 的值进行合并的时候产生了笼罩,能够看一下官网对于 array_merge() 的解释
所以合并后的 public 变成了 true
为什么说这里改了 public 为 true 就能越权,这是因为 libraries/src/Application/ApiApplication.php:304 进行了权限校验,如果 $route 下的 public 存在或者 public 的值为 false,那么就进行身份校验
最终咱们就绕过了身份校验,实现了越权
在后面剖析的时候会有一个遍历 routes 的操作,那些都是受影响的接口
收费情报订阅 & 代码平安检测
墨菲平安是一家为您提供业余的软件供应链平安治理的科技公司,外围团队来自百度、华为、乌云等企业,公司为客户提供残缺的软件供应链平安治理平台,围绕 SBOM 提供软件全生命周期的平安治理,平台能力包含软件成分剖析、源平安治理、容器镜像检测、破绽情报预警及商业软件供应链准入评估等多个产品。为客户提供从供应链资产辨认治理、危险检测、安全控制、一键修复的残缺控制能力。同时产品能够极低成本的和现有开发流程中的各种工具一键买通,包含 IDE、Gitlab、Bitbucket、Jenkins、Harbor、Nexus 等数十种工具无缝集成。
代码平安检测:https://www.murphysec.com/?sf=v832dc
情报订阅:https://www.oscs1024.com/cm/?sf=v832dc
破绽库:https://www.oscs1024.com/hl/?sf=v832dc