Author Topic: Protection contre les injections SQL  (Read 2675 times)

Offline ethem

  • Newbie
  • *
  • Posts: 28
  • Karma: 2
    • View Profile
Protection contre les injections SQL
« on: Décembre 22, 2008, 01:48:53 pm »
Bonjour à tous

Je souhaiterais savoir si vous connaissez une solution viable pour se proteger contre les injections SQL?

Il me semble qu'il faut desactivé l'option php Magic_quote

pourrais je avoir une confirmation?

Offline ethem

  • Newbie
  • *
  • Posts: 28
  • Karma: 2
    • View Profile
Re : Protection contre les injections SQL
« Reply #1 on: Décembre 22, 2008, 02:51:30 pm »
Les attaques par injection de commandes SQL sont des attaques visant les sites web s'appuyant sur des bases de données relationnelles.

Dans ce type de sites, des paramètres sont passés à la base de données sous forme d'une requête SQL. Ainsi, si le concepteur n'effectue aucun contrôle sur les paramètres passés dans la requête SQL, il est possible à un pirate de modifier la requête afin d'accéder à l'ensemble de la base de données, voire à en modifier le contenu.

En effet, certains caractères permettent d'enchaîner plusieurs requêtes SQL ou bien ignorer la suite de la requête. Ainsi, en insérant ce type de caractères dans la requête, un pirate peut potentiellement exécuter la requête de son choix.

Soit la requête suivante, attendant comme paramètre un nom d'utilisateur :

SELECT * FROM utilisateurs WHERE nom="$nom";

Il suffit à un pirate de saisir un nom tel que « toto" OR 1=1 OR nom ="titi » pour que la requête devienne la suivante :

SELECT * FROM utilisateurs WHERE nom="toto" OR 1=1 OR nom ="titi";

Ainsi, avec la requête ci-dessus, la clause WHERE est toujours réalisée, ce qui signifie qu'il retournera les enregistrements correspondant à tous les utilisateurs.


-------

Procédures stockées

De plus, certains systèmes de gestion de bases de données tel que Microsoft SQL Server possèdent des procédures stockées permettant de lancer des commandes d'administration. Ces procédures stockées sont potentiellement dangereuses dans la mesure où elles peuvent permettre à un utilisateur malintentionné d'exécuter des commandes du système, pouvant conduire à une éventuelle intrusion
------

Parades

Un certain nombre de règles permettent de se prémunir des attaques par injection de commandes SQL :

    * Vérifier le format des données saisies et notamment la présence de caractères spéciaux ;
    * Ne pas afficher de messages d'erreur explicites affichant la requête ou une partie de la requête SQL.
    * Supprimer les comptes utilisateurs non utilisées, notamment les comptes par défaut ;
    * Eviter les comptes sans mot de passe ;
    * Restreindre au minimum les privilèges des comptes utilisés ;
    * Supprimer les procédures stockées ;


procédure issu de http://www.commentcamarche.net/contents/attaques/injection-commandes-sql.php3

Offline Amine

  • Administrator
  • Full Member
  • *****
  • Posts: 172
  • Karma: 15
    • View Profile
    • EdelweissHosting
Re : Protection contre les injections SQL
« Reply #2 on: Décembre 22, 2008, 03:13:19 pm »
Bonjour

magic_quotes_gpc est une option qu'il faut mettre sur off et ne pas compter dessus. Elle sera de toute maniere retiree de PHP 6.

Une injection mySQL est une attaque dont le principe est le suivant:
Lorsque vous entrez des donnees dans un formulaire (inscription, post, email, commande, recherche... etc), dans la majorite des cas, c'est un script PHP qui prend en charge le traitement du formulaire. Tres souvent, le PHP n'est qu'un point de passage. Le code PHP va creer une requete mySQL qui depend de ce que le client a entre dans le formulaire. Par exemple, si on cherche a ouvrir un session sur un forum, on rentre son nom d'utilisateur. Le script PHP va passer le nom d'utilisateur a mySQL pour lui demander de verifier que l'utilisateur est bien inscrit.

Imaginons la situation ou l'utilisateur est malicieux et au lieu de rentrer un user name tout bete, il va rentrer un bout de code dans le champ.

PHP va prendre le bout de code et va l'encapsuler dans la requete SQL et l'envoyer au serveur mySQL. Si l'attaque est bien faite, mySQL ne fera pas la difference entre la requete legitime et les donnees encapsulees dedans. Ce qu'il va voir c'est un grosse requete mySQL qu'il va executer.

Le resultat peut etre:

