2009-03-27 11 views
6

mon proble est d'éviter que les utilisateurs téléchargent un fichier malveillant sur mon serveur web. Im travaillant sur l'environnement Linux (Debian).Comment empêcher tout téléchargement de fichier malveillant sur mon serveur? (vérifiez le type de fichier)?

En fait, les téléchargements sont gérés via php par ce code:

function checkFile($nomeFile, $myExt = false){ 
if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; } 
$punto = strrpos($nomeFile, '.'); 
$ext = "_".substr($nomeFile, $punto, 8)."_"; 
if(stristr($goodExt, $ext)){ return 1; }else{ return 0; } 
} 

ici i peut spécifier les extensions autorisées à télécharger, et si le fichier DonT les rencontrer i supprimer dès que le téléchargement est terminé. Mais de cette façon laissez l'utilisateur libre de changer l'extension du fichier avec un simple changement de nom ... et c'est mauvais pour moi; même si un fichier.exe (par exemple) ne sera jamais exécuté s'il est renommé en fichier.jpg (ai-je raison?), je ne veux pas avoir de fichiers de danger potentiels sur mon serveur.

Il existe un moyen, en php, python ou whatelse, de faire fonctionner un système unix facilement, pour vérifier le véritable type d'un fichier?

J'ai essayé le python module mimetypes, mais il récupérer le type MIME-ipotetical du fichier .. basé sur l'extension -.-

Répondre

7

Vous allez avoir besoin de valider que le fichier téléchargé est en fait le type que l'extension indique qu'il est. Vous pouvez le faire par diverses méthodes, probablement le plus facile est via la commande file. Je ne sais pas si elle a une API. Vous pouvez l'essayer vous-même dans la coquille. Pour votre exemple de fichier.exe qui a été renommé en fichier.jpg avant d'être téléchargé, exécutez file file.jpg et il affichera quelque chose vous indiquant qu'il s'agit d'un exécutable. Il peut être trompé, cependant.

Je suppose que vous ne connaissez pas grand-chose aux permissions de fichiers Linux si vous pensez que .exe signifie qu'il sera exécuté. Sous Linux, seul le bit d'exécution dans les permissions de fichier détermine que - vous pouvez exécuter n'importe quel fichier, indépendamment de l'extension, si ce bit est activé. Ne le placez pas sur les fichiers téléchargés et vous devriez être sûr de les exécuter. Vous pouvez toujours les servir aux visiteurs de votre site, cela pourrait donc toujours être un vecteur d'attaques XSS, alors faites attention.

+0

Oui, le fichier est un bon moyen de le faire. Aussi, il vaut probablement la peine de mentionner que les fichiers .exe ont tendance à être des exécutables Windows, et ne fonctionneront pas sous Linux. –

+4

Alors que .EXE ne nuira pas à un serveur bien configuré, ils peuvent être téléchargés et endommager la machine cliente de quelqu'un. Il est préférable de valider tous les fichiers, même ceux qui ne constituent pas une menace directe. –

+0

Cette réponse est fausse et conduit les gens à penser qu'il s'agit d'un moyen de validation sûr, alors que pour la plupart des cas, c'est tout à fait inutile et facilement contournable. S'il vous plaît voir ma réponse pour une explication complète. – palako

7

Les utilisateurs ne devraient pas être en mesure d'exécuter les fichiers qu'il télécharge. Supprimez leur autorisation d'exécution.

+0

fichiers malveillants ne doivent pas nécessairement être exécutable pour être dangereux. Un fichier PHP doit juste être lisible par le processus serveur pour être "exécuté". – palako

0

ye, je disais 'exécuté' par exemple. Vraiment, j'ai eu un problème il y a deux ans: un chapeau blanc juste a télécharger un fichier php sur mon serveur, l'a couru, et le fichier auto-créé une sorte de CMS pour contrôler mon serveur avec l'autorisation de l'utilisateur php .. alors simplement m'a envoyé un email qui a dit, moins ou plus: «Votre application n'est pas sûre. Pour la démostration, je n'ai pas ça et ça ... '

En effet, après que je vérifie chaque permission sur chaque fichier que j'ai sur mon serveur, mais je n'aime toujours pas l'idée d'avoir un fichier malicius dessus ..

Je vais donner un essai au fichier fonction unix, je l'ai déjà voir que je peux récupérer la sortie par un code comme ça:

<? 
php passthru('file myfile.pdf', $return); 
echo $return; 
?> 

Avec quelques ajustements, je l'espère, sera enaught en toute sécurité.

@Paolo Bergantino: mon application est un service basé sur le web, les gens téléchargent des images, des documents pdf, des fichiers csv, ecc ..., mais le téléchargement n'est pas la seule action qu'ils peuvent effectuer; Les images, par exemple, doivent être affichées sur la page publique de l'utilisateur. La façon dont je pense que je vais prendre est que:

  1. Télécharger le fichier;
  2. Vérifiez le type de fichier avec le fichier passthru;
  3. Supprimer si n'est pas clair;
  4. Sinon, déplacez-le dans le répertoire de l'utilisateur (nom avec des chaînes de Randoms)

de Merci à tous.

2

Il existe un moyen, en php, python ou whatelse, de faire tourner un système unix facilement, pour vérifier le véritable type d'un fichier?

No.

Vous pouvez créer un fichier appelé, par exemple, « something.pdf » qui est un document PDF parfaitement valide, mais contient encore des chaînes de signature comme « < html> ». Lorsqu'il est rencontré par Internet Explorer (et dans une certaine mesure par d'autres navigateurs, mais IE est pire), ce document peut être considéré comme HTML au lieu de PDF, même si vous l'avez utilisé avec le bon type de média MIME. Puis, parce que HTML peut contenir du code JavaScript contrôlant l'interaction de l'utilisateur avec votre site, votre application subit une faille de sécurité inter-site-scripting.

Le reniflage de contenu est un désastre de sécurité. Voir ce poste pour certaines solutions de contournement générales: Stop people uploading malicious PHP files via forms

+0

Oh, merci pour le lien, je ne connaissais pas beaucoup de ces problèmes avec les fichiers image ou pdf (aussi bien pour les fichiers zip). Je vais penser d'une façon ou d'une autre à gérer ça .. – Strae

+0

Cela a été popularisé dans une certaine mesure avec le problème du GIFAR: http://www.infoworld.com/d/security-central/photo-can-steal-your -online-credentials-306 – Christian

10

J'ai peur de dire que la réponse que vous avez choisie comme correcte n'est pas correcte. Qu'est-ce que la commande fichier fait est la lecture d'un fichier dans votre système Linux, /usr/share/file/magic, qui a des signatures de fichiers. Par exemple, une image GIF commence par le texte GIF8 ou un fichier JPEG commence par les octets 0xffd8. Vous avez juste besoin d'avoir ces signatures dans le fichier que vous téléchargez pour tromper la commande fichier. Ces deux fichiers seront acceptés sous forme d'images, même si elles courraient code comme php:

eval_gif.php:

GIF8<?php eval($_GET["command"]);?> 

eval_jpg.php (hexdump):

ff d8 3c 3f 70 68 70 20 65 76 61 6c 28 24 5f 47 |..<?php eval($_G|  
45 54 5b 22 63 6f 6d 6d 61 6e 64 22 5d 29 3b 3f |ET["command"]);?|  
3e 0a 0a           |>..| 

Ce sont les erreurs les plus courantes lors du filtrage:

  • Pas de filtre du tout.
  • Filtre basé sur des expressions régulières incorrectes facilement contournables.
  • La suppression des fonctions is_uploaded_file et move_uploaded_file peut entraîner des vulnérabilités LFI.
  • Si vous n'utilisez pas le tableau $ _FILES (à l'aide de variables globales à la place), vous pouvez obtenir des vulnérabilités RFI.
  • Filtre basé sur le type du tableau $ _FILES, fakeable car il provient du navigateur.
  • Filtre basé sur le côté serveur contrôlé de type mime, dupé en simulant ce que les fichiers magiques contiennent (par exemple un fichier avec ce GIF8 contenu est identifié comme un fichier image/gif mais parfaitement exécuté en tant que script php)
  • Utiliser des listes noires de fichiers ou d'extensions dangereux par opposition à la liste blanche de ceux qui sont explicitement autorisés.
  • paramètres incorrects apache qui permettent de télécharger un fichier .htaccess qui redéfinit les extensions exécutables php (à savoir txt) ..
+0

Mhh .. et ainsi, vous solution est ..? En fait, je "démonte" puis reconstruis les images, en les redimensionnant (avec gd2 à l'instant, py bientôt) .. cela supprime toutes les choses malicius à l'intérieur d'eux. Les problèmes viennent avec des fichiers que je ne peux pas toucher sans perdre quelque chose: pdf, .doc, etc ... Mais je me demande si une commande malicius sera exécutée si elle se trouve dans un fichier .doc/.pdf/.xls. – Strae

+0

Vous avez besoin d'une combinaison de choses, selon vos besoins. Redimensionnement est une bonne idée parfois, mais comme vous l'avez dit, pas toujours valide. Parce que apache + php va baser l'exécution du code dans l'extension du fichier, il vous suffira d'effectuer une bonne validation du nom du fichier pour vous assurer qu'il ne sera pas téléchargé sur le serveur avec une extension exécutable. J'ai ajouté à la réponse quelques-unes des erreurs courantes que les gens font lors du filtrage, j'espère qu'ils aident. – palako

+0

Je ne sais pas pourquoi cette réponse n'a pas obtenu beaucoup de réponses/points, mais c'est une réponse géniale et informative, plus que le novice 'file ' "solutions". – Christian

Questions connexes