
교육용 CVE-2024-12877 익스플로잇 데모: GiveWP WordPress 플러그인의 PHP 객체 주입 취약점 시연. 근본 원인 분석, 정규식 우회 기법, 안전한 익스플로잇 관행 포함.
66주차 | 작성자: Ali Soltani (soltanali0))
GO-TO CVE 시리즈의 66주차에 오신 것을 환영합니다. 이 시리즈에서는 취약점을 분석하고, 근본 원인을 파악하며, 안전한 교육적 맥락에서 실용적인 익스플로잇 기술을 시연합니다.
CVE-2024-12877는 가장 널리 사용되는 WordPress 기부 플러그인 중 하나인 GiveWP에서 발견된 PHP 객체 주입 취약점입니다. 사용자 제어 입력에 대한 unserialize()의 안전하지 않은 사용으로 인해 공격자가 PHP 매직 메서드(예: __wakeup())를 트리거하여 다음과 같은 결과를 초래할 수 있습니다:
CVSS: 9.8 치명적 | 벡터: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
GiveWP는 수천 개의 자선 웹사이트, NGO, 기금 모금 플랫폼을 지원합니다. 민감한 재정 및 기부자 데이터를 처리하기 때문에 이곳의 취약점은 매우 큰 영향을 미칩니다. 객체 주입을 악용하는 공격자는 단일 플러그인에서 전체 WordPress 설치 및 기본 서버를 손상시킬 수 있습니다.
근본 원인: 신뢰할 수 없는 입력에 대한 unserialize() 사용.
PHP 매직 메서드: PHP는 객체 수명 주기 동안 이를 자동으로 호출합니다:
취약점은 사용자 제어 입력에 대한 PHP 함수 unserialize()의 안전하지 않은 사용에서 비롯됩니다. unserialize()는 PHP 데이터 구조를 재구성하도록 설계되었지만 위험한 부작용이 있습니다: 객체가 재구성될 때 PHP는 자동으로 매직 메서드를 호출합니다.
__wakeup() – 객체가 역직렬화될 때 트리거됩니다.
__destruct(), __toString(), __get/__set(), __call/__callStatic() – 악의적인 실행에 활용될 수 있습니다.
정규식 검증: GiveWP는 직렬화된 입력을 감지하기 위해 정규식 검사를 구현했습니다. 새로운 정규식은 더 많은 데이터 유형을 감지하지만, 정규식은 객체 주입을 안정적으로 방지할 수 없습니다.
조작된 직렬화 객체를 사용하여 공격자는 객체 속성을 설정하고, PHP 자체가 매직 메서드를 호출하여 공격자의 논리를 실행합니다.
GiveWP는 입력이 직렬화되었는지 확인하기 위해 정규식 기반 검증을 구현했습니다. 이전 정규식 (불완전)
배열과 객체만 인식했습니다.
다른 직렬화 유형(문자열, 정수, 부울, 실수, null)은 탐지를 우회했습니다.
모든 PHP 직렬화 유형을 인식합니다.
일부 간단한 페이로드를 차단합니다.
그러나 핵심 문제는 남아 있습니다: 사용자 입력에 대해 unserialize()가 사용된다면, 정규식으로는 해결할 수 없습니다.
이 스니펫은 두 가지 다른 정규식 구현을 비교하기 위해 작성되었습니다:
is_serialized_old() → 배열과 객체만 감지하는 이전 버전.
is_serialized_new() → 모든 PHP 직렬화 데이터 유형(배열, 객체, 문자열, 정수, 부울, 실수, null)을 인식하는 개선된 버전.
테스트 값 집합(배열, 객체, 문자열, 정수, 부울, 실수, null)을 만들고, 직렬화한 후 각각을 두 정규식 함수로 확인합니다.
간단히 말하면:
그리고 이 코드를 도커에서 실행한 후 브라우저에서 이 결과를 볼 수 있습니다.
1단계
2단계: 취약한 클래스 생성
이 클래스에는 역직렬화될 때 자동으로 실행되는 __wakeup() 메서드가 있습니다.
3단계: 페이로드 제작
4단계: 출력 파일을 저장한 후 이 파일에서 익스플로잇을 볼 수 있습니다.
익스플로잇:
이전 정규식: FALSE → 페이로드 감지 실패.
새 정규식: TRUE → 직렬화된 입력으로 감지.
실행: Hello RCE! → 페이로드가 역직렬화되었고, 매직 메서드 __wakeup()이 공격자 제어 코드를 실행했습니다.
결과:
핵심 통찰력:
unserialize()를 보호하기 위해 정규식에 의존하지 마십시오. 가장 안전한 접근 방식은 신뢰할 수 없는 입력을 역직렬화하지 않는 것입니다.
unserialize()를 사용하지 말고 json_decode() 또는 다른 안전한 대안을 사용하십시오.저는 취약점 연구와 익스플로잇에 전념하는 두 개의 텔레그램 채널을 운영하고 있습니다.
GO-TO CVE 주간 에피소드: 매주 새로운 CVE를 깊이 파고들어 상세한 분석, 데모 및 통찰력을 공유합니다. 🔗 여기서 가입하세요
CVEdb – 익스플로잇 아카이브: 이 채널은 1일 익스플로잇 및 맞춤형 PoC를 CVE별로 보관합니다. 활성 익스플로잇 기술을 보고 싶은 연구자에게 좋은 자료입니다. 🔗 CVEdb 가입하기
채널을 팔로우하여 최신 CVE, 익스플로잇 기술 및 보안 연구 통찰력을 놓치지 마세요.
이 저장소는 교육 및 연구 목적으로만 제공됩니다. 허가 없이 취약점을 악용하는 것은 불법이며 비윤리적입니다. 작성자는 오용에 대해 책임을 지지 않습니다.