[RESOLU] Injection SQL test !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Injection SQL test !

Re: [RESOLU] Injection SQL test !

par sirakawa » 11 janv. 2015, 16:12

Moi j'en suis là:
<?PHP
$link = mysql_connect('localhost', 'root', '');
mysql_select_db('mysql', $link);
if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) ) 
{
	$login = $_POST["login"];
  	$sql = "SELECT user, password FROM user WHERE user like '$login'";
	print "$sql";
  $req = mysql_query($sql) or die(mysql_error());
	while ($ligne = mysql_fetch_assoc ($req))
	{ 
		print "<br />";
		print_r($ligne);
	}
}
?>
en mettant % comme login
ou simplement
select user, password from user where (user = 'admin') or ('a'= 'a');

Re: Injection SQL test !

par @rthur » 11 janv. 2015, 15:55

Tout à fait ;)

Re: Injection SQL test !

par Izo » 11 janv. 2015, 15:52

Enfin si, si je suis pas à côté de la plaque c'est :
  • On met une valeur nulle ou fausse en premier lieu, puis on simule une ligne de retour en ajoutant avec UNION SELECT.
  • Ligne de retour qui va être affecté au tableau $data ensuite exploité pour comparer le mot de passe.
  • Il suffit donc de mettre le même mot de passe en POST.
=D>

Re: Injection SQL test !

par Izo » 11 janv. 2015, 15:40

Ça fonctionne ! :shock:
Merci !

UNION permet de rassembler les résultats de plusieurs requêtes, de ce que je sais. Mais j'avoue ne pas top comprendre là...

Re: Injection SQL test !

par @rthur » 11 janv. 2015, 15:33

Je me réponds à moi-même : un simple UNION SELECT 'toto' devrait faire l'affaire.

Si en login tu mets

Code : Tout sélectionner

' UNION SELECT 'toto
et en mot de passe "toto", tu devrais être identifié

Re: Injection SQL test !

par @rthur » 11 janv. 2015, 15:27

Il doit forcément être possible de faire quelque chose avec cette faille pour obtenir l'accès, sinon elle ne serait pas présente dans ma liste d’exercice. #-o
Vu que tu ne peux injecter que des données en lecture, je serai toi j'essayerai de forcer la valeur de password pour quelque chose que tu connais, ça doit être possible en faisant une jointure...

Re: Injection SQL test !

par tof73 » 11 janv. 2015, 15:19

le but de l'exercice peut aussi être de trouver un cas ou ce n'est pas possible, en expliquant les raisons.

Re: Injection SQL test !

par Izo » 11 janv. 2015, 14:53

Arf. :x

Je vois. Pourtant, si je fais un SELECT, là... Ça va fonctionner. Sauf que je ne verrais aucunement le résultat.
J'ai cru voir passer des trucs du genre SELECT INTO.. Je vais voir ce que cela donne... Voir si il n'y a pas des moyens de DL au format fichier les retours ou un truc du genre... :|

Il doit forcément être possible de faire quelque chose avec cette faille pour obtenir l'accès, sinon elle ne serait pas présente dans ma liste d’exercice. #-o

Re: Injection SQL test !

par @rthur » 11 janv. 2015, 14:46

D'ailleurs avec mysqli, il est possible de faire des requêtes multiples mais en activant un flag spécial.

L'explication de la doc indique bien (pour mysqli_* mais c'est idem pour mysql_*) que ce n'est pas possible par défaut :
[quote="Documentation PHP - "Requêtes multiples""]
D'un point de vue de la sécurité

Les fonctions mysqli_query() et mysqli_real_query() de l'API ne définissent pas de drapeau de connexion nécessaire pour l'activation des multi-requêtes sur le serveur. Un appel supplémentaire à l'API est utilisé pour les multi-requêtes pour réduire la probabilité d'injection SQL accidentelle. Un attaquant peut tenter d'ajouter des requêtes comme ; DROP DATABASE mysql ou ; SELECT SLEEP(999). Si l'attaquant arrive à ajouter ce genre de SQL dans la chaîne de requête mais que mysqli_multi_query n'est pas utilisé, le serveur n'excutera que la première requête, mais pas la seconde représentant la requête SQL malicieuse. [/quote]
http://php.net/manual/fr/mysqli.quickst ... tement.php

Re: Injection SQL test !

par @rthur » 11 janv. 2015, 14:42

Dans tous les cas, je n'arrive pas à écrire une requête exécutive, qui va INSERT ou DELETE ou UPDATE.
C'est, à ma connaissance, totalement impossible avec le code présenté.

Si le SELECT est en dur alors il n'y a aucune chance que tu puisses faire un INSERT/DELETE/UPDATE avec cette injection car ça transformerai ta requête en requêtes multiples ce que mysql_query() ne laissera pas passer : http://php.net/mysql_query
D'ailleurs, techniquement, la fonction mysql_query() de PHP s'appuie sur l'API MySQL en C du même nom qui par défaut ne gère également qu'une requête : http://dev.mysql.com/doc/refman/5.5/en/ ... eries.html

Re: Injection SQL test !

par Izo » 11 janv. 2015, 14:11

Je vois, merci pour les précisions !

À vrai dire, j'ai initialement commencé à tester avec des sous-requêtes.
Mais je dois peut-être mal m'y prendre, car à chaque fois j'ai eu une erreur de syntaxe.

Le début de requête obligatoire est donc celui qui est écrit avant l'injection :
SELECT password FROM `auth` WHERE login = '
J'ai ensuite essayé de faire quelque chose comme :
admin' + (INSERT INTO ...) + '
Et la fin de la requête obligatoire (si on ne commente pas) :
');
Dans tous les cas, je n'arrive pas à écrire une requête exécutive, qui va INSERT ou DELETE ou UPDATE.
Or dans mon cas, je dois outrepasser ce code et me connecter...

Re: Injection SQL test !

par @rthur » 11 janv. 2015, 13:41

Bonjour,

Fait un var_dump() de ta variable $sql afin de voir la requête reçue et teste là dans phpMyAdmin, ça te permettra de voir le résultat.
A noter que la fonction mysql_query() ne peut gérer qu'une seule requête à la fois (sans point-virgule). Donc pas possible de concaténer 2 requêtes, mais tu peux jouer avec des sous requêtes pour récupérer des infos.

Par ailleurs, si le serveur sur lequel tu testes à les magic_quote activée ou tout autre dispositif de sécurité (firewall waf par exemple), il sera protégé automatiquement de cette faille.
http://php.net/manual/fr/security.magicquotes.what.php

Injection SQL test !

par Izo » 11 janv. 2015, 12:21

Bonjour,

Je suis actuellement en train d'apprendre à exploiter des injections SQL, enfin, j'essaye... :?
Le source code est celui-ci (oui, c'est un exercice donc je le possède) :
if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) ) {
  $sql = "SELECT password FROM auth WHERE login = '". $_POST["login"] ."'";
  $req = mysql_query($sql) or die(mysql_error());

  if (mysql_num_rows($req) > 0) {
     $data = mysql_fetch_assoc($req);
     if ($_POST["password"] == $data['password']) {
        $_SESSION['logged'] = 1;
    header("location:panel.php");
    die();
   }
  }
}
L'utilisateur existant actuellement est 'admin', et le but de mon exercice est d'arriver à entrer dans cette administration (je n'ai bien entendu pas son mot de passe).
J'ai tenté des choses comme ceci, mais rien n'y fait et je suis bloqué dessus depuis 15 jours. #-o
admin'; INSERT INTO auth (login, password) VALUES ('nouvel', 'admin');# Pour ajouter mon propre administrateur
Vu qu'à aucun moment les informations de la requête ne s'affichent; j'étais donc partit pour ajouter mon propre administrateur.
Pour la table auth, je sais uniquement qu'elle comporte le champ login et password et que le mot de passe n'est pas crypté vu qu'une comparaison est faite.
Mais rien ne fonctionne, et plutôt que de rester dans mon coin, je viens à vous... Auriez-vous un piste ? Une solution ? :oops: