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 :

Protection contre le hacking sur mes upload


Sujet :

Langage PHP

  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Protection contre le hacking sur mes upload
    Bonjour,

    Dans le backoffice de mon site, il y a la possibilité d'uploader des images pour illustrer les pages du site.
    Le soucis c'est que des hackers réussissent à accéder à l'upload et téléchargent des images qui ne le sont pas en fait mais ce sont des PHP renommés en .gif ou en .jpg, ils connaissent le chemin où sont les fichiers uploadés et appellent juste donc la fausse image pour lancer le PHP.

    Comment vais-je me protéger? Je me demande même comment ils arrivent à exécuter ce fichier php renommé en jpg

  2. #2
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Au moment de l'upload tu vérifies comment le type de fichier ? par l'extension ?
    Si c'est le cas tu peux tester par le MIME TYPE du fichier uploadé.
    Tu as une fonction en PHP appelée finfo qui devrait pouvoir t'aider :
    http://fr.php.net/manual/fr/function.finfo-file.php
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  3. #3
    Lucas Panny
    Invité(e)
    Par défaut
    Oui c'est ça, je testais l'extension! Mais bon tester le contenu du fichier ralentirait aussi le site

    Je pense que je dois aussi chercher les moyens pour que le hacker ne puisse pas accéder au formulaire d'upload. Le soucis c'est qu'il faut s'authentifier pour ouvrir le formulaire mais pour l'upload il n'y en a pas puisque j'utilise un code tiers

  4. #4
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Tester le type MIME est plutôt rapide.... Je l'utilise sans voir de ralentissement (même si j'avoue que mon script n'est pas très long et mon traitement ne fait pas grand-chose)...
    De plus en testant le type MIME tu ne lis pas le fichier complet mais des informations que le fichier détient (un peu comme un header d'une requête HTTP pour simplifier)...
    Au pire essaye et si tu vois une perte de perf' trop importante reviens sur ta version précédente...
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275
    Par défaut
    tu n'as pas le choix faut tester le type MIME comme dit plus haut une extension de fichier n'a aucune valeur sure

  6. #6
    Lucas Panny
    Invité(e)
    Par défaut
    Le fond du problème n'est pas vraiment que le hacker upload un faux jpg ou gif mais qu'il accède au script d'upload sans s'authentifier

    L'authentification est gérée par une classe php qui crée une variable globale $GLOBAL["user"], or j'utilise un code tiers (ajaxfilemanager) pour l'upload d'image donc je me me demande comment peut-on l'utiliser dans ajax_file_upload.php de AjaxFileManager for TinyMCE???

  7. #7
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par Helfima Voir le message
    tu n'as pas le choix faut tester le type MIME comme dit plus haut une extension de fichier n'a aucune valeur sure
    Même ça, il y a déjà une technique pour le contourner par les hackers, de plus le plus drôle: http://www.phpclasses.org/blog/post/...IF-images.html

    Ce que je cherche aussi c'est comment interdire l'exécution de scripts dans un répertoire par htaccess ou autre?
    En effet, je suis victime du hack avec un upload d'un fichier "pic.php.gif", je ne comprends pas comme le hacker arrive à exécuter ce fichier moitié GIF moitié PHP

  8. #8
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    essaie de mettre les permissions sur ton fichier à 666 (c'est à dire en lecture/écriture mais pas en exécution) mais je ne suis pas sûr que ça fasse grand-chose...
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    Bonjour,
    téléchargent des images qui ne le sont pas en fait mais ce sont des PHP renommés en .gif ou en .jpg, ils connaissent le chemin où sont les fichiers uploadés et appellent juste donc la fausse image pour lancer le PHP.
    1) un fichier ne se terminant pas par .php ne devrai jamais être exécuté, sinon il y a un gros problème de réglage sur le serveur
    vérifier la liste des extensions exécutables

    2) test du type mime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    /**
    * @filesource image.gif.php
    * @author helfima
    * @version 1.0
    * Date 19 janv. 2011
    */
     
    Header('Content-Type: image/gif');
     
    $filename = 'test.txt';
    $somecontent = "Ajout de chaîne dans le fichier\n";
     
    $fp = fopen($filename, 'w');
    fwrite($fp, $somecontent);
    fclose($fp);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    /**
    * @filesource fileinfo.php
    * @author helfima
    * @version 1.0
    * Date 19 janv. 2011
    */
     
    $finfo = new finfo(FILEINFO_MIME); // Retourne le type mime
     
    if (!$finfo) {
        echo "Échec de l'ouverture de la base de données fileinfo";
        exit();
    }
     
    /* Récupère le mime-type d'un fichier spécifique */
    $filename='C:/portal/src/test/image.gif.php';
    if(file_exists($filename)){
    	echo $filename.' existe!<br>';
    }
    echo 'mime-type: '.$finfo->file($filename);
    resultat de fileinfo.php

    C:/portal/src/test/image.gif.php existe!
    mime-type: text/x-php; charset=iso-8859-1
    conclusion: le fichier retourne bien le bon type et ce quelque soit le code dedans par conséquent quand tu upload le fichier a toi de tester le type mime avant la copie dans un répertoire tant qu'il se trouve dans le temp du serveur comme cela fini le problème

    ps: si un hacker a déjà déposé des fichiers il faut
    bloquer ton site
    faire le ménage de fichier intrus
    changer tous les passwords

    voila j'en sais pas plus
    bon courrage

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 149
    Points : 206
    Points
    206
    Par défaut
    Salut, il faut que tu arrive a mettre un test de la fameuse variable $GLOBAL["user"] avant que l'upload ne commence.

    Tester le type mime, c'est bien aussi et te le conseil, mais ça n'empechera pas l'intrus d'uploader.

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 149
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Helfima Voir le message
    Aucun rapport... et puis register globals activé ou non, ça n'empèche pas d'utiliser le tableau GLOBALS et sa porté.

  13. #13
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par nextdev Voir le message
    Salut, il faut que tu arrive a mettre un test de la fameuse variable $GLOBAL["user"] avant que l'upload ne commence.

    Tester le type mime, c'est bien aussi et te le conseil, mais ça n'empechera pas l'intrus d'uploader.
    Oui, le test du type MIMI ne l'empêchera pas, c'est pour ça qu'il uploade un fichier d'extension .php.gif qui contient effectivement du code binaire gif terminé par point-virgule suivi de code PHP malicieux

    La portée de $GLOBAL["user"] n'atteigne pas en fait le code tiers d'upload d'image. Donc je remets la classe d'authentification utilisée par mon site dans le code de l'upload donc un 2ème formulaire de connexion lors de l'upload, c'est le mieux qu'on puisse faire

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 149
    Points : 206
    Points
    206
    Par défaut
    Un bon moyen serait d'avoir un $_SESSION['user'] plutot que $GLOBAL afin de le récupérer facilement sur les pages appelées lors de l'upload.

  15. #15
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par Helfima Voir le message
    1) un fichier ne se terminant pas par .php ne devrai jamais être exécuté, sinon il y a un gros problème de réglage sur le serveur
    vérifier la liste des extensions exécutables

    ............................

    ps: si un hacker a déjà déposé des fichiers il faut
    bloquer ton site
    faire le ménage de fichier intrus
    changer tous les passwords

    voila j'en sais pas plus
    bon courrage
    Je résume donc:
    - ce n'est pas un soucis de passwords découverts
    - le hacker upload bien un fichier pic.php.gif et il arrive à l'exécuter mais je ne sais pas COMMENT ???

    nextdev>
    Effectivement c'est de la session, de plus je n'aime pas trop le $_SESSION['user'] car je suis sur du mutualisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class MonsiteUser{
            public static function GetInstance() {
                // CLASSIC
                if (empty($_SESSION["monsite" . session_id()])) {
                    $_SESSION["monsite" . session_id()] = new MonsiteUser;
                }
                return $_SESSION["monsite" . session_id()];
            }
    .................
    $GLOBALS["user"] = MonsiteUser::GetInstance();

  16. #16
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Pour résumer ce qui a été dit :
    - Vérifie la conf de ton serveur (httpd.conf pour apache)
    - Lors de l'upload vérifie le type MIME du fichier uploadé et refuse tout ce qui n'est pas une image
    (un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(substr($t_mime,0,5) == 'image') { 
    // ton code qui gère les fichiers images (redimensionnement, déplacement, etc...)
    }
    suffira)
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 149
    Points : 206
    Points
    206
    Par défaut
    Effectivement c'est de la session, de plus je n'aime pas trop le $_SESSION['user'] car je suis sur du mutualisé
    Béh sans stocker l'info que l'user est deja logger, c'est sur que tu devras lui redemander. Au pire tu rajoute juste $_SESSION['user_is_logged']=1 (en parallèle a ton GLOBAL['user']) que tu controle dans la page d'upload

    Pourquoi ne pas utiliser la session, es tu chez ovh ?

  18. #18
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    c'est quoi le problème des sessions chez OVH? chez moi tout fonctionne à merveille.

    je suis un peu déçu parce que le titre du message était croustillant et que la solution est plutôt standard.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  19. #19
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 386
    Points : 10 414
    Points
    10 414
    Par défaut
    Et tu as pensé à faire un getimagesize lors de l'upload de tes images ? Normalement ce test est assez restrictif et comme vous n'en avez pas encore parlé...

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 149
    Points : 206
    Points
    206
    Par défaut
    Il n'y a justement pas de problème chez ovh, et d'ailleurs le répertoire /tmp/ ou sont stocké les sessions par défaut n'est plus accessible sur leurs serveurs.

    Donc leur config de base en mutualisé ne pose a priori plus de risque, ou pas plus qu'un dédié.

Discussions similaires

  1. Programme de protection contre le déni de service
    Par EJ dans le forum Développement
    Réponses: 7
    Dernier message: 03/07/2009, 22h14
  2. La meilleure protection contre le piratage des logiciels ?
    Par iubito dans le forum Débats sur le développement - Le Best Of
    Réponses: 184
    Dernier message: 23/12/2008, 13h35
  3. Protection d'un swf contre le hacking
    Par bibile dans le forum Flash
    Réponses: 4
    Dernier message: 02/05/2006, 13h30
  4. PROTECTION CONTRE LES ASPIRATEURS DE SITE
    Par squalito dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/01/2005, 14h06

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