
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.3
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údo perigosos" e os renomeia para a extensão de arquivo txt. Ele também realiza 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, phar), ou qualquer uma foi esquecida, um arquivo PHP pode ser enviado. No entanto, o conteúdo ainda deve ser uma imagem válida e ainda passará pelas funções imagecreatefromjpeg e similares. Para este fim, escrevi o script inject.php que essencialmente percorrerá diferentes imagens por força bruta até encontrar uma onde o payload não será destruído pelo processo realizado no class.upload.php. Isso efetivamente nos dá 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 for enviada.
O script upload.php é o código de exemplo do github do verot.net. Pensei 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.7=-
[+] Fetching image (100 X 100) from http://lorempixel.com/100/100/
[+] Jumping to end byte
[+] Searching for valid injection point
[!] Temp solution, if you get a 'recoverable parse error' here, it means it probably failed
[+] It seems like it worked!
[+] Result file: image.jpg.phar
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
Upload arbitrário de arquivos levando à execução remota de código em JoomlaWorks K2 <= 2.10.1 devido à versão não corrigida do class.upload.php
Um usuário comum envia a imagem gerada pelo inject.php, contendo um payload simples. Ela contornará o filtro de extensão no class.upload.php e não será destruída pelo tratamento de imagem realizado na biblioteca. Ela será renderizada como uma imagem normal, o que é mais sutil.
O arquivo será enviado e pode ser acessado como uma backdoor e executar comandos.