Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2012, 15h31   #1
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 14
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations forums :
Inscription : septembre 2011
Messages : 14
Points : 1
Points : 1
Par défaut Upload d'images et sécurité

Bonjour,

Une grande question me tarabuste. Voila en préambule le cheminement qui m'y a amené, puis la question:

Me renseignant sur les possibles failles dont un internaute malveillant disposerait, j'ai eu pas mal de renseignements très utiles.
Cependant, je sais aussi par expérience qu'un fichier image peut très bien renfermer un script malveillant et même en PHP... fâcheux, non?

Je suis tout de même capable, j’espère, de m'assurer que cette image uploadée chez moi ne contienne pas de tels scripts. Mais c'est là que vient cette fameuse question qui concernerait ceux qui ne font pas cette vérification:

Si aucun vérification n'est faite et que le nom de l'image correspond au schéma d'un chemin de fichier, n'y a t'il pas un énorme risque?

Considérons le scenario suivant
- je suis X, novice en sécurité, je ne connais pas le regex, je ne suis même pas au courant qu'un fichier image peut être malveillant, je conserve le nom initial de l'image, je stocke ça un peu n'importe comment et je n'ai jamais entendu parlé de Rewrite...

- je suis Y, un internaute malveillant. je sais pertinemment qu'on ne peut pas mettre de slash dans un nom de fichier. Par contre je sais aussi qu'on peut très bien remplacer le slash par " urldecode('%2F') " je viens de faire le test. Je tombe sur un site d'amateur en PHP où il y a quand même pas mal d'inscrits. Plutôt que de commencer par une attaque XSS ou une injection, j'ai déjà un script tout fait dans un fichier. Je regarde la source de la page et je vois le lien de l'image du site "<img src="dossier_untel/dossier_image/monlogo.gif". je regarde un peu le profil de monsieur pierrepauljacques et je découvre que les images sont stockées dans "/dossier_user/images/pierrepauljacques.gif".

D’après vous, si Y décide d'uploader une image nommée:
"str_replace('+','',"..+urlencode('%2F')..+urlencode('%2F')+dossier_untel urlencode('%2F')+dossier_image+urlencode('%2F')+monlogo.gif")"
pourrait elle remplacer le logo initial du site par son script malveillant?

Avec mon code tout pourri, peut-être pas, mais n'est ce pas encore une faille possible pour un expert en la matière?
viddaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 15h42   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 808
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 808
Points : 35 786
Points : 35 786
Où as-tu vu que c'est l'utilisateur qui décide où l'image sera uploadée sur le serveur ?
Les fichiers uploadés sont stockés dans un répertoire provisoire pour permettre de faire les vérifications nécessaires dessus.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 17h12   #3
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 14
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations forums :
Inscription : septembre 2011
Messages : 14
Points : 1
Points : 1
Ce que je sais à coup sûr, c'est que l'image est traitée puis placée dans le dossier prévu par le script.
Le nom de l'image envoyée est, me semble t'il, affecté dans le tableau $_FILE à la clé [name].
Pour rappel, X est un novice qui n'est pas au fait de tout ça

si l'on garde ce nom, ça donnera "../../dossier_untel/dossier_image/monlogo.gif" sauf erreur de ma part... les url_decode étant interprétés puisque stockés dans une variable...

alors quel chemin pour le déplacement du fichier quand X voudra le mettre dans le bon dossier?

dossier_user/images/../../dossier_untel/dossier_image/monlogo.gif

Voila le risque dont je parle.
Je ne fais que poser une question. Je ne suis qu'un codeur du dimanche, certes, mais de deux choses l'une: soit ma question est pertinente et mériterait de s'y pencher avec un peu d’intérêt, soit elle est stupide mais dans ce cas je préférerais qu'on m'explique pourquoi sans dénigrer une personne qui se pose des questions


PS: une faute d’étourderie dans mon premier post, j'ai mis urlencode eu lieu de decode, mais vous aurez corrigé de vous même :p
viddaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 19h15   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
Envoyé par viddaa
... soit elle est stupide mais dans ce cas je préférerais qu'on m'explique pourquoi sans dénigrer une personne qui se pose des questions
La question n'est pas stupide, mais de ton coté tu dénigres aussi quelque peu la réponse qui t'a été donnée.
Elle est courte, mais pertinente.
Si tu avais fait des essais tu aurais vu et compris pourquoi cette réponse.

Citation:
si l'on garde ce nom, ça donnera "../../dossier_untel/dossier_image/monlogo.gif" sauf erreur de ma part
C'est là où y a erreur justement.
La seule info obtenue sera dans cet exemple : monlogo.gif (c'est tout)
Et pas ../../dossier_untel/dossier_image, c'est toi qui imagine que ...


Comme ça été dit, ce n'est pas l'utilisateur qui décide où sera déposé l'image ou le fichier, mais le codeur (débutant ou pas peu importe).

Le fichier uploadé est déposé dans un répertoire temporaire avec un nom temporaire $_FILES['image']['tmp_name'].
Ce répertoire est défini dans le php.ini, en aucun cas cette info vient de l'utilisateur.

On a aussi son nom d'origine $_FILES['image']['name'].

Ces noms (temporaire et original) ne sont que des noms, et non pas des chemins.
Nulle part il y a une info concernant un éventuel chemin défini par l'utilisateur comme tu le décrit dans ton scénario.
Suffit pour de faire un print_r($_FILES['image']) pour le vérifier.

Une fois uploadé dans ce répertoire temporaire, c'est le codeur qui indiquera un chemin (son chemin, un chemin lié au disque de son serveur) où déposer/déplacer cette image avec la fonction move_uploaded_file().


Qu'il soit possible de se faire pirater lors d'un traitement d'upload, oui, le risque 0 n'existe pas de toute manière, mais le scénario que tu montre me parais impossible (concernant les chemins j'entends).

Par contre, pour ce qui est du contenu du fichier (de la soit disant image), il est vrai que peu de précautions sont prises à ce niveau.
Vérifier le contenu uploadé est un mécanisme très certainement complexe et lourd à la fois.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 21h48   #5
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 14
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations forums :
Inscription : septembre 2011
Messages : 14
Points : 1
Points : 1
Et bien voila une explication qui me laisse tout con, oui maintenant que tu m'expliques comme ça, je me sentirais presque ridicule

En tout cas ça me rassure, ça fera déjà ça en moins...

merci ^^
viddaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h35.


 
 
 
 
Partenaires

Hébergement Web