CVE-2023-22518 漏洞分析,针对 Atlassian Confluence Server,涵盖环境搭建、JAR 差异比对、根本原因分析,以及通过未授权恢复重新获得管理员访问权限。
Exploit-CVE-2023-22518 Confluence 中的 CVE-2023-22518
CVE-2023-22518:该漏洞被描述为“Confluence 数据中心和服务器中的授权不当漏洞”。该漏洞影响 Atlassian 产品的本地部署(On-premises)版本。
搭建环境,使用受影响的版本 8.0.4。下载 URL:https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.0.4-x64.exe

选择 Trial Installation(试用安装),然后点击链接获取免费试用密钥。之后设置集群:选择非集群(non-cluster)。

然后进入数据库设置 -> 选择 MySQL

按照以下说明操作:
Download the MySQL driver
Drop the .jar file in /home/lily/atlassian/confluence/confluence/WEB-INF/lib
Restart Confluence and continue the setup process.
配置数据库,创建用户和密码
CREATE DATABASE securedb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'admin123'@'localhost' IDENTIFIED BY 'supersecure';
GRANT ALL PRIVILEGES ON securedb.* TO 'admin123'@'localhost';
GRANT SUPER ON *.* TO 'your_username'@'your_host';
FLUSH PRIVILEGES;
然后 edit /etc/mysql/my.cnf 。添加以下行:
transaction-isolation = READ-COMMITTED
log_bin_trust_function_creators = 1

然后重启 MySQL 和 Confluence。接着前往 localhost:8090 的安装页面,使用已创建的数据库进行填写。

检查连接是否成功,点击 Next。然后进行注册(Sign up)。

在 IntelliJ 中对两个版本的 jar 文件进行 Diff

SystemAdminOnly:该功能将管理功能限制为仅限管理员账户。这有助于确保只有被授权的账户才能执行重要且影响系统的操作。
在 RestoreAction.class 的 validate() 处设置断点

通过 getRestoreFileFromUpload 保存上传文件的函数

GetExportDescriptor 用于解压并读取 zip 文件的内容


然而调试之后,仍然没有找到漏洞的根本原因。
CVE 中描述的原因是授权漏洞。这促使我们将注意力转向开发者在进行权限分配过程中关于 Java 语言漏洞的研究文章。
将注意力转向 struts.xml 文件,该文件包含有关操作(actions)、基于命名空间的路由信息以及拦截器(interceptors)。



可以看到 /json 命名空间增强了 /admin 命名空间的功能。因此,为 /admin 命名空间创建的路由也可以通过 /json 命名空间访问。
在 /json 命名空间的上下文中,请求的路由过程需要经过一系列拦截器(interceptors)。其中一个名为 WebSudoInterceptor 的拦截器会根据请求 URI 执行检查。
具体来说,WebSudoInterceptor 执行以下检查步骤:
如果请求路径是 /authenticate.action,则会被忽略。如果请求路径是 /admin,它会检查 WebSudoNotRequired 属性是否为空。
如果请求发送到 '/json',那么发往 '/json/action' 的请求会被转发到 '/setup/action' 和 'admin/action'。在此 CVE 中,漏洞路径是 '/json/setup-restore.action?synchronous=true'。
使用 Burp Suite 捕获请求,GET /json/setup-restore.action。然而收到了“Method Not Allowed”响应。尝试使用 POST /json/setup-restore.action?synchronous=true,收到了 200 响应。


上传文件 xmlexport-200123123001.zip

发送并接收响应

现在我们可以使用 account admin :admin 登录

得到如下结果
