Search

[Reflected XSS] CVE-2024-56289

Categories
Tags
작성일
2025/01/08
1 more property

Component type

WordPress plugin

 Component details

Component name WordPress CRM, Email & Marketing Automation for WordPress | Award Winner — Groundhogg
Vulnerable version <= 3.7.3.2
Component slug groundhogg

 OWASP 2017: TOP 10

Vulnerability class A3: Injection
Vulnerability type Cross Site Scripting (XSS)

Pre-requisite

Unauthenticated

 Vulnerability details

Short description

Groundhogg 플러그인 3.7.3.3 이하 버전에는 URL 파라미터의 입력값 검증과 이스케이프 처리가 미흡해 Reflected Cross Site Scripting 취약점이 존재합니다. 이 취약점은 플러그인 대시보드의 'Contacts', ‘Funnels’, 'Logs' 메뉴에서 검색 필터링 기능을 사용할 때 발생합니다.
이를 통해 인증되지 않은 사용자가 악성 스크립트가 포함된 URL을 생성하고, 다른 사용자가 해당 URL에 접근하면 브라우저에서 스크립트가 실행되어 쿠키 정보가 유출될 수 있습니다. 특히 관리자 권한을 가진 사용자의 세션을 탈취하는 데 악용될 수 있어 심각한 보안 위험을 초래합니다.

 How to reproduce (PoC)

1.
‘Groundhogg’ 플러그인 <=3.7.3.2 이 활성화된 워드프레스 사이트를 준비합니다.
해당 플러그인은 REST API를 이용하므로 Permalink를 Post name 으로 설정해야합니다.
2.
이후 아래의 각 메뉴에 대한 링크로 접속하면 Reflected XSS 취약점이 발생됩니다.
Contacts 메뉴(/wp-admin/admin.php?page=gh_contacts)
http://localhost:8080/wp-admin/admin.php?page=gh_contacts&filters=W1t7ImlkIjoiIiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiJ9XV0
Plain Text
복사
Funnels 메뉴(/wp-admin/admin.php?page=gh_funnels)
해당 메뉴에서의 XSS 취약점을 재현하기 위해서는 최소 1개의 Funnel이 존재해야 합니다.
http://localhost:8080/wp-admin/admin.php?page=gh_funnels&status=inactive&include_filters=W1t7ImlkIjoiMTBjY2FmZmUtZjE0YS00MTg5LWE0MzctYjA2MTFhMTQ2ZDk1IiwidHlwZSI6InRpdGxlIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiIsImNvbXBhcmUiOiJlcXVhbHMifV1d
Plain Text
복사
Logs 메뉴(/admin.php?page=gh_events)
http://localhost:8080/wp-admin/admin.php?page=gh_events&tab=emails&include_filters=W1t7ImlkIjoiIiwidHlwZSI6ImZyb21fYWRkcmVzcyIsInZhbHVlIjoiPGltZyBzcmM9XCJ4XCIgb25lcnJvcj1cImFsZXJ0KGRvY3VtZW50LmNvb2tpZSlcIj4iLCJjb21wYXJlIjoiZXF1YWxzIn1dXQ
Plain Text
복사

 Additional information (optional)

[취약점 발생 원인]

Groundhogg 플러그인의 대시보드 ‘Contacts’, ‘Funnels’, ‘Logs’ 메뉴에서는 필터링 검색을 수행할 때, 필터링 설정 값을 Base64로 인코딩한 뒤 해당 값을 URL 파라미터로 전달합니다.
예를 들어, ‘Contacts’ 메뉴에서 필터링 검색을 ‘First Name’이 ‘Test’ 로 지정할 경우 URL 파라미터 filters 에는 아래의 데이터가 전달됩니다.
W1t7ImlkIjoiMjM3NzdjMGItYTQ1Ni00M2JlLWExZGMtODkzN2E1MDk0M2I5IiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiJUZXN0In1dXQ
Plain Text
복사
이때, URL 파라미터 filters 에 입력된 값을 Base64로 디코딩 하면 아래의 데이터가 확인됩니다.
[[{"id":"23777c0b-a456-43be-a1dc-8937a50943b9","type":"first_name","compare":"equals","value":"Test"}]]
Plain Text
복사
이후 필터링 검색이 요청되면 /wp-content/plugins/groundhogg/admin/contacts/contacts-page.php 파일에 있는 Contacts_Page 클래스의 scripts 함수가 실행됩니다.
이때 Base64로 인코딩된 URL 파라미터 filters가 디코딩되어 HTTP 응답의 Javascript 영역에 있는 ContactSearch 변수로 전달됩니다.
따라서, HTTP 응답 데이터에는 URL 파라미터 filters 에 전달된 Base64 인코딩 데이터가 디코딩되어서 전달되는 것을 확인하실 수 있습니다.
이후, 자바스크립트 로직에 의해 디코딩된 데이터가 필터링 검색 결과를 표시하는 DOM 요소에 직접 삽입됩니다.
이를 통해 PoC 에서 입력한 필터링 검색어(<img src="x" onerror="alert(document.cookie)">)는 이스케이프 처리 없이 Javascript 코드 내 변수로 전달되고 클라이언트 로직에 의해 DOM 요소에 삽입되어 실행됩니다.
결과적으로, 필터링 검색 데이터에 대한 적절한 이스케이프 처리가 이루어지지 않아, 악의적인 스크립트가 포함된 값이 그대로 실행될 수 있으며, 해당 취약점은 'Contacts', 'Funnels', 'Logs' 메뉴 모두에서 동일한 방식으로 발생합니다.

 Attach files (optional)

 References