¿Cómo obtener el resultado de una inyección SQL?

9

Esto es sólo para fines de aprendizaje. Quiero obtener todos los nombres de usuario y contraseñas de una tabla en un servidor MySQL, donde las "citas mágicas" se han deshabilitado. En la entrada para el nombre de usuario: pongo algo como:

username'; SELECT * FROM users;

¿Pero cómo puedo obtener la información de mi consulta de inyección? Investigué un poco y encontré sp_makewebtask en el servidor Microsoft SQL, que puede generar un archivo .html en una carpeta compartida. ¿Cómo puedo hacerlo en MySQL? ¿O hay un mejor camino? Muchas gracias.

    
pregunta Jack Owen 09.10.2013 - 22:07
fuente

4 respuestas

5

El problema con su enfoque es que PHP no va a (De acuerdo, como se señala a continuación en los comentarios, es posible, pero es poco probable) ejecutar más de una consulta simultánea y está cerrando la consulta inicial con un punto y coma y luego intenta crear una nueva al inicio de SELECT . Tendrías que UNION o UNION ALL .

  

username'; SELECT * FROM users;

Debería ser similar a:

  

username='admin' UNION ALL SELECT CONCAT(username, 0x3A, password) AS details FROM users LIMIT 0,1;

Lea este enlace para ver la sintaxis UNION de MySQL enlace

Hay dos tipos principales de inyección de SQL, que son ciegos y basados en errores.

Ciego es donde no obtendrá ningún resultado de la consulta dada, puede que simplemente note un fragmento de texto o imagen u otra cosa que falte en la página, y debe enumerar varias opciones para obtener el resultado deseado.

Basado en el error es, como sugiere su nombre, donde el script generará un error y podrá ver exactamente lo que necesita hacer. Verá el resultado de la inyección en algún lugar de la página o en el código fuente de la página al menos.

En todos los casos, debería poder usar la sintaxis INTO OUTFILE de MySQL para generar los resultados de la consulta en un archivo, asumiendo que tiene los permisos adecuados para hacerlo.

enlace

Esto es para la mayoría de los casos de inyección de MySQL, sin embargo, hay más de dos tipos de SQLi, pero a los efectos de esta conversación, son los principales que debe conocer.

Este es un buen tutorial sobre inyecciones de SQL: enlace

    
respondido por el DarkMantis 09.10.2013 - 23:06
fuente
3

Bueno, hay herramientas como SQLMap que lo harán por ti, desafortunadamente no soy lo suficientemente inteligente como para saber exactamente cómo están obteniendo esos datos Con SQLMap puede generar una serie de cosas como nombres de bases de datos, nombres de tablas, columnas de tablas, datos de tablas y más.

Sin embargo, puedo dar un ejemplo de cómo puede generar datos en un escenario muy específico. No habla mucho sobre el contexto de su ataque de inyección de SQL, por lo que es difícil decir si esto se aplicará en su situación.

Digamos, por ejemplo, que tiene una página web que genera una tabla pequeña como la siguiente:

Product Name  | Price   
----------------------
Door knobs    | $5.00
Hammers       | $10.00
Saws          | $12.00

Dependiendo de cómo se configuren las consultas y la programación subyacentes, puede ser posible devolver otros datos que luego se mostrarán en esa tabla. Supongamos que determina que el parámetro de cadena de consulta search es inyectable en la siguiente URL:

http://mysite.com/store.php?search=hardware

Si puede crear una consulta como la que se muestra a continuación (dejando el ataque en texto sin formato para fines de demostración):

http://mysite.com/store.php?search=blah';SELECT username, password FROM USERS where '1'='1

El sitio podría programarse de tal manera que solo tome las dos columnas que fueron devueltas y las arroje a la mesa.

De nuevo, este es un ejemplo muy específico. El método SQLMap parece funcionar independientemente, por lo que me interesaría saber si alguien sabe lo que está haciendo.

    
respondido por el Abe Miessler 09.10.2013 - 22:44
fuente
3

Generalmente , un valor obtenido de SQL se muestra en alguna parte en la página. Entonces, por ejemplo, si la consulta está obteniendo un nombre ( Select name from users where id=%s ), inyecte algo como 1;select top 1 columnname from (your query here);-- . Dependiendo de la base de datos y la implementación, puede haber o no una forma de volcar la tabla completa con un solo comando (de lo contrario, siempre podemos enumerar las filas de la tabla).

En otros casos, uno puede inducir a la aplicación a mostrar errores de SQL. En ese caso, puede intentar usar la consulta (que devuelve una salida 1x1) como nombre de columna, por ejemplo, select (your query here) from somerandomtable; . Por lo general, esto devolverá un error (porque la columna no existirá) donde se expondrá el nombre de la columna propuesta.

    
respondido por el Manishearth 10.10.2013 - 06:45
fuente
0

Puedes hacerlo soltándolo en alguna parte: SELECT ... INTO OUTFILE por ejemplo. ( enlace )

Después de ese punto, puede sobrescribir un campo utilizando load_file () que devuelve un archivo como una cadena única y rellena un campo conocido en una sola fila que la aplicación lee y muestra.

(por ejemplo: "ACTUALIZAR cuentas SET bio = load_file ('/ etc / passwd') WHERE UserName = 'prettypinkponi3s';"

Incluso podría omitir ese paso y usar una actualización directamente en la inyección original. Y ese es el punto.

Si está inyectando a ciegas, puede aprovechar la falta de validación de entrada de la aplicación desde de la base de datos al idioma de representación. Y tienes que encontrar algunos valores que te permitan mantener los datos que estás intentando eliminar. (Imágenes de perfil, biografías, campos de descripción, etc.)

    
respondido por el Ori 10.10.2013 - 06:09
fuente

Lea otras preguntas en las etiquetas