PHP Object Injection no Better Search Replace
Atenção: A técnica demonstrada neste artigo tem o propósito de ser um material educativo, a exploração foi feita em um ambiente controlado. Não realize esta exploração sem a autorização do dono do servidor, pois isto poderá resultar em um crime!
O Better Search Replace é um plugin que possui a função de fazer exatamente o que o nome dele sugere, ele busca uma string na sua base de dados do Wordpress e substitui por outra string que você forneceu.
Sinceramente não entendo porque é tão usado, segundo o Wordpress, existe mais de 1 milhão de instalações ativas.
Dentre suas funcionalidades, o plugin consegue realizar o processamento de objetos PHP serializados, então resolvi fazer Code Review deste plugin.
Depois de algum tempo na análise estática, encontrei o trecho de código abaixo, ele é responsável por realizar a deserialização. Achei interessante, logo comecei a análise dinâmica.
Infelizmente não encontrei um trecho de código que possibilitasse iniciar a POP Chain utilizando o próprio plugin (que por acaso tornaria a vulnerabilidade bem mais crítica) . Por sorte, o Wordpress permite que um plugin consiga acessar as classes ou funções que foram definidas em outros plugins, ou seja, não existe um “sandbox”. Consequentemente, isto abre a possibilidade de iniciar a POP Chain utilizando o código-fonte de outros plugins.
Para facilitar a minha vida, criei o plugin “WP Object Injection Proof of Concept”, este plugin possibilita o ataque de Reutilização de Código, me poupando tempo com POP Chains.
Ele se resume a nessa pequena classe com o método mágico “__wakeup”. Caso deseje reproduzir em um cenário mais aproximado da realidade, recomendo que veja o PHPGGC, pode te ajudar.
Meu objetivo neste momento é fazer download de uma webshell e conseguir a RCE desautenticado. O payload abaixo fará o download de um arquivo do pastebin usando o curl.
Agora só resta saber onde devemos realizar a injeção… que tal nos comentários?
O plugin permite que o usuário realize o processamento na tabela de comentários, isso é bem legal, pois podemos injetar o payload nos comentários e esperar a iteração do administrador no plugin Better Search Replace para disparar a substituição.
Como pode se observar na imagem acima, o administrador é notificado a respeito do comentário, logo, também será necessário contar a sorte.
Se o payload for interpretado com sucesso, o download de uma simples webshell será realizado no diretório “wp-admin”.
Voilà!, foi possível obter uma unauth RCE através de uma deserialização insegura do conteúdo nos comentários.