CVE-2023-23752 Joomla未授权访问漏洞分析
2023-2-22 14:46:24 Author: 安全日记(查看原文) 阅读量:27 收藏

声明:本公众号文章来自作者日常学习笔记或授权后的网络转载,切勿利用文章内的相关技术从事任何非法活动,因此产生的一切后果与文章作者和本公众号无关!

0x00 环境搭建

直接去git上下载即可

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的操作,那些都是受影响的接口


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5Njc0NTY4NQ==&mid=2247484407&idx=1&sn=fb7986150f1659f4805ead716e08bab1&chksm=c07d2a4df70aa35b7e9c5ad258b1159e27e0d2407d40477c84ee18c285d4ce65890db080ce17#rd
如有侵权请联系:admin#unsafe.sh