Algun entendido en SQL Injection?

Iniciado por Ertai, 10 Mayo 2005, 18:54 PM

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

Ertai

Despues de intentar un injección SQL con esta URL:

http://*****/wowbb/view_user.php?list=1&letter=&sort_by=SQL INJECTION

Donde pone SQL INJECTION, yo puse ' HAVING 1=1-- para que me diera un error y poder sacar información.
Y saco esto:

Petición SQL Inválida: SELECT u.*, m.mana FROM wowbb_users u LEFT JOIN wowbb_manas m USING (user_id) WHERE user_activation_key = '' ORDER BY , u.user_name LIMIT 0, 40-You have an error in your SQL syntax near ' u.user_name LIMIT 0, 40' at line 1

Pero lo intento todo y me quedo en el mismo error, no avanzo  :'(
Alguien me puede ayudar?
Recuerdo que lo que yo pongo va despues de ORDER BY

Saludos,
Ertai
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;
}

Rojodos

Tienes dos opciones, que tendras que buscar:

- subconsutas.

- UNION SELECT

Busca info al respecto, referidas a MySQL. Te costara algo buscarlo, pero fijo que lo encontraras con un poco de google y paciencia.

Tambien puedes probar con ; SELECT ..... -- pero normalmente, por seguridad, MySQL no permite separar instrucciones MySQL por ";".

Salu2

Ertai

Citar
Tambien puedes probar con
Código:
; SELECT ..... --
pero normalmente, por seguridad, MySQL no permite separar instrucciones MySQL por ";".

Buena idea! Tiene su lógica, probaré, pero como tu dices, sería muy descuidado por su parte dejar separar instrucciones.

Citar
Tienes dos opciones, que tendras que buscar:

- subconsutas.

- UNION SELECT

Busca info al respecto, referidas a MySQL. Te costara algo buscarlo, pero fijo que lo encontraras con un poco de google y paciencia.

Buscaré con paciencia.

Gracias Rojodos.
Ertai.
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;
}

ColdWinteR

Yo también buscaré info al respecto; si la encuentro la pondré aquí mismo. Si por el contrario, encuentras algo antes que yo, hazlo saber :)

ColdWinteR

#4
Para que no te dé error has de poner una de las tablas detrás del ORDER BY, pues si no, estás pasándole como argumento a dicha función ", u.user_name LIMIT 0, 40-".
Si el código del SQL Injection comienza justo detrás del ORDER BY, lo primero que tendrás que poner será una tabla (por ejemplo, m.mana), y a raíz de ahí, realizar tus consultas mediante UNION SELECT.
Y ahí es donde radica mi problema xD Yo estoy probando otro SQL Injection muy similar a este, sobre Invision Power Board. Este es el PoC:
http://www.example.com/forums/index.php?act=Members&max_results=50&st=SQL_INJECTION
Al introducir esto en el navegador, sobre un foro vulnerable, se obtienen los siguientes resultados:
mySQL query error: SELECT m.columnas
    FROM la_tabla
    ORDER BY m.columnas asc
    LIMIT SQL_INJECTION,50
mySQL error: 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 'SQL_INJECTION,50' at line 8

Esto me hizo deducir que la inyección se producía sobre el primer parámetro de LIMIT. El segundo parámetro, es el que se le atribuye en "max_results" en el navegador. Por tanto (y dándole muchas vueltas al tema mareado por google, porque no tenía ni idea de mySQL XD), finalmente he conseguido algo así:
mySQL query error: SELECT m.columnas
    FROM la_tabla
    ORDER BY m.columnas asc
    LIMIT 0,50 UNION ALL SELECT * FROM la_tabla LIMIT 0,50

...y este ha sido el error:
mySQL error: Wrong usage of UNION and ORDER BY
Fallo en el ORDER BY y en el UNION... y no toqué el ORDER BY. He llegado a la conclusión de que falla debido a que las dos consultas deben ir entre paréntesis, aunque no estoy seguro; digo esto porque siempre que he visto un UNION, las consultas que "unía" estaban en esta situación.
No obstante, el caso es que estoy "atascado", y tampoco sé cómo meter los paréntesis al principio y al final de cada consulta en mi navegador. ¿Alguna idea?

Rojodos

Hablo de memoria pero creo que los UNION SELECT van detras de una consulta SQL que no se cumple.

Por eso, se suele poner un AND 1=2 UNION SELECT .....

El 1=2 obviamente no se cumple, entonces se ejecuta el union select.

Hay bastantes papers sobre SQL inject, aunque la mayoria para servidores MSSQL o Oracle, deberas buscar un poco para encontrar algunos que hablen de SQL injection en aplicaciones que usen BD MySQL.

Salu2

ColdWinteR

Los UNION unen los resultados de dos consultas, independientemente de si se cumplen o no.
Efectivamente, ayer seguí buscando, y el error está en que existe una ambigüedad entre el UNION y el ORDER BY, por lo que es necesario el uso de paréntesis al principio y al final de cada una de las dos consultas:
(SELECT campo1,campo2 FROM tabla WHERE campo1>50 ORDER BY campo2 asc) UNION (SELECT campo2,campo3 FROM tabla WHERE campo3<50 ORDER BY campo2 asc)
Algo como esto devolvería los registros de los campos "campo1" para los cuales fueran mayores a 50; todos los registros del "campo2"; y los registros menores a 50 del "campo3" de la tabla "tabla", ordenados ascendentemente por el "campo2".
Si no estuviera ese maldito ORDER BY, no sería necesario el uso de paréntesis, y en mi caso, ni se puede quitar ni se puede meter entre paréntesis la primera consulta.
Quizás se pueda sacar algo con esto por "fuerza bruta" mediante subconsultas... porque las otras dos cláusulas que se pueden usar después de un LIMIT, aparte de UNION, son INTO y PROCEDURE, y creo que no son aprovechables aquí.
Esa es mi investigación hoy... xD ThX :)