
CVE-2023-3460


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 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.

Super AdminAdministratorEditorAuthorContributorContributorPagesbreak