
Il s'agit d'un exploit de contournement de filtre permettant le téléversement arbitraire de fichiers et l'exécution de code à distance dans class.upload.php <= 2.0.3
Il s'agit d'une exploitation par contournement du filtre qui aboutit à un téléversement arbitraire de fichier et à une exécution de code à distance. Le script class.upload.php filtre les « fichiers et contenus dangereux » et les renomme avec l'extension de fichier txt. Il applique également différents types de transformations sur l'image téléversée, ce qui détruirait normalement toute charge utile injectée, même si le filtre d'extension de fichier pouvait être contourné.
Le filtre d'extension de fichier est une liste noire, donc dès qu'une nouvelle extension est introduite (dans ce cas phar), ou que l'une d'elles a été oubliée, un fichier PHP peut être téléversé. Le contenu doit néanmoins rester une image valide et passera toujours par les fonctions imagecreatefromjpeg et similaires. Dans ce but, j'ai écrit le script inject.php qui va essentiellement forcer par essais successifs son chemin à travers différentes images jusqu'à ce qu'il en trouve une où la charge utile ne sera pas détruite par le processus effectué dans class.upload.php. Cela nous donne en pratique un téléversement arbitraire de fichier et une exécution de code très furtive, puisque le fichier reste une image valide et s'affichera comme telle sur les pages où il est téléversé.
Le script upload.php est le code d'exemple provenant du github de verot.net. J'ai pensé qu'il serait préférable de démontrer cette vulnérabilité en utilisant leur propre code d'exemple.
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
Téléversement arbitraire de fichier conduisant à une exécution de code à distance dans JoomlaWorks K2 <= 2.10.1 en raison d'une version non corrigée de class.upload.php
Un utilisateur classique téléverse l'image générée par inject.php, contenant une charge utile simple. Elle contournera le filtre d'extension de class.upload.php et ne sera pas détruite par le traitement d'image effectué dans la bibliothèque. Elle s'affichera comme une image classique, ce qui est plus discret.
Le fichier sera téléversé et pourra être utilisé comme porte dérobée pour exécuter des commandes.