1. CVE-2023-3460이란?
CVE ID: CVE-2023-3460
CVSS 심각도 점수: 9.8
영향을 받는 버전: < 2.6.7
CVE-2023-3460은 WordPress 웹사이트에서 사용자 등록 및 커뮤니티 기능을 관리하는 데 사용되는 도구인 Ultimate Member WordPress 플러그인에 영향을 미치는 심각한 취약점이다. CVSS 심각도 점수가 9.8인 이 결함은 인증되지 않은 공격자가 보안 제한을 우회하고 관리자 권한으로 새 계정을 등록할 수 있도록 허용한다. 이를 통해 영향을 받는 WordPress 사이트에 대한 모든 권한이 부여된다.
2. 환경구축
XAMPP 3.3.0, Wordpress 6.6.2, Ultimate Member 2.6.6
https://ko.wordpress.org/plugins/ultimate-member/advanced/
Ultimate Member 플러그인은 사용자 관리 및 워드프레스 사이트 페이지 관리를 하는 기능으로 기본 워드프레스에 있는 관리 기능을 대체해서 사용할 수 있다.
현재 필자의 워드 프레스 사이트는 아무런 설정도 안 한 상태로 어떠한 기능도 없는 백지상태라고 할 수 있다.
Ultimate Member 플러그인을 활성화하고 Settings 항목에서
기본 페이지들을 설정해주면
사이트에 여러 기능 페이지가 생성된 걸 확인할 수 있다.
물론 워드프레스 기본 설정에서도 해당 기능들의 페이지를 구현할 수 있지만 Ultimate Member 플러그인을 쓰면 간단하고 편하게 생성할 수 있다.
3. 분석
워드프레스 데이터베이스를 보면 여러 기능의 테이블이 존재하는 것을 확인할 수 있다.
그중 wp_capabilities로 사용자의 역할과 권한을 관리하며 해당 컬럼은 wp_usermeta 테이블에 저장된다.
3.1.1 wp_users
wp_users 테이블에는 이용자의 user_login(아이디), user_pass, user_email 등의 컬럼에 필수적인 정보가 저장되고 자동증가 필드로는 ID라는 컬럼이 있다
3.1.2 wp_usermeta
wp_usermeta 테이블에는 umeta_id, user_id, meta_key, meta_value 등의 컬럼으로 구성되는데, wp_users 테이블의 ID 컬럼과 연결하기 위해 user_id라는 컬럼이 있고 umeta_id는 자동증가 필드이고 meta_key, meta_value 컬럼에는 이용자 등록정보 중의 커스텀 필드의 값이 저장된다.
각 user에 대한 값은 user_id로 구분되어 작성되어 있다.
위 사진을 보면 닉네임이 jh117jh인 계정의 wp_capabilities는 administrator로 관리자인 것을 확인할 수 있다.
3.1.3 wp_capability
해당 컬럼은 직렬화가 되어 저장되어 있으므로 해석하면
a:1 -> 배열(array)을 뜻하며 길이가 1 임을 나타냄
s:13 -> 문자열(string)을 뜻하며 길이가 13 임을 나타냄
b:1 -> bool값 true를 나타냄
즉, 'administrator' => true 관리자 계정인 것을 알 수 있다.
3.2 CODE
사실 CVE-2023-3460전에 CVE-2020-36155가 먼저 존재했다.
CVE-2020-36155는 2.1.12 이전 버전에서 발생한다.
register 페이지에서 입력된 데이터로 데이터베이스의 값을 업데이트하며, 이 과정에서 별도의 필터링을 하지 않아 공격자가 임의의 메타 키를 삽입해 관리자 권한을 얻을 수 있었다.
즉, 회원가입 시 wp_capabilities[administrator]=1로 메타데이터를 업데이트해 주면 관리자 권한을 얻을 수 있었다.
이러한 문제점이 발생해 register 과정에서 필터링이 추가되었지만 해당 필터링이 우회되며 CVE-2023-3460 취약점이 발생되었다.
추가된 필터링은 is_metakey_banned 함수이며 블랙리스트 기반 필터링으로 취약점이 발생했다.
$this->banned_keys = array(
'metabox',
'postbox',
'meta-box',
'dismissed_wp_pointers',
'session_tokens',
'screen_layout',
$wpdb->get_blog_prefix() . 'user-',
'dismissed',
'cap_key',
$wpdb->get_blog_prefix() . 'capabilities',
'managenav',
'nav_menu',
'user_activation_key',
'level_',
$wpdb->get_blog_prefix() . 'user_level',
);
public function is_metakey_banned( $meta_key )
{
$is_banned = false;
foreach ( $this->banned_keys as $ban ) {
if ( is_numeric( $meta_key ) || false !== stripos( $meta_key, $ban ) ) {
$is_banned = true;
break;
}
}
return $is_banned;
}
워드프레스에서는 일부 악센트 문자를 기본 문자로 인식하여 악센트 문자를 섞어 보낼 경우 is_metakey_banned함수가 필터링하지 못하여 관리자 권한을 얻을 수 있는 공격을 할 수 있다.
4. POC
회원가입을 진행하고 해당 패킷을 잡아준다.
그 후, wp_càpabilities[administrator]=1을 추가해 보내주면
관리자 권한을 가진 계정이 추가된 걸 확인할 수 있다.
'One-day 취약점 분석' 카테고리의 다른 글
[CVE-2023-4596] One-day 취약점 분석 (0) | 2024.12.07 |
---|---|
[CVE-2024-8236] One-day 취약점 분석 (0) | 2024.12.03 |
[CVE-2024-38687] One-day 취약점 분석 (0) | 2024.11.23 |
[CVE-2023-4521] One-day 취약점 분석 (0) | 2024.11.08 |
[CVE-2023-4300] One-day 취약점 분석 (0) | 2024.11.05 |