Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-22978 — CVE-2022-22978에 대한 개념 증명(PoC)으로, Spring Security의 RegexRequestMatcher에서 CRLF 인젝션을 통한 권한 부여 우회를 보여주며, 데모 애플리케이션 및 수정 분석을 포함합니다. | Kitploit
도구/GitHubGitHub/raghvendra1207/cve-2022-22978
Authentication & AuthorizationVulnerability AnalysisExploitationWeb Application ExploitationLearning & EducationLabs & Practice
GitHubraghvendra1207/cve-2022-22978

CVE-2022-22978

CVE-2022-22978에 대한 개념 증명(PoC)으로, Spring Security의 RegexRequestMatcher에서 CRLF 인젝션을 통한 권한 부여 우회를 보여주며, 데모 애플리케이션 및 수정 분석을 포함합니다.

저장소 보기
4년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE 2022-22978: RegexRequestMatcher의 인증 우회 🥶

개요

내가 조사한 정보에 따르면, 이 취약점은 Spring Security 프레임워크의 RegexRequestMatcher 클래스와 관련이 있습니다. 구체적으로, 정규 표현식에 점(.)이 포함된 RegexRequestMatcher를 사용하는 애플리케이션은 \r(%0a) , \n(%0d) 문자를 사용하여 우회될 수 있으며, 이를 통해 공격자는 인증 없이 허용되지 않은 경로에 접근할 수 있습니다.

Spring Security 프레임워크의 취약한 버전:

  • 5.5.x 이전 5.5.7
  • 5.6.x 이전 5.6.4
  • 이전의 지원되지 않는 버전.

분석

이 취약점을 정적으로 분석하기 위해 Spring Security의 소스 코드에 접근해야 합니다. 구체적으로 여기서는 Github의 5.6.3(취약한 버전)과 5.6.4(수정된 버전) 사이의 커밋 비교 기능을 사용했습니다. 다음 링크에서 확인할 수 있습니다: Comparing 5.6.3...5.6.4 · spring-projects/spring-security (github.com)

img1

RegexRequestMatcher 클래스의 변경 사항을 확인했습니다. 5.6.4 버전에서는 이 클래스가 5.6.3 버전에서 기본적으로 사용하던 . 대신 Pattern.DOTALL을 사용하는 것을 볼 수 있습니다.

여기서:

  • Pattern : java.util.regex 패키지에 있는 3개의 클래스 중 하나로, 정규 표현식을 처리하는 기능을 합니다.
  • Pattern.DOTALL : 이 플래그를 사용하면 정규 표현식의 “.”가 줄 바꿈 문자 \n , \r을 포함한 모든 문자와 일치합니다.
  • Pattern.CASE_INSENSITIVE: 대소문자를 구분하지 않습니다.

img2

기본적으로 정규 표현식의 .는 \n, \r과 같은 줄 바꿈 문자를 제외한 모든 문자와 일치합니다. 따라서 어떤 문자열의 패턴을 검증하는 regex 함수가 있는 경우, 문자열에 줄 바꿈 문자가 있으면 해당 regex 함수는 일치하지 않습니다. 이를 방지하기 위해 Pattern.DOTALL 플래그를 사용할 수 있습니다.

하지만 누군가 \n 대신 %0d 또는 \r 대신 %0a를 의도적으로 사용하면 위의 regex는 여전히 일치하지 않습니다. 따라서 5.6.4 버전에서는 RegexRequestMatcherTests.java에 이 경우를 추가로 확인하는 코드가 추가되었습니다. 구체적으로, %0d와 %0a를 각각 \n과 \r로 변환한 후 regex로 확인합니다.

img3

데모

1단계: Spring Initializr를 사용하여 Spring Security와 Spring Web 두 가지 종속성을 포함하는 Spring Boot 웹 애플리케이션을 생성합니다.

img4

2단계: /admin/* 경로로 요청이 오면 This is a CVE-2022-22978 demo라는 문자열을 출력하는 Controller를 생성합니다.

img5

3단계: 사용자가 /admin/<any> 경로에 접근할 때마다 regexMatchers("/admin/.*").authenticated()를 사용하여 인증 메커니즘을 설정합니다. 이것이 바로 공격자가 인증 없이 /admin/<any> 페이지의 내용을 보기 위해 악용하는 취약점입니다.

img6

4단계: 구성 파일에서 취약점이 포함된 Spring Security 버전을 선언합니다. 여기서는 버전 5.6.3을 선택합니다.

img7

5단계: gradlew bootRun 명령어로 애플리케이션을 실행하면 프로그램이 기본적으로 Apache Tomcat을 사용하여 8080 포트에서 수신 대기합니다. /admin/xyz 경로에 접속합니다(/admin/으로 시작하는 모든 경로 가능).

img8

결과로 403 Forbidden 코드가 반환되며, 이는 인증되지 않아 접근할 수 없음을 의미합니다.

이때, Spring Security(버전 5.6.3)의 regexMatchers 함수가 \r(%0d) 및 \n(%0a)와 같은 줄 바꿈 문자를 일치시키지 못하는 취약점을 이용하여, 페이로드 /admin/%0dxyz를 사용하면 인증 없이 위 경로에 접근할 수 있습니다.

img9

마찬가지로 페이로드 /admin/%0axyz도 동일합니다.

img10

이와 같이 매우 간단한 페이로드만으로 CVE-2022-22978 취약점을 성공적으로 악용할 수 있었습니다.

수정 방법

  • Spring Security 버전을 다음으로 업데이트:
    • 5.5.7+
    • 5.6.4+
    • 5.7+
  • 데모: 수정된 버전, 구체적으로 5.7.1 사용

img11

위와 동일한 페이로드 /admin/%0dxyz로 웹 공격 시도

img12

이제 앱은 공격자가 원하는 응답을 반환하지 않습니다.

사용법

root@kitploit:~
git clone https://github.com/ducluongtran9121/CVE-2022-22978-PoC.git
cd CVE-2022-22978-PoC
gradlew bootRun

Requirements

root@kitploit:~
Java 18
Gradle 7.4.1
도구 다운로드