
CVE-2023-3460

Super Admin, Administrator, Editor, Author, Contributor, Contributor. Então, como podemos obter privilégio de administrador? Bem, primeiro vamos ver como o plugin Ultimate Member funciona. Primeiro, você precisa configurar o plugin para funcionar corretamente, então precisamos criar algumas páginas na seção Pages, depois vinculamos essas páginas em Ultimate Member > Configurações. Depois disso, podemos criar novas funções ou apenas usar as funções padrão que o Ultimate Member oferece.
Subscriber e, se olharmos a tabela wp_usermeta no MySQL, podemos ver que o valor wp_capabilities está definido como um array serializado e a partir daí define nossa função, que neste caso é Subscriber.
wp_capabilities? Bem, podemos passar wp_capabilities como um parâmetro na requisição POST enquanto nos registramos, assim:
is_metakey_banned e a função funciona verificando alguns valores como "cap_key", "wp_capabilities", "wp_user_level", "user_activation_key" etc. O que nos interessa é wp_capabilities, mas se tivermos isso no corpo da nossa requisição, ele vai acionar o break ali para nos impedir de mudar nossa função.
à, è, ì, ò, ù, À, È, Ì, Ò, Ù. Então, se usarmos esses caracteres no corpo da requisição, algo como wp_càpabilities=administrator, o que acontecerá? Bem, ele não atinge o ponto de interrupção na linha 182 em class-user.php e podemos contornar a função is_metakey_banned.


a:1:{s:13:"administrator";b:1;}. Ok, agora vamos tentar e passar isso diretamente para o nosso parâmetro.
wp_capabilities, mas não era o que esperávamos.
wp_capabilities do admin, podemos ver que é um array serializado, é isso que queremos. Então, o WordPress tem sua própria serialização, então podemos usar isso para passar nosso valor como um array e o WordPress faz o resto para nós. Então, aqui está como nosso payload se parece: wp_càpabilities[administrator]=1.
wp_capabilities foi alterado para a:1:{s:13:"administrator";s:1:"1";}, que agora pode fazer login como admin.
