[SQL INJECTION] ¿Me ayudas en un reto? (Abierto)

Iniciado por ZaPa, 15 Marzo 2010, 00:35 AM

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

WHK

#20
Hola, la diferencia de una inyección MySQL y MSSQL es que en MSSQL la mayoría de las veces si no tienes la forma de devolver datos puedes forzar errores y que te debuelvan cosas que tu quieras.

En MySQL no puedes por ejemplo hacer dos select, digamos que la query "select * from test where id = $_GET[id]", en ese caso id no puede transformarse en otra query como lo hace mssql "where id = (select id from x limit 1)".

Ahora, como en mssql podemos encerrar nuevas querys una dentro de otra forzamos a que nos mande error y eso lo podemos lograr con la función "convert()" y hay muchas mas, ahora decimos que convert deve aceptar solo numeros integers:
CONVERT(int, test)

Con eso decimos que test debe ser obligadamente integer, pero que pasa si le entregamos un valor que no sea un número?
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Error de sintaxis al convertir el
valor nvarchar 'A35678956' para una columna de tipo de datos int.

/cgi-bin/datos.asp, línea 25


Entonces donde está la inyección le enviamos el convert y hacemos la query de la columna que queremos sacar.

Digamos que atraves de errores ya sacaste las tablas, puedes ir intentando con havving como explicaron mas arriba y con eso ya obtienes las tablas y columnas y puedes comenzar a hacer querys a cada valor que te pueda interesar.
Por ejemplo
test.asp?id=convert(int, (select password from usuarios where nick = 'admin')) --

Cita de: Alex@ShellRoot en 18 Marzo 2010, 00:23 AM
Se entiende correctamente, pero lo dudo bastante, dentro de MySQL seh se puede hacer. Pero dentro de este tipo de inyeccion se trabaja bajo MSSQL, si te sirve de algo, esta consulta lista todas las tablas de una base de datos.
Código (sql) [Seleccionar]
USE Base_de_Datos SELECT * FROM Information_Schema.Tables

schema no existe en mssql.
Saludos.

tragantras

Cita de: ZaPa en 18 Marzo 2010, 00:56 AM

AND (SELECT @@version)<=1 --

Ahora no entiendo 2 cosas, aver si me podeis explicar....

1 - ¿Porque sin parantesis la sentencia no funciona?
2 - ¿Porque tengo que añadir esa comparación númerica?

¿Alguien me puede aclarar estos 2 puntos, se lo agradeceria muchisimo.

Un saludo.

1.- No funciona porque lo que estás comparando es el resultado entero del SELECT. El select te devuelve la versión y es ESO lo que comparas con el <=1. Si no pones el paréntesis te compara "version" que... "no es nah" xD

2.- La query que manda el .asp al motor de la base de datos es esto:

Código (sql) [Seleccionar]
SELECT * FROM tabla WHERE campo = $_GET['variable']

tu inyectas en la la parte de "where campo = ", de manera que se queda, con la inyección ya puesta:

Código (sql) [Seleccionar]
select * from tabla where campo = 37361 AND (SELECT @@version)<=1 --

el and es un operador booleano, la operacion <=1 te devolverá TRUE or FALSE, lo que necsita el operador AND, vamos xD Esta técnica es el principal motor para explotar una BSQLi

Colaboraciones:
1 2