
CVE-2023-3460


Subscriber 역할을 가진 일반 사용자를 등록했고, mysql의 wp_usermeta 테이블을 살펴보면 wp_capabilities 값이 직렬화된 배열로 설정되어 있으며, 여기서 우리의 역할(이 경우 Subscriber)이 정의되는 것을 볼 수 있습니다.
wp_capabilities의 값을 어떻게 변경할 수 있을까요? 등록할 때 POST 요청에 wp_capabilities를 매개변수로 전달하면 됩니다. 다음과 같이 말이죠.
is_metakey_banned라는 함수가 있는데, 이 함수는 "cap_key", "wp_capabilities", "wp_user_level", "user_activation_key" 등 몇 가지 값을 확인합니다. 우리가 관심 있는 것은 wp_capabilities이지만, 요청 본문에 이 값을 포함하면 역할을 변경하지 못하도록 break를 만나게 됩니다.
à, è, ì, ò, ù, À, È, Ì, Ò, Ù 같은 악센트 문자를 허용한다는 것을 발견했습니다. 이제 요청 본문에 wp_càpabilities=administrator 같은 식으로 이 문자를 사용하면 어떻게 될까요? class-user.php의 182행에 있는 중단점에 도달하지 않으며 is_metakey_banned 함수를 우회할 수 있습니다.


a:1:{s:13:"administrator";b:1;} 같은 값이 필요합니다. 이제 그것을 시도해서 매개변수에 직접 전달해 봅시다.
wp_capabilities 값을 설정했지만 우리가 기대한 것은 아닙니다.
wp_capabilities를 살펴보면 직렬화된 배열이라는 것을 알 수 있습니다. 그것이 우리가 원하는 것입니다. WordPress에는 자체 직렬화가 있으므로 이를 사용하여 값을 배열로 전달할 수 있고 나머지는 WordPress가 처리합니다. 따라서 우리의 페이로드는 wp_càpabilities[administrator]=1처럼 보입니다.
wp_capabilities의 값이 a:1:{s:13:"administrator";s:1:"1";}로 변경된 것을 볼 수 있으며, 이제 관리자로 로그인할 수 있습니다.

Super AdminAdministratorEditorAuthorContributorContributorPages