web-dev-qa-db-fra.com

Comment détecter si un fichier avec une extension .png contient du code ou une image?

Je me trouvais dans une situation difficile depuis quelques jours depuis que mon hébergeur a été piraté pour POST sur des fichiers PHP. J'ai eu affaire à des fichiers d'extension .png contenant le code PHP. Je ne peux même pas essayer d'éditer un par un pour vérifier s'il s'agit d'un fichier .png valide ou non.

Est-il possible de vérifier en masse si un fichier avec un .png est réel ou faux?

5
fiskolin

Je me trouvais dans une situation difficile depuis quelques jours depuis que mon hébergeur a été piraté pour POST sur des fichiers PHP. J'ai eu affaire à des fichiers d'extension .png contenant du code PHP.

C'est pourquoi la vérification des erreurs doit être implémentée dans votre script de téléchargement. Ainsi, vous pouvez tester le fichier téléchargé pour vous assurer que les données sont valides. Si les données ne sont pas valides, supprimez le fichier et affichez une page Web d'erreur.

Je ne peux même pas essayer d'éditer un par un pour vérifier si c'est un fichier .png valide ou non. Est-il possible de vérifier en masse si un fichier avec un fichier .png est réel ou faux?

Vous pouvez créer un script qui ouvre chaque fichier téléchargé et vérifier les quelques premiers octets pour vous assurer que le fichier est valide, mais cette étape est inutile dans le futur si vous décidez d'ajouter une validation de fichier à votre script de téléchargement, comme décrit ci-dessus.

En outre, comme l’a déclaré quelqu'un dans les commentaires, pour au moins une certaine protection contre l'exécution de script, définissez le répertoire de téléchargement comme un répertoire dans lequel le bit d'exécution n'est pas défini. Assurez-vous également que le dossier ne soit pas accessible au grand public afin de pouvoir valider les fichiers et de les rendre acceptables pour le public une fois que vous les aurez validés.

2
Mike

Est-il possible de vérifier en masse si un fichier avec un fichier .png est réel ou faux?

Non, pas vraiment.

Parce que cela a été suggéré dans une réponse et dans des commentaires: Vérifier les X premiers octets d’un fichier n’est pas un moyen approprié de déterminer s’il contient du code PHP ou non (qu’en est-il du contenu après le premier X octets?).

De plus, le code PHP peut être masqué dans des métadonnées ou des fragments IDAT, ce qui signifie que vous pouvez avoir un fichier image totalement valide, qui contient également le code PHP.

Il est extrêmement difficile de vérifier si une image contient d'autres données nuisibles ou non.

Donc ce que vous voulez faire c'est:

  • vérifier l'extension. S'il s'agit de png, il ne sera pas exécuté (sauf si vous autorisez également le téléchargement de fichiers htaccess ou si vous avez une vulnérabilité de LFI)
  • stocker le fichier en dehors de la racine Web (là encore, il ne peut pas être exécuté, sauf via LFI)
  • interdire l'exécution dans ce répertoire (encore une fois, peut être contourné via LFI)
  • supprime toutes les métadonnées de l'image (ce qui supprimera le code PHP dans les métadonnées)
  • transformer l'image en un format différent (ce qui détruira le code PHP dans les morceaux IDAT ou des méthodes similaires)
  • comme @ mani , vous pouvez rechercher dans le fichier téléchargé l'ouverture de balises PHP. Vous voulez certainement rechercher <?php, <?= et <script (insensible à la casse). En outre, vous pouvez rechercher <? (si les balises courtes sont autorisées) et <% (dans le cas où les balises asp sont autorisées). Cela devrait prendre en charge le code PHP, mais pas le contenu potentiellement dangereux.
2
tim

De nos jours, dans la plupart des hébergements, pour des raisons de sécurité, ils ont désactivé les balises courtes "<?".

Donc, vous pouvez grep/strstr pour "<?php" dans le fichier téléchargé. Si une correspondance est trouvée, supprimez simplement le fichier.

Nous suivons cela depuis longtemps et cela semble fonctionner très bien.

2
Mani