본문 바로가기
One-day 취약점 분석

[CVE-2023-3460] One-day 취약점 분석

by jh117jh 2024. 11. 14.
728x90

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 – 사용자 프로필, 회원가입, 로그인, 회원 디렉토리, 콘텐츠 제한 및 멤버십 플러그

사용자 프로필, 등록 및 로그인, 회원 디렉토리, 콘텐츠 제한, 사용자 역할 등이 포함된 멤버십 및 커뮤니티 플러그인입니다.

ko.wordpress.org

 

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을 추가해 보내주면 

 

 

 

관리자 권한을 가진 계정이 추가된 걸 확인할 수 있다.

728x90