CVE-2023-22518是Atlassian Confluence数据中心和服务器中的一个严重漏洞。该漏洞可能允许未经身份验证的攻击者通过网络访问 Confluence 实例来恢复 Confluence 实例的数据库并最终执行任意系统命令。
技术细节
在对已修补版本和未修补版本进行补丁比较后,我们发现在各个 Action 类中添加了两个新注释,即 和@WebSudoRequired。@SystemAdminOnly
最初,我们尝试暴力破解导致这些特定操作的路线,但这种方法没有取得成功。然后,我们将注意力转向该struts.xml文件,其中包含有关操作和基于命名空间的路由以及拦截器的信息,希望能发现一些见解。然而,没有什么立即引人注目。
此外,我们注意到 中的正则表达式更改与之前导致身份验证绕过的关键CVE-2023-22515SafeParametersInterceptor有关。我们投入了大量时间尝试利用这一变化,但未能取得任何突破。我们的调查使我们了解到,在 的情况下,其中必须是数字,则不会将参数键视为复杂参数并允许。ActionObject.getXYZ.getABC[N]=ANYTHINGNSafeParametersInterceptorOgnlValueStack.setValue(...)
这一发现揭示了一个复杂的障碍:找到一种能够通过属性修改来促进身份验证绕过的方法。此过程需要存在返回集合或数组的 getter。此外,带有可操作设定器的索引也是必不可少的。然后,我们将注意力转向 struts.xml 文件,仔细检查其内容以查找任何潜在的线索。经过仔细检查,很明显/json命名空间增强了/admin命名空间的功能。因此,为/admin命名空间设计的路由也可以通过命名空间访问/json。
在命名空间的上下文中/json,请求路由过程涉及通过一系列拦截器。这些拦截器之一称为 ,WebSudoInterceptor根据请求 URI 执行检查。
WebSudo 是一项通常与 Atlassian Confluence 相关的安全功能,在这里发挥着至关重要的作用。它要求用户在执行关键操作之前使用提升的权限(通常是密码)重新验证自己的身份。
具体来说,WebSudoInterceptor 执行以下检查:
如果请求路径为/authenticate.action,则跳过。
如果请求路径为/admin,则检查该WebSudoNotRequired属性是否不为空。
对于任何其他请求路径,例如/json命名空间中的请求路径,它确保该WebSudoRequired属性为 null。这种情况表明WebSudoRequired注释不存在于类、包或方法级别。如果满足此条件,则将跳过负责启动安全管理会话的 WebSudo 检查。
现在的目标是识别在 HTTP 处理程序方法级别缺少任何授权或身份验证检查的操作(类)。
/admin/后续阶段涉及对命名空间内的所有端点/操作进行暴力破解/json/。目的是监测反应并确定任何值得注意的发现。在此期间,在 尝试 GET 请求时进行了观察/json/setup-restore.action,结果导致 405 方法不允许响应。对代码的进一步检查证实它缺少 WebSudoRequired 注释,并且没有在方法处理程序中实现任何辅助身份验证检查。本质上,这意味着通过提供正确的参数,请求可能会成功,而无需任何形式的身份验证。
POST /json/setup-restore.action?synchronous=true HTTP/1.1
Host: localhost:8090
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryT3yekvo0rGaL9QR7
X-Atlassian-Token: no-check
Content-Length: 277538
------WebKitFormBoundaryT3yekvo0rGaL9QR7
Content-Disposition: form-data; name="buildIndex"
false
------WebKitFormBoundaryT3yekvo0rGaL9QR7
Content-Disposition: form-data; name="file";filename="exploit-restore.zip"
ZIP_DATA
------WebKitFormBoundaryT3yekvo0rGaL9QR7
Content-Disposition: form-data; name="edit"
Upload and import
------WebKitFormBoundaryT3yekvo0rGaL9QR7--
有趣的是,传递synchronous=true对我们实际有用的东西。这是一个简单的更改,false当true较早的请求未导致成功恢复时,即使创建了恢复任务也是如此。
参考:
https://blog.projectdiscovery.io/atlassian-confluence-auth-bypass/
https://twitter.com/shimizukawasak/status/1719985739377918285
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里