Injection SQL time based

Il est 00h13 ma tête touche presque mon bureau mais je culpabilise d’aller me coucher à cette heure ci. Impossible de me concentrer pour un chall ou lire de la doc seul l’écriture d’un article peut passer (et encore)

Si y a bien un domaine que je suis loin de maitriser c’est les injections SQL je n’ai jamais vraiment essayer d’en faire, j’ai toujours skip les challs avec des injec. Cependant j’ai entendu parler des injection SQL time based au boulot en me documentant j’ai trouvé ça tellement intéressant que j’ai voulu créer un article dédié !

 

 

0x01 Qu’est ce qu’une injection SQL time based 

Dans certains cas le serveur n’affichera rien en réponse à une injection SQL il nous est donc nécéssaire de trouver une façon de savoir si celle-ci à marché ou non et de récupérer des informations !

Pour se faire on va insérer dans notre requête :

Pour ceux qui ne la connaisse pas la fonction sleep() ne fait … RIEN .. ou presque. En faite elle attend juste le nombre de seconde passé en paramètre avant de se finir et de laisser place à la prochaine instruction

On voit ici l’effet du sleep(5) car NON mon PC ne met pas 5 seconde pour éxécuter 5 pauv‘ ligne de python. Ainsi si l’injection SQL fonctionne le serveur mettra 5s à répondre alors qu’il mettra un temps inférieure si elle n’as pas marché !

 

 

0x02.1 Cas d’école : configuration

On va s’amuser avec la configuration suivante :

  • Notre page php vulnérable
  • notre table mysql à qui nous allons subtiliser des informations

 

0x02.2 Cas d’école : exploitation

On va commencer par l’exploitation dite manuelle. Pour cela la query suivant devrait sufire :

 

[DEBUG activé]

 

[DEBUG not activé]

 

Tu t’attendais à quoi mdr, bien sûr que l’on voit rien

C’est dans ce genre de cas que l’injection time based va nous sortir de cette merdasse. Cependant un autre problème arrive, supposons que notre ‘OR 1= # fonctionne en mode time based : on sera toujours au même point rien ne sera affiché donc on ne connaitre pas ce que retourne la bdd

Il faut donc se servir de l’injection time based pour deviner le contenu de chaque colonne ! C’est la où intervient la magie des scripts python (ou autres, sauf perl et javascript, langages sheitaniques)

 

[Explication]

On va exécuter la requête suivante : ?username= ” OR IF(password LIKE BINARY “%a%”, sleep(5), null) #

Concrètement on va tester la présence du caractère dans la colonne password et si ce test est vrai alors le serveur va exécuter sleep(5)

Afin de deviner l’intégralité du champs on va faire une boucle afin de le bruteforcer en ajoutant chaque nouveau caractère trouvé aux anciens ce qui va nous constituer notre password !

On ajoute à la requête GET un timeout de 1 seconde car si l’injection marche le serveur mettra à minima 5 secondes pour répondre ainsi on pourra catch l’exception et la traiter afin de retrouver le char qui à marché !

Ici j’ai fait la supposition que l’utilisateur serait plus petit que 10 chars et que le nom de la colonne était user. Essayons maintenant de trouver le password avec la même technique.

 

0x3 Contres mesures

Bon, c’est bien de savoir exploiter mais c’est aussi bien de savoir sécuriser ! Pour cela il suffit juste de nettoyer les données envoyées par l’user en échappant les ” et ‘

PLOP