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

Sécurité Discussion :

Table vidée de ma base de données mysql


Sujet :

Sécurité

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut Table vidée de ma base de données mysql
    Bonjour à tous,

    voilà, j'ai un site internet qui exitse depuis bientôt 5 ans et ces duex derniers, j'ai subi deux attaques de hackers qui ont eu pour conséquences de vider certaines
    tables de base de données.
    Je suppose que cela à été fait par des injections mysql mais je n'en suis pas sûr ?
    Comment le savoir ?
    Comment savoir à quel niveau de mon site se trouve les failles mysql.
    Les mot de passe de mes utilisateur ne sont pas cryptés. Mais je pense que même si je les crypte, les hackers parviendront à vider à nouveau mes tables par des injections mysql.

    Une chose est bizarre tout de même. il y a juste certaine tables qui ont été vidées.
    Ca signifie que le hacker n'est pas parvenu à vider toutes les tables. Quelque donc l'en a empêché. mais je ne sais pas quoi.

    Je me suis servi de l'extention "Injection Mysql" de firefox mais je ne comprends rien résultats, et j'ai lu qu ce n'est pas si fiable que cela.


    Merci d'avance pour votre aide.

    Code php : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    if (isset($_POST['valide'])) // si clique sur le bouton ok
    {
        if (empty($_SESSION["mail"])) // si l'utilisateur n'est pas connecté
        {
            if (isset($_POST["mail"])) {
                $mail = $_POST['mail'];
            } else {
                $mail = "";
            }
            if (isset($_POST["mdp"])) {
                $mdp = $_POST['mdp'];
            } else {
                $mdp = "";
            }
        }
        if (empty($erreur[0])) {
            include('connect.php');
            /* on va d abord chercher si le client n'existe pas en effectuant un test sur la boîte mail */
            $sql = sprintf("select * from flatforswap_adherent where mail=%s and mdp=%s and valide !=%s", quote_smart($mail), quote_smart($mdp), quote_smart('0'));
            $req = mysql_query($sql) or die('Erreur SQL : <br />'.$sql);
            if (mysql_num_rows($req) == 1) {
                $data = mysql_fetch_assoc($req);
                $valide = $data['valide'];
                if ($valide == 2) {
                    $verifexist = true;
                }
                elseif($valide == 1) {
                    $verifexist = false;
                    $erreurc[] = '<center><font color="#FF0000">'.$idem_txt0032.'</font></center>';
                }
            } else {
                $verifexist = false;
                $erreurc[] = '<center><font color="#FF0000">'.$idem_txt0033.'</font></center>';
            }
            mysql_close();
            if ($verifexist == 'true') {
                $_SESSION['mail'] = $data['mail'];
                /* l'adhérent est maintenant connecté */
                include('connect.php');
                // $sqld = sprintf("SELECT id_adh FROM flatforswap_adherent WHERE mail=%s", quote_smart($_SESSION["mail"]));
                $sqld = sprintf("SELECT id_adh FROM flatforswap_adherent WHERE mail=%s and valide =%s", quote_smart($_SESSION["mail"]), quote_smart('2'));
                $reqd = mysql_query($sqld) or die('Erreur SQL : <br />'.$sqld);
                $datad = mysql_fetch_assoc($reqd);
                $id_adh = $datad['id_adh'];
                $_SESSION['id_adh'] = $id_adh;
                /* on met id_adh en session afin d'éviter des requête inutiles */
            }
        }
        // message d'erreur
        //if(isset($erreurc[0])) {for($i=0;$i<sizeof($erreurc);$i++) { echo $erreurc[$i];}} 
    }
    // TRAITEMENT DU FORMULAIRE DE CONNEXION : FIN
    // TRAITEMENT DU FORMULAIRE D'INSCRIPTION

    une autre chose bizarre aussi :

    Dans le fichier de mon site, je vois souvent ces lignes (avec une adresse ip quasiment identique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    188.165.15.19 - - [21/Jan/2015:09:21:57 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=69&p=70&p=71&p=72&p=74&p=73&p=75&p=2&p=5&p=6&p=7&p=4&p=77&p=76&p=81 HTTP/1.1" 200 4004 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.19 - - [21/Jan/2015:09:22:01 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=69&p=70&p=72&p=74&p=73&p=75&p=2&p=76&p=1&p=78&p=77&p=79 HTTP/1.1" 200 4701 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.121 - - [21/Jan/2015:09:22:01 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=68&p=69&p=70&p=67&p=71&p=72&p=74&p=75&p=2&p=3&p=4&p=6&p=5&p=7&p=8&p=11&p=10&p=76&p=77&p=78&p=81 HTTP/1.1" 200 4018 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.121 - - [21/Jan/2015:09:22:03 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=59&p=57&p=68&p=69&p=70&p=72&p=74&p=75&p=71&p=2&p=4&p=6&p=5&p=3&p=7&p=77&p=73&p=78&p=79&p=81&p=80&p=76 HTTP/1.1" 200 4924 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.36 - - [21/Jan/2015:09:22:08 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=69&p=70&p=72&p=74&p=73&p=75&p=2&p=12&p=7&p=5&p=8&p=10&p=76&p=77&p=71&p=80 HTTP/1.1" 200 5180 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.121 - - [21/Jan/2015:09:22:11 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=71&p=73&p=74&p=69&p=70&p=75&p=2&p=76&p=77&p=72&p=78&p=81 HTTP/1.1" 200 3973 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.121 - - [21/Jan/2015:09:22:20 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=69&p=70&p=72&p=74&p=73&p=75&p=2&p=76&p=8&p=78&p=77&p=71&p=79&p=80 HTTP/1.1" 200 5161 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.121 - - [21/Jan/2015:09:22:36 +0100] "GET /liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=70&p=69&p=72&p=74&p=75&p=2&p=5&p=3&p=76&p=77&p=73&p=71&p=79&p=81 HTTP/1.1" 200 3994 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
    188.165.15.121 - - [21/Jan/2015:09:22:36 +0100] "GET /TeVOQ/liste.php?continent=-1&ad_pays=-1&ville=-1&type=-1&pers=-1&date1=&date2=&valide_form=Envoyer+ces+informations&p=9&p=61&p=60&p=62&p=63&p=65&p=64&p=66&p=67&p=68&p=69&p=70&p=71&p=72&p=73&p=74&p=75&p=2&p=4&p=8&p=6&p=7&p=77&p=78 HTTP/1.1" 404 1148 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"

  2. #2
    Membre actif
    Homme Profil pro
    Expertise sécurité
    Inscrit en
    Avril 2013
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Expertise sécurité

    Informations forums :
    Inscription : Avril 2013
    Messages : 185
    Points : 268
    Points
    268
    Par défaut
    Hello,

    Pour tes tables je ne sais pas, pour l'IP du peux trouver plus d'infos ici : http://whatismyipaddress.com/ip/188.165.15.121

    @+

  3. #3
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    BonjourJe confirme pour les entrées dans le log, c'est juste un "bête" robot qui a crawler ton site pour indexation, pas de stress.Pour les tables de ta DB, es-tu sûr que ce soit un hack ? L'origine pourrait être multiple (un code mal écrit, un crash base de données, etc.). Il te faudrait parvenir à identifier à quelle heure cela a été fait et, si tu as cette info, allez voir tes fichiers log pour tenter de retrouver, à cette heure-là (attention à l'heure GMT) si tu as des lignes "bizarres".Mais, ici, avec si peu d'infos, impossible de dire quoi que ce soit.Bonne journée.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  4. #4
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut cavo789,

    je suis pratiquement sûr qu'il s'agit d'un hack car c'est la deuxième fois que cela m'arrive.
    La première fois,je pensais que c'était une mauvais manipulation de ma part, mais cette fois ci c'est sûr, une action extérieur est venue volontairement supprimée mes tables.
    Ce qui est bizarre, c'est que ce n'est pas toutes mes tables qui ont été supprimées.

    Et comme par hasard, ce sont les trois tables qui correspondent aux codes suivants :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sqly = sprintf("delete from flatforswap_adherent where id_adh=%s", quote_smart($_GET['id']));
    $sql_des = sprintf("delete from flatforswap_destination where id_adh=%s", quote_smart($_GET['id']));
    $sql_log = sprintf("delete from flatforswap_logement where id_adh=%s", quote_smart($_GET['id']));

    Je ne sais pas à quelle heure à été fait le vidage de mes tables (cela aurait été trop beau ...), mais je sais que ça s'est passé la journée du 22janvier entre 01h35 du matin et 21h37 le soir.
    Je ne parviens à vous faire parvenir le fichier car il fait 1.5 Meg.

  5. #5
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Bonsoir

    Citation Envoyé par sam01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sqly = sprintf("delete from flatforswap_adherent where id_adh=%s", quote_smart($_GET['id']));
    $sql_des = sprintf("delete from flatforswap_destination where id_adh=%s", quote_smart($_GET['id']));
    $sql_log = sprintf("delete from flatforswap_logement where id_adh=%s", quote_smart($_GET['id']));
    Tu as codé tes instructions comme ça ???

    Tu exécutes tes variables sans autre forme de procès ?

    Que contient $_GET['id'] ==> tu n'as pas le moindre code pour valider que c'est une valeur numérique et strictement une valeur numérique. Et là, en l'absence de validation, paf! l'injection SQL où quelqu'un pourra mettre un "&id=1 OR 1=1 UNION DROP TABLE xxxxx" sur ton querystring.

    Et paf! avec une jolie valeur pour ID ta table est vidée voir un nouvel utilisateur créé voir un DROP DATABASE.

    Non, là, il y a du boulot pour sécuriser ton code.

    Ne jamais faire confiance à ce que l'utilisateur introduit.

    En outre, privilégie le $_POST au lieu du $_GET tellement simple à modifier.

    Bonne programmation.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bonjour,

    j'utilise cette fonction justement pour éviter les injection mysql

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Protège la variable avant l'insertion
    function quote_smart($value){
    // Stripslashes si nécessaire
    	if (get_magic_quotes_gpc()){
    		$value = stripslashes_deep($value);
    	}
    // Protection si ce n'est pas un entier
    	if (!is_int($value)){
    		$value = "'" . mysql_real_escape_string($value) . "'";
    	}
    return $value;
    }

    et ensuite mon code :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sqly = sprintf("delete from flatforswap_adherent where id_adh=%s", quote_smart($_GET['id']));
    $reqy = mysql_query($sqly) or die('Erreur SQL : <br />'.$sqly);
     
    $sql_des = sprintf("delete from flatforswap_destination where id_adh=%s", quote_smart($_GET['id']));
    $req_des = mysql_query($sql_des) or die('Erreur SQL : <br />'.$sql_des);
     
    $sql_log = sprintf("delete from flatforswap_logement where id_adh=%s", quote_smart($_GET['id']));
    $req_log = mysql_query($sql_log) or die('Erreur SQL : <br />'.$sql_log);

    Il y a donc bien une vérification du code entré.

    Pour cela, j'ai suivi le tuto suivant :

    http://php.developpez.com/faq/?page=mysql#mysql-escape

  7. #7
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Bonjour

    Je suis perplexe...

    Citation Envoyé par sam01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Protection si ce n'est pas un entier
        if (!is_int($value)){
            $value = "'" . mysql_real_escape_string($value) . "'";
        }
    return $value;
    }
    Nous sommes d'accord : tu exiges un entier et rien qu'un entier.

    Pourquoi ne pas écrire un truc du style if (!is_int($value)) die('Invalid call. The value should be an integer').
    J'écris vite pour donner l'idée.

    Dans mes programmes si je veux un entier et que je n'en reçois pas, je stoppe mon action et je ne vais certainement pas lancer une instruction comme une suppression dans ma table.

    Je ne dis pas que c'est la cause de ton souci exprimé ici mais voilà, il me semble qu'il y a une faiblesse au niveau du code.

    Si sur le querystring je mets &id=DELETE FROM sys.tmp, à quoi ressemblera ton instruction

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $sqly = sprintf("delete from flatforswap_adherent where id_adh=%s", mysql_real_escape_string($_GET['id']));

    Parce que c'est cette instruction-là que tu exécuteras alors que, nous serons encore d'accord, il ne faut pas l'exécuter; en aucun cas. Peut importe si elle a une chance de causer du dégat ou pas : id doit être un chiffre et rien qu'un chiffre. Si pas, c'est qu'il y a un problème et on stoppe le processus.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/08/2011, 18h40
  2. lien entre les tables d'une base de données Mysql
    Par chifa dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/10/2007, 12h42
  3. [MySQL] ma base de donnée Mysql est vide
    Par freshman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/09/2007, 20h02
  4. Lister les tables d'une base de données MySQL
    Par Legenyes dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 05/07/2006, 18h43
  5. Réponses: 3
    Dernier message: 30/05/2006, 19h09

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