IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload d'images et sécurité


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 19
    Points
    19
    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?

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    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

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    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.

    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]

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    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 ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/12/2005, 22h17
  2. Uploader une image à partir d'un formulaire ?
    Par netwebzone dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2005, 09h27
  3. [Upload] Upload d'image....
    Par tochbee dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2005, 11h44
  4. [Debutant] [JSP/Servlet] Upload d'image vers le serveur
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 05/07/2005, 17h42
  5. Upload d'images sur le forum
    Par KibitO dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 09/10/2004, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo