joomla安装 joiplay插件怎么用

声明:仅供学习参考,请勿用于非法用途,否则后果自负。

0x01简介

Joomla:开源CMS的三大巨头之一,是世界著名的内容管理系统。该系统采用PHP语言和MySQL数据库开发,可以运行在Linux、Windows、MacOSX等多种平台上。

0x02漏洞概述

漏洞编号:CVE-2023-23752
攻击者可以通过构建特制的请求来访问RestAPI接口,并通过用变量覆盖漏洞来绕过身份验证,从而获取Joomla相关的配置信息。

0x03影响版本

受影响版本:4.0.0 ~ 4.2.7
易受攻击的路线是Rest API,正式开发于4.x。

0x04环境建设

下载地址:Joomla V4.2.7

https://downloads . Joomla . org/CMS/Joomla 4/4-2-7/Joomla _ 4-2-7-Stable-Full _ package . zip?Format=zip环境配置:nginx 1 . 15 . 11+MySQL 5 . 7 . 26+PHP 7 . 3 . 4 nts。

安装方法:访问站点的根目录开始安装。

0x05漏洞再现

有效载荷格式:http://servername/API/index . PHP/routing path?public=true

/API/index . PHP/v1/config/application?Public=true:这个API用于获取网站最重要的配置信息,包括数据库的账号和密码。

joomla安装 joiplay插件怎么用

此外,受影响的路线有

v1/banners v1/banners/:id v1/banners v1/banners/:id v1/banners/:id v1/banners/clients v1/banners/clients/:id v1/banners/clients v1/banners/clients/:id v1/banners/categories v1/banners/categories/

未授权的接口是Rest API接口,对应的路由是:/API/index.php。

我们从/API/index.php的下一个断点开始调试。

Jump/API /api/includes/app.php

步进函数

公共函数execute(){ try {# Filters用户的传递参数$ this->;sanityCheckSystemVariables();$ this-& gt;setupLogging();$ this-& gt;createExtensionNamespaceMap();#执行应用程序$ this-& gt;do execute();#渲染模板对象if($ this->;JoomlaCMSDocumentDocument) { //呈现应用程序输出。$ this-& gt;render();} #处理gzip压缩输出…} catch (Throwable $throwable) {#错误处理} #触发onBeforeRespond事件$ this-& gt;get dispatcher()-& gt;派遣(& # 39;onBeforeRespond & # 39);#发送程序响应信息$ this-& gt;respond();#触发onAfterRespond事件$ this-& gt;get dispatcher()-& gt;派遣(& # 39;onAfterRespond & # 39);}可以看到$ this-& gt;do execute();后端数据已在中处理,模板对象/响应信息已获得。

我们进入这个函数

受保护的函数doExecute(){ #初始化应用程序$ this->;initialize app();#在profiler中标记afterInitialise JDEBUG?$ this-& gt;分析器-& gt;马克(& # 39;afterInitialise & # 39):null#处理路线$ this-& gt;route();#在探查器中标记afterApiRoute JDEBUG?$ this-& gt;分析器-& gt;马克(& # 39;afterApiRoute & # 39):null#分发应用程序$ this-& gt;分派();#在profiler中标记afterDispatch JDEBUG?$ this-& gt;分析器-& gt;马克(& # 39;afterDispatch & # 39):null}发现了处理路由的逻辑$ this->;route();,我们跟进

受保护的函数route() {…试试{ $ this-& gt;handlePreflight($method,$ router);$ route = $ router-& gt;parsapiroute($ method);#解析API route } catch(routenotfoundexception $ e){ $ caugh 404 = true;} …#身份验证if(!isset($route[& # 39;vars & # 39]['public & # 39])| | $ route[& # 39;vars & # 39]['public & # 39] === false) { if(!$ this-& gt;登录([& # 39;用户名& # 39;= & gt''], ['沉默& # 39;= & gt真的,& # 39;行动& # 39;= & gt'core . log in . API & # 39;])){ throw new AuthenticationFailed();}}}先分析API路由,再继续认证操作,后续先分析API路由的方法。

公共函数parsapeapiroute($ method = & # 39;获取& # 39;){ $ method = strto upper($ method);# value:& # 34;获取& # 34;$ valid methods =[& # 34;获取& # 34;, "邮政& # 34;, "放& # 34;, "删除& # 34;, "头& # 34;, "跟踪& # 34;, "补丁& # 34;];如果(!in_array($method,$ valid methods)){ throw new InvalidArgumentException(sprintf(& # 39;%s不是有效的HTTP方法。',$ method));} #从路由中获取路径并删除斜杠$ route path = $ this-& gt;getRoutePath();#获取pass参数,并将其作为键-值对$ query = Uri::getInstance()-& gt;getQuery(true);#遍历所有已知路由以查找与foreach($this->)匹配的路由;路由为$route) { if (in_array($method,$ route-& gt;get methods()){ if(preg _ match($ route-& gt;getRegex(),ltrim($routePath,& # 39;/'),$matches)) {//输入分支,则匹配成功$ vars = $ route-& gt;get defaults();foreach($ route-& gt;getRouteVariables()as $ I = & gt;$ var){ $ vars[$ var]= $ matches[$ I+1];} $ controller = preg _ split(& # 34;/[.]+/",$ route-& gt;get controller());$vars = array_merge($vars,$ query);#将GET pass参数拼接到返回数组中[& # 39;vars & # 39]return[& # 39;控制器& # 39;= & gt$controller[0],& # 39;任务& # 39;= & gt$controller[1],& # 39;vars & # 39= & gt$ vars];} } }抛出新的RouteNotFoundException(sprintf(& # 39;无法处理路由“%s”的请求。',$ route path));}调试时需要通过一个已有的路由进入分支,比如:/api/index.php/v1/banners。

因为array_merge()的变量覆盖了属性。

我们可以控制$vars的值,即解析路由的地方存在可变覆盖漏洞。

然后我们回到认证部分。

如果(!isset($route[& # 39;vars & # 39]['public & # 39])| | $ route[& # 39;vars & # 39]['public & # 39] === false) { if(!$ this-& gt;登录([& # 39;用户名& # 39;= & gt''], ['沉默& # 39;= & gt真的,& # 39;行动& # 39;= & gt'core . log in . API & # 39;])){ throw new AuthenticationFailed();}}因为$ route[& # 39;vars & # 39]可控,所以我们可以通过传递GET参数覆盖public的初始值,然后设置为true,就不会进行认证了。

0x07修复方法

修复可变覆盖率漏洞的方法相对简单。如果漏洞是由于覆盖现有变量引起的,那么在变量覆盖的函数存在之前,需要判断该变量是否已经存在。

如果像这样,因为变量coverage而添加了一个用于身份验证的变量,那么可以在变量coverage函数之后释放相应的变量。

可以参考官方修复方法:
https://github.com/joomla/joomla-CMS/compare/4.2.7…4.2.8

可以看出,调用可变覆盖的路由解析方法后,unset丢弃了用于认证的变量,使得认证无法被可变覆盖绕过。

当然也可以更新到漏洞修复后的版本:https://github.com/joomla/joomla-cms/releases/tag/4.2.8.

参考链接:

https://xz.aliyun.com/t/12175

https://developer . Joomla . org/security-centre/894-2023 02 01-core-unproper-access-check-in-web service-endpoints . html

来自https://www.secpulse.com/archives/198104.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论