- Vandalisme: la requete demande a mySQL d'efface une table, des enregistrements... etc
- Defacage de site: la requete ajoute des donnees. Si vous avez un CMS, celui stocke les donnees de ses pages dans la base mySQL. Si ces donnees sont modifiees, elles peuvent etre diffusees aux visiteurs qui verra le contenu modifie.
- Piratage: la requete ajoute un compte qui n'existe pas. Le pirate pour l'utiliser pour ce connecter au site peut etre meme en Admin.
- Vol de donnees: la requete peut demander a mySQL d'afficher le contenu de certaines tables qui peuvent contenir des donnees confidentielles (cartes de credit par exemple).
- Attaque de visiteurs: combinee avec un exploit Firefox ou IE, le site peut commencer a injecter des virus ou malwares chez ses visiteurs... etc.


Voici un exemple concret:
Voici une requete mySQL comme celle qui peut etre envoyee lors d'un login sur un forum ou un site de eCommerce:

"SELECT * FROM users WHERE username = '".$_POST['username']."' AND password = '".$_POST['password']."'"

En Francais, cette instruction selectionne depuis la table qui s'appelle users, l'enregistrement, ou la ligne ou le username ET le mot de passe sont egaux aux valeurs rentrees dans le formulaire de login. Donc, le client entre un username et un mot de passe et le script va selectionner la ligne ou il trouve ces deux valeurs (bien ces DEUX valeurs, pas seulement l'une d'elles).

Par exemple, si le login est edelweisshosting et le mot de passe 123456, voici ce que sera la requete envoyee a mySQL:

"SELECT * FROM users WHERE username = 'edelweisshosting' AND password = '123456['password']'"


Bonjour, je suis pirate:
Je vais dans le formulaire et dans le champ username, je rentre admin. Ou bien tout autre username que je devine. Je sais que cet username existe (par exemple membre sur un forum, nom d'un client... etc). Et comme mot de passe, je rentre exactement ceci:

' OR ''=''

Puis, je clique pour valider et une requete est creee et envoyee au serveur. Elle sera comme ceci:

"SELECT * FROM users WHERE username = 'edelweisshosting' AND password = '' OR ''=''['password']'"

Vu comme c'est rentre, le serveur va prendre OR, = etc comme faisant partie integrante de l'instruction mySQL et donner un comportement autre au script PHP/SQL. Celui-ci va selectionner n'importe quel username entre, peu importe le mode passe.

La fonction magic_quotes a ete mise en place pour eviter que les utilisateurs ne puissent rentrer du code dans les formulaires PHP. Comme le comprote toujours certains caracteres comme les guillemets simples ou doubles, le magic_quote rajoute devant un backslash. Le resultat est que ceux-ci ne sont plus interpretes comme faisant partie d'un code, mais tout simplement comme du texte. Ca casserait un script injecte sur un formulaire. Ainsi:

' devient \'
" devient \"
\ devient \\

Ceci previent en bonne partie les injections mySQL mais ce n'est pas suffisant. Il faut le remplacer par un processus de validation qui prend en charge les elements entres dans un formulaire et les verifie avant de les passer a mySQL.


Autre exemple:
Le bout suivant est sense selectionner la ligne dans la base de donnees contenant une valeur que le client rentre. Par exemple, un nom d'utilisateur:

statement = "SELECT * FROM users WHERE name = '"username"';"

Par exemple, le pirate rentre ceci comme username dans le formulaire:

a' or 't'='t

Le code recu par mySQL est alors:

SELECT * FROM users WHERE name = 'a' OR 't'='t';

Dont la partie droite (en rougle) est tout le temps realisee (parce que t est toujours egal a t quelque soit la valeur de t).

Beaucoup de scripts gratuit en meme commerciaux (on ne va pas dire des noms) ne controlent pas du tout les donnees rentrees par un visiteur sur le site. C'est a dire que ces scripts sont immediatement vulnerables aux injections mySQL.








Offline ethem

  • Newbie
  • *
  • Posts: 28
  • Karma: 2
    • View Profile
Re : Protection contre les injections SQL
« Reply #3 on: Décembre 23, 2008, 07:28:13 pm »
merci Amine c est beaucoup plus clair  et apparrement ca deviens de plus en plus courant

Offline Amine

  • Administrator
  • Full Member
  • *****
  • Posts: 172
  • Karma: 15
    • View Profile
    • EdelweissHosting
Re : Protection contre les injections SQL
« Reply #4 on: Décembre 24, 2008, 01:37:23 pm »
Oui, ca devient tres courant :( La majorite des cas que nous avons constate, correspondaient a des piratages de base de donnees dans le but de defacer la page.

Si le codeur n'est pas rigoureux dans la verification de ce que le client peut entrer dans les formulaire, il peut facilement finir avec un site deface. C'est a dire qu'il arrive un matin et il trouve sa page d'accueil remplacee par des insultes en Turc ou en Russe...

Pourtant des scripts simples permettent de tester le contenu des formulaires avant de les poster.

Offline ethem

  • Newbie
  • *
  • Posts: 28
  • Karma: 2
    • View Profile
Re : Protection contre les injections SQL
« Reply #5 on: Décembre 24, 2008, 04:54:35 pm »
enfin l'interet est de prevenir :)