Les applications web qui facilitent le téléchargement de fichiers sont devenues essentielles pour de nombreuses organisations, agissant comme des portails permettant aux clients, aux partenaires et aux employés de partager divers types de documents et de fichiers. Par exemple, une société de ressources humaines peut permettre aux utilisateurs de télécharger des CV, ou une entreprise peut faciliter le partage de fichiers entre partenaires par le biais d'une plateforme web spécialisée.
Malgré des mesures de sécurité renforcées et des processus de validation plus stricts, les attaquants continuent d'exploiter les vulnérabilités à l'aide de méthodes sophistiquées. Des fichiers d'apparence anodine, comme des images, peuvent être manipulés pour compromettre la sécurité d'un serveur web.
Les fichiers polyglottes sont des fichiers qui peuvent être valides en tant que plusieurs types simultanément, ce qui permet aux attaquants de contourner les mesures de sécurité basées sur le type de fichier. Parmi les exemples, citons GIFAR, qui fonctionne à la fois comme un fichier GIF et RAR, les polyglottes JavaScript/JPEG qui sont interprétés à la fois comme JavaScript et JPEG, et les fichiers Phar-JPEG, reconnus à la fois comme une archive Phar et une image JPEG. Ces fichiers polyglottes peuvent passer inaperçus grâce à des extensions trompeuses ou vides qui "trompent" les systèmes en leur faisant croire qu'il s'agit d'un type de fichier inoffensif (comme une image ou un PDF) alors qu'ils contiennent un code malveillant non détecté.
Validation du téléchargement de fichiers
Permettre aux utilisateurs de télécharger des fichiers sans validation appropriée ou complète constitue une menace importante pour les applications web. Si un pirate réussit à télécharger un fichier malveillant, tel qu'un shell web, il peut potentiellement prendre le contrôle du serveur, compromettant ainsi à la fois le système et les données sensibles. Pour atténuer ces risques, des meilleures pratiques ont été établies pour guider les développeurs dans l'application de mesures de validation efficaces. Ces pratiques permettent de garantir un traitement sécurisé des téléchargements de fichiers, réduisant ainsi le risque d'exploitation.
Les principaux domaines d'intervention pour sécuriser les téléchargements de fichiers sont les suivants :
- Validation des extensions : Mettre en place une liste de blocage ou une liste d'autorisation des extensions de fichiers pour s'assurer que seuls les types de fichiers autorisés sont acceptés.
- Assainissement des noms de fichiers : Générer des chaînes aléatoires pour les noms de fichiers lors du téléchargement.
- Validation du type de contenu : Vérifier le type MIME du fichier téléchargé pour s'assurer qu'il correspond au format attendu.
- Validation de l'en-tête de l'image : Pour les téléchargements d'images, des fonctions telles que getimagesize() en PHP peuvent être utilisées pour confirmer la validité du fichier en vérifiant son en-tête.
Contournement du filtre de téléchargement de fichiers
Malgré la mise en œuvre de ces mesures de protection, les attaquants perfectionnent sans cesse leurs méthodes pour contourner les mécanismes de validation. Des techniques telles que l'injection de caractères nuls, les extensions doubles et les extensions vides peuvent compromettre la validation de l'extension : un fichier peut apparaître avec un nom tel que "file.php.jpg", "file.php%00.jpg", "file.PhP" ou "file.php/" pour échapper à la détection. La validation du type MIME peut être contournée en modifiant les octets magiques initiaux du fichier, par exemple en les remplaçant par GIF89a, l'en-tête associé aux fichiers GIF, ce qui peut inciter le système à identifier le fichier comme un format légitime. En outre, un fichier .htaccess malveillant peut être téléchargé pour manipuler les configurations du serveur, permettant l'exécution de fichiers avec des extensions non autorisées.
Attaques de fichiers polyglottes
Même avec la mise en œuvre de processus de validation rigoureux combinant de multiples mesures de sécurité pour empêcher la technique de contournement du filtre de téléchargement de fichiers, les attaques sophistiquées ciblant les fichiers polyglottes, ou les images polyglottes, restent une menace importante pour la sécurité. Cette méthode permet aux attaquants de créer des fichiers - tels que des images - qui se conforment à la structure binaire attendue pour les fichiers images, mais qui peuvent simultanément exécuter un code malveillant lorsqu'ils sont interprétés dans un contexte différent. La double nature de ces fichiers leur permet de contourner les mécanismes de validation traditionnels et d'exploiter les vulnérabilités dans des scénarios spécifiques.
Fichier polyglotte simple avec ExifTool
Une technique simple pour générer une image polyglotte consiste à utiliser ExifTool. Cette puissante application est conçue pour lire, écrire et modifier divers formats de métadonnées, tels que EXIF, XMP, JFIF et Photoshop IRB. Cependant, des personnes malveillantes peuvent profiter d'ExifTool pour exécuter des actions nuisibles, y compris la création d'une image polyglotte avec des intentions malveillantes. En utilisant ExifTool pour intégrer un code malveillant dans les métadonnées EXIF d'une image - en particulier dans des champs tels que UserComment et ImageDescription - les attaquants peuvent générer une image polyglotte et augmenter leurs chances d'exploitation réussie.
La section suivante présente les métadonnées EXIF de l'image, qui fournissent des informations complètes sur celle-ci.
En utilisant ExifTool, un acteur de la menace peut intégrer un code malveillant dans les métadonnées EXIF d'une image, créant ainsi un fichier polyglotte qui peut contourner les mécanismes de validation.
Bien que la validation du type MIME puisse restreindre le téléchargement de fichiers shell de base, cette image polyglotte peut contourner ces restrictions, ce qui permet à un attaquant de télécharger un shell web polyglotte.
L'attaquant peut ensuite exploiter le shell web polyglotte pour prendre le contrôle du serveur web.
Fichier polyglotte Javascript/JPEG
Un fichier polyglotte JavaScript/JPEG est structuré de manière à être valide à la fois en tant qu'image JPEG et en tant que script JavaScript. Pour y parvenir, un acteur malveillant doit avoir une connaissance approfondie de la structure interne d'un fichier JPEG. Cette connaissance permet d'intégrer avec précision des données binaires malveillantes dans l'image, ce qui garantit qu'elle peut être traitée par un moteur JavaScript sans affecter sa validité en tant qu'image JPEG.
Une image JPEG a la structure suivante :
Octets | Nom |
0xFF, 0xD8 | Début de l'image |
0xFF, 0xE0, 0x00, 0x10, ... | En-tête par défaut |
0XFF, 0XFE, ... | Commentaire sur l'image |
0xFF, 0xDB, ... | Table de quantification |
0xFF, 0xC0, ... | Début du cadre |
0xFF, 0xC4, ... | Tableau de Huffman |
0xFF, 0xDA, ... | Début de l'analyse |
0xFF, 0xD9 | Fin de l'image |
Format JPEG - source : https://github.com/corkami/formats/blob/master/image/JPEGRGB_dissected.png
Dans une structure d'image JPEG, l'en-tête est suivi d'informations sur la longueur. Comme le montre l'exemple précédent, l'en-tête commence par la séquence 0xFF 0xE0 0x00 0x10, où 0x00 0x10 représente spécifiquement la longueur du segment, soit 16 octets. Le marqueur 0xFF 0xD9 marque la fin de l'image.
Pour créer un fichier polyglotte JavaScript/JPEG, il est nécessaire de modifier les valeurs hexadécimales de l'image afin que le moteur JavaScript puisse les reconnaître et les traiter.
Tout d'abord, en JavaScript, la séquence 0xFF 0xD8 0xFF 0xE0 peut être interprétée comme des valeurs non ASCII, mais 0x00 0x10 est invalide et doit être modifiée. Le remplacement approprié de ces valeurs hexagonales est 0x2F 0x2A, qui est la représentation hexadécimale de /*, une syntaxe utilisée pour ouvrir un commentaire en JavaScript. Cette substitution permet d'ignorer les données binaires restantes dans le cadre du commentaire.
Cependant, comme 0x00 0x10 représente à l'origine la longueur de l'en-tête JPEG, sa modification en 0x2F 0x2A, qui équivaut à 12074 en décimal, nécessite une redéfinition de l'en-tête JPEG afin de maintenir sa validité. Pour ce faire, des octets nuls doivent être ajoutés et la charge utile JavaScript doit être placée après le marqueur 0xFF 0xFE, qui indique un commentaire d'image dans la structure JPEG.
Par exemple, si la charge utile est */=alert(document.domain);/*, qui a une longueur de 28 octets, les octets nuls nécessaires seront calculés comme suit : 12074 (nouvelle longueur) - 16 (longueur de l'en-tête original) - 2 (pour le marqueur 0xFF 0xFE ) - 28 (longueur de la charge utile) = 12 028 octets nuls.
Par conséquent, le code JavaScript contenu dans l'image JPEG ressemblerait à ce qui suit :
Enfin, la séquence 0x2A 0x2F 0x2F 0x2F (correspondant à *///) doit être placée juste avant le marqueur de fin JPEG 0xFF 0xD9. Cette étape ferme le commentaire JavaScript et garantit que la charge utile est correctement exécutée sans perturber la structure du fichier JPEG.
Après cette modification, l'image peut toujours être interprétée comme une image valide tout en contenant du code JavaScript exécutable.
Lorsqu'un fichier HTML charge cette image en tant que code source JavaScript, il reste valide et peut exécuter le code JavaScript intégré :
Les fichiers images polyglottes présentent des risques non seulement pour l'exploitation côté client, mais aussi pour les attaques côté serveur dans des circonstances particulières. Le fichier polyglotte Phar/JPEG, qui peut être interprété à la fois comme une archive PHP (Phar) et comme une image JPEG, en est un exemple. La structure du fichier Phar permet d'intégrer des données sérialisées dans les métadonnées, ce qui présente un risque potentiel de vulnérabilités liées à la désérialisation, en particulier dans certaines versions de PHP. Par conséquent, les fichiers polyglottes Phar/JPEG peuvent être utilisés pour contourner la validation du téléchargement de fichiers et exploiter les serveurs vulnérables.
Le format de fichier Phar se présente sous la forme stub/manifest/contents/signature, et stocke dans son manifeste les informations cruciales de ce qui est inclus dans l'archive Phar :
- Stub : Le stub est un morceau de code PHP qui est exécuté lorsque le fichier est accédé dans un contexte exécutable. Il n'y a pas de restrictions sur le contenu du stub, à l'exception du fait qu'il doit se terminer par __HALT_COMPILER() ;.
- Manifeste : Cette section contient des métadonnées sur l'archive et son contenu, qui peuvent inclure des métadonnées Phar sérialisées stockées dans le format serialize().
- Contenu des fichiers : Les fichiers originaux inclus dans l'archive.
- Signature (facultatif) : Contient des informations de signature pour la vérification de l'intégrité.
Étant donné que le stub n'impose aucune restriction de contenu au-delà de la stipulation de __HALT_COMPILER(), un acteur de la menace peut injecter les valeurs hexadécimales d'une image dans le stub. En plaçant ces valeurs au début du fichier PHAR, celui-ci peut être identifié comme une image valide. Par conséquent, un polyglot PHAR/JPEG peut être facilement construit en ajoutant les octets hexadécimaux d'une image JPEG au début, comme le montre l'exemple suivant :
Grâce à cette méthode, le fichier polyglotte généré fonctionne à la fois comme une image valide et un fichier PHAR légitime et peut donc être utilisé pour contourner certains mécanismes de validation de téléchargement de fichiers.
Bien que ce fichier polyglotte puisse contourner les filtres de téléchargement de fichiers, il n'est pas actuellement capable d'exploiter le serveur web. Pour réussir à exploiter et à compromettre un serveur web à l'aide d'un fichier PHAR ou d'un fichier polyglotte PHAR, il est essentiel d'injecter des métadonnées sérialisées malveillantes dans le manifeste du fichier.
Lorsque le fichier PHAR est accessible via le wrapper PHAR (phar://) dans certaines fonctions PHP (PHP ≤7.x) associées à des opérations sur les fichiers - telles que file(), file_exists(), file_get_contents(), fopen(), rename(), ou unlink() - la fonction unserialize() est déclenchée pour les métadonnées sérialisées. En fin de compte, en utilisant PHPGGC, un outil largement utilisé pour construire des chaînes de gadgets PHP, les acteurs de la menace peuvent exploiter la vulnérabilité de désérialisation via un fichier polyglotte PHAR, compromettant ainsi le serveur d'application web.
La combinaison des fichiers polyglottes PHAR/JPEG et des vulnérabilités de désérialisation permet aux attaquants d'infiltrer un serveur d'application web, même lorsque des filtres de téléchargement de fichiers sont mis en œuvre. Notamment, cette compromission peut se produire même pendant le traitement d'un fichier image.
En exploitant les fichiers polyglottes pour contourner les filtres de téléchargement de fichiers et en ajoutant l'enveloppe PHAR (phar://) à l'emplacement du fichier, les attaquants peuvent manipuler le serveur web pour qu'il traite le fichier comme une archive PHAR. Cette manipulation peut ensuite déclencher une vulnérabilité de désérialisation, conduisant à l'exécution de code à distance par le biais de fonctions d'exploitation de fichiers.
Pour illustrer les risques associés aux fichiers polyglottes dans votre application, nous avons simulé un environnement dans lequel l'application utilise des filtres de téléchargement de fichiers stricts pour empêcher le téléchargement de fichiers malveillants ou de shells web. Malgré ces mesures de protection, une image polyglotte peut contourner le processus de validation et, dans certains contextes, conduire à l'exécution de code à distance, compromettant ainsi le serveur d'application web vulnérable.
Cet exemple illustre une application web conventionnelle qui permet le partage de fichiers entre clients, partenaires et organisations :
MetaDefender Core et MetaDefender ICAP Server protège vos applications web contre ces menaces et renforce la sécurité de votre réseau et de votre infrastructure.
MetaDefender ICAP Server et MetaDefender Core travaillent ensemble pour protéger votre serveur web contre les attaques sophistiquées impliquant des fichiers polyglottes PHAR/JPEG malveillants de la manière suivante :
Lorsqu'un fichier polyglotte PHAR/JPEG est téléchargé vers l'application web, il est d'abord transmis à MetaDefender Core via MetaDefender ICAP Server pour un processus d'assainissement complet à l'aide de notre technologie Deep CDR ™. Contrairement aux simples vérificateurs de type de fichier, Deep CDR analyse en profondeur la structure du fichier téléchargé, supprimant les scripts, les macros et le contenu non conforme à la politique, reconstruisant le fichier JPEG pour qu'il ne contienne que les données nécessaires.
Ce processus supprime le contenu PHAR nuisible ajouté après le marqueur de fin JPEG(0xFF 0xD9), garantissant que le fichier assaini est strictement un JPEG. Par conséquent, l'application web est protégée contre les attaques polyglottes PHAR/JPEG ; même si un attaquant peut modifier le schéma de traitement des fichiers pour injecter un wrapper PHAR, il ne peut pas exploiter le serveur web.
Les organisations dotées d'une infrastructure de sécurité réseau bien établie - qu'elles utilisent des WAF (pare-feu d'application web), des proxies ou des contrôleurs d'entrée - peuvent désormais améliorer leurs mécanismes de défense grâce à MetaDefender ICAP Server .Cette solution crée une interface entre les serveurs web existants et MetaDefender Core , établissant un point de contrôle de sécurité transparent pour tous les fichiers entrants. Tout contenu acheminé via l'interface ICAP sera analysé et traité avant d'atteindre votre serveur web, ce qui garantit que seul un contenu sûr et légitime pénètre dans votre réseau et atteint les utilisateurs finaux.
Cette approche signifie que les organisations peuvent tirer parti de leurs investissements existants en matière de sécurité tout en ajoutant une couche de protection supplémentaire et puissante. Les organisations qui utilisent le contrôleur d'entrée NGINX peuvent intégrer MetaDefender ICAP Server à leur infrastructure existante via la configuration du proxy.
OPSWATva au-delà de la détection traditionnelle des menaces. Au lieu de simplement signaler les fichiers suspects, MetaDefender Core neutralise activement les menaces potentielles, transformant les fichiers dangereux en contenu sûr et utilisable. Lorsqu'il est intégré à votre serveur web, MetaDefender ICAP Server offre une protection complète contre les menaces de type "zero-day" et les attaques polyglottes.
La confiance dans les fichiers et les dispositifs est une priorité. Trust no device. ™", OPSWAT résout les défis des clients dans le monde entier grâce à des technologies brevetées à chaque niveau de votre infrastructure, en sécurisant vos réseaux, vos données et vos appareils, et en prévenant les menaces connues et inconnues, les attaques de type "zero-day" et les logiciels malveillants.