PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 MySQL, PostgreSQL, etc... » Victime d'une tentative de hack : "injection SQL" » 07-04-2019 04:17:52

LorenSnow
Réponses : 8

Bonjour à tous,

J'ai créé mon site internet suite à une formation en autodidacte au html, css, php et MySQL.
Il est constitué d'une base de données avec plusieurs tables (utilisateurs et stock).

Je m'aperçois qu'il y a deux jours, un utilisateur a tenté de rentrer dans ma base de données par injection SQL, via le biais du formulaire de contact et du formulaire de création de compte. L'attaque a duré environ 2 minutes, et l'utilisateur a posté durant ce laps de temps environ 350 messages et 350 comptes de créés. J'ai l'impression que l'attaque n'a pas abouti et que ses tentatives ont échouées grâce à mes protections.


Ma question se divise en deux :
- Reconnaissez vous ce type d'attaque ? Comment pouvons nous savoir si l'utilisateur a pu rentrer dans la base de données et la fouiller ? Ou alors si il n'a pas réussi ?

- Mes défenses sont-elles bonnes ?


Voici 4 messages postés lors de l'attaque, par le formulaire contact.

mail          : sample@email.tst
nom          : bbgjccst
prénom     : -1 OR 3+319-319-1=0+0+0+1 --
message   : 20
idstock      : 0
(idstock est l'objet à partir duquel on pose la question, 0 signifie aucun objet sélectionné)

---

mail          : sample@email.tst
nom          : kyvclywx
prénom     : kyvclywx
message   : 20
idstock      : 10622
(Formulaire contact appelé de la page de l'objet 10622)

---

mail          : sample@email.tst
nom          : toyWtwIv'));select pg_sleep(10); --
prénom     : bbgjccst
message   : 20
idstock      : -1
(-1 impossible, l'adresse URL a été modifiée, car le numéro objet passe par l'URL)

---

mail          : sample@email.tst
nom          : azz0pgqH')); waitfor delay '0:0:15' --
prénom     : bbgjccst
message   : 20



- Dans le champ mail, il n'y a eu que " sample@email.tst "

- dans le champ nom et prénom il y a eu :
bbgjccst
mphYwrOB';select pg_sleep(5); --
azz0pgqH')); waitfor delay '0:0:15' --
hZksAILq'); waitfor delay '0:0:10' --
-1' OR 2+693-693-1=0+0+0+1 --
-1" OR 2+699-699-1=0+0+0+1 --
if(now()=sysdate(),sleep(12),0)/*'XOR(if(now()=sysdate(),sleep(12),0))OR'"XOR(if(now()=sysdate(),sleep(12),0))OR"*/ 

et aussi : 1 , ou -1 , ou 1'" , ou / etc...

et dans message, pareil, mais surtout : ' 20 '







Concernant mes défenses.



Lors de la conception, j'ai tenté comme j'ai pu de me prévenir des attaques venant de l'utilisateur, comme l'injection SQL. Avec les fonctions "addslashes" et "PDO:prepare, execute".

Dans mon formulaire création de compte, voici une partie de  mon code, qui récupère les valeurs rentrées dans le formulaire, et les passe par la fonction addslashes avant de les utiliser dans la requête INSERT INTO :

                     

  $nom = addslashes($_POST['fEnrNom']) ;
      $prenom = addslashes($_POST['fEnrPrenom']) ;
      $mail = addslashes($_POST['fEnrMail']) ;
      $mdp = addslashes($_POST['fEnrMdp']) ;
      $tel = addslashes($_POST['fEnrTel']) ;
      $adresse = addslashes($_POST['fEnrAdresse']) ;
         
      $sqlEnr = "INSERT INTO t_utilisateurs (
      mail, password,
      nom, prenom,
      tel, adresse)
     
      VALUES (
      '".$mail."','".$mdp."',
      '".$nom."','".$prenom."',
      '".$tel."','".$adresse."')" ;
     
      $reqEnr = $pdo -> query($sqlEnr)
      or die (print_r ( $pdo -> errorInfo())) ;  



Pour mon formulaire contact ,

Mon code fonctionne avec PDO prepare et , PDO execute ,
Voici mon code :


if(strlen($_POST['FcontactPrenom']) < 40 AND strlen($_POST['FcontactNom']) < 40
  AND strlen($_POST['FcontactMail']) < 40 AND strlen($_POST['FcontactMessage']) < 1500)
  {
          $sqlMes = $pdo -> prepare ( " INSERT INTO t_messages (nom , prenom , mail , message , idOeuvre ) VALUES ( ? , ? , ? , ? , ? )" )
    or die (print_r ( $pdo -> errorInfo())) ;
   
    $sqlMes -> execute (array ($_POST['FcontactNom'],$_POST['FcontactPrenom'],$_POST['FcontactMail'],$_POST['FcontactMessage'],$_POST['FcontactId']));



Je rappelle mes questions
:
- Reconnaissez vous ce type d'attaque ? Comment pouvons nous savoir si l'utilisateur a pu rentrer dans la base de données et la fouiller ? Ou alors si il n'a pas réussi ?

- Mes défenses sont-elles bonnes ?




Je vous remercie pour votre attention, et je vous souhaite une très bonne journée et fin de semaine.


Lorenzo

#2 Re : Forum Général PHP » Securité des sessions / Securité générale » 20-12-2017 12:56:23

<?php
    //Connexion a la base de donnees
   
    require 'admin/templates/connexionBase.php';
   
   
    //Verifie que l'identifiant rentré dans le formulaire de connexion est dans la table t_utilisateur
   
    if (isset($_POST['validerConnexion']) AND isset($_POST['identifiant']))
    {
        $sqlCon = $pdo -> prepare ( " SELECT * FROM t_utilisateurs WHERE identifiant = ?" )
        or die (print_r ( $pdo -> errorInfo())) ;
       
        $sqlCon -> execute ( array ( $_POST['identifiant'] ));
               
        $nbCon = $sqlCon -> rowcount() ;

       
        if ( $nbCon == 1 )
        {
            $resCon = $sqlCon -> fetch() ;
           
           
           
            //Si il existe l'identifiant, compare le mot de passe
            // Si le mot de passe est correct, rentre dans la variable session droit le champ 'droits' de la base de données, soit 1. 2 ou 3 ou 4
           

            if ( $resCon['password'] == $_POST['password'] )
            {
                $_SESSION['droits'] = $resCon['droits'] ;
               
            }
           
           
           
            // Si le mot de passe est faux
            else
            {
                $_SESSION['droits'] = 'faux' ;
                $erreurCon = "Mot de passe erroné." ;
            };
           
           
           
           
        }
       
       
        // Si l'utilisateur n'existe pas
        else
        {
            $_SESSION['droits'] = 'faux' ;
            $erreurCon = "Ce nom d'utilisateur n'existe pas." ;
           
        };
   
       
    };

#3 Forum Général PHP » Securité des sessions / Securité générale » 20-12-2017 12:56:23

LorenSnow
Réponses : 2

Bonjour à tous,

Ceci est mon premier post sur ce forum, je viens de m'inscrire.
Je suis un débutant autodidacte en php,
Et à force de recherche et de travail (depuis environ 6 mois) j'ai pu créer un site internet relié à une base de données.
Un site à vocation commerciale. J'en suis très content.
Voici pour la présentation : )


Je protège la partie Admin de mon site grâce à un formulaire de connexion identifiant / mot de passe.

Une requête est exécutée sur le serveur de base de données : si il existe dans la table utilisateurs un enregistrement avec le même identifiant et le même mot de passe,
alors la requête sélectionne le chiffre du champ " droits " .


La table est comme cela :

id     identifiant       motdepasse        droits

0      admin            mdpadmin           1
1      max               mdpmax             2
2      visiteur           mdpvisiteur        3


Le chiffre  " droits " est ensuite enregistré dans une variable de session. $_SESSION['droits'].

Ensuite, lors de l'arrivée sur chaque page, cette variable est controlée et charge en fonction, le template admin ou le template visiteur.
Donc, si $_SESSION['droits'] == 1 ; Cela charge le template Admin.
si $_SESSION['droits'] == 3 ; Cela charge le template Visiteur.


Ma question est la suivante : Ce mode est-il assez sécurisé ?
En particulier, serait-il possible qu'un utilisateur malveillant puisse définir $_SESSION['droits'] == 1 ?


Je vous remercie pour votre attention.
Bonne journée.


Lorenzo

Pied de page des forums

Propulsé par FluxBB