
Este é um exploit de bypass de filtro que resulta em upload arbitrário de arquivos e execução remota de código no class.upload.php <= 2.0.4
Este é um exploit de bypass de filtro que resulta em upload arbitrário de arquivos e execução remota de código. O script class.upload.php filtra "arquivos e conteúdos perigosos" e os renomeia para a extensão de arquivo txt. Ele também faz diferentes tipos de transformação na imagem enviada, o que normalmente destruiria qualquer payload injetado, mesmo que o filtro de extensão de arquivo pudesse ser contornado.
O filtro de extensão de arquivo é uma lista negra, portanto, sempre que uma nova extensão é introduzida (neste caso pht), ou alguma foi esquecida, um arquivo PHP pode ser enviado. O conteúdo ainda deve ser uma imagem válida, porém, e passará pelas funções imagecreatefromjpeg e similares. Para esse propósito, escrevi o script inject.php que essencialmente fará força bruta em diferentes imagens até encontrar uma onde o payload não seja destruído pelo processo realizado em class.upload.php. Isso nos dá efetivamente um upload arbitrário de arquivos e uma execução de código muito furtiva, pois ainda é uma imagem válida e será exibida como tal nas páginas onde foi enviada.
O script inject.php será reescrito em breve para se tornar uma ferramenta mais geral para esse tipo de ataque, mas por enquanto será incluído apenas como scripts individuais neste tipo de lançamento de CVE.
O script upload.php é o código de exemplo do github da verot.net. Achei que seria melhor demonstrar esta vulnerabilidade usando o próprio código de exemplo deles.
user@ayu:/var/www/html# php inject.php
-=Imagejpeg injector 1.8=-
[+] Obtendo imagem (100 X 100) de http://lorempixel.com/100/100/
[+] Pulando para o byte final
[+] Procurando ponto de injeção válido
[!] Solução temporária: se você obtiver um 'erro de análise recuperável' aqui, significa que provavelmente falhou
[+] Parece que funcionou!
[+] Arquivo resultante: image.jpg.pht
user@ayu:/var/www/html# curl -v -o - http://localhost/images/image_resized.phar?c=uname%20-a | grep -aPo "(Linux.*GNU)"
Linux ayu 5.0.0-36-generic #39-Ubuntu SMP Tue Nov 12 09:46:06 UTC 2019 x86_64 x86_64 x86_64 GNU