sql injection update

Iniciado por wizache, 16 Diciembre 2006, 23:47 PM

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

wizache

Hoa que tal, pues me surgio una duda a ver si a alguein se el ocurre algo. BUeno resulta que ya desde hace unos meses encontre una vulnerabilidad, pues podria decirse enorme en mi universidad de sql injection, con esta y con un poco de imaginacion se puede tener total acceso a cualquier dato de la base de datos (muy grande por cierto) entre ellas claro las contraseñas de los profesores, q ademas no estan nisiquiera encripatadas, de hecho estoy preparando un pequeño manual sobre el tema qeu creo que ya casi domino y para devolver aunque sea un poco de lo que he aprendido aqui.

Pero hay algo de lo que tengo dudas, esta muy bien poder ver datos, pero qeu tal si yo quisiera modificar datos, para ver datos utilizo funciones como el UNION SELECT pero quisiera saber si hay una funcion como union pero para UPDATE es decir digamos que hay un lugar donde yo modifico mis datos de alumno, pero le agregara algo asi como "union UPDATE ...." para actualizar otros datos a los qeu no tengo acceso, en algunos otros sitios he usado el ; para delimitar un query y agregar otro pero aqui me marca el siguiente error:
Token ; was not valid. Valid tokens: <END-OF-STATEMENT>
entonces resumiendo, hay alguna otra forma de delimitar un select para seguido agregar un update o alguna otra forma de modificar datos
saludos y gracias ;)

axi

Por lo que veo, la BBDD parece una IBM DB2, también parece que la sentencia SQL se ejecuta dentro de algún bloque o quizás un procedimiento almacenado, como el caracter ';' se utiliza para la terminación de estos, cuando existe una sentencia SQL es necesario especificar un caracter de terminación diferente para diferenciarlos, usualmente se utiliza '@' pero puede ser cualquier otro, prueba y me cuentas.

Por cierto, DB2 permite ejecutar múltiples sentencias mediante ODBC?, no tiene que ver con el post, pero por curiosidad.

Un Saludo,

wizache

Estas en lo cierto es una ña base de datos es una IBM DB2, por el momento algo le pasa al servidor y no puedo probar lo del @ pero apenas se arregle pruebo ;D,
Aprovecho para hacer una pregunta, buscando informacion sobre este tipo de bases de datos no es la  primera vez que oigo eso de procedimiento almacenado, ¿a que se refiere eso? ¿Como es un procedimiento almacenado?
Acerca de lo de lo de multimples sentencias, la verdad es que no lo se tendre que investigar un poco mas,
Gracias y Saludos

axi

Cita de: 3s3qu3l3 en 22 Diciembre 2006, 04:27 AM
Aprovecho para hacer una pregunta, buscando informacion sobre este tipo de bases de datos no es la  primera vez que oigo eso de procedimiento almacenado, ¿a que se refiere eso? ¿Como es un procedimiento almacenado?

Para facilitar la independencia del código de las aplicaciones y aumentar la velocidad los motores de BBDD implementan un lenguaje específico suyo, por ejemplo en Oracle es PL/SQL, que permite programar directamente en la BBDD ciertas operaciones complejas.
Las ventajas que suelen tener, esque si tienes que pedir 30 datos, realizar operaciones con ellos, y coger el resultado, ganas en rendimiento, porque si simplemente haces la petición a un procedimiento almacenado, se hace de manera local en la BBDD y tú obtienes directamente el resultado. También si accedes desde diversas aplicaciones, tener las funciones creadas en el servidor te permite aislarte de la lógica de la BBDD. Aunque bueno, la desventaja es que si cambias de tipo de BBDD, tendrias que reahacer las funciones, porque los lenguajes no suelen ser demasiado compatibles.

Ejemplo cutre :
programa1

nombre = pedir_nombre(dni); /* lo pedimos a la BBDD con una sentencia SQL, tenemos que saber en que tabla, y que campo se encuentra, SELECT nombre FROM tabla WHERE dni = tal */

programa2

nombre = pedir_nombre(dni); /* Se pide el dni a una función de la BBDD, por ejemplo BBDD_GET_NAME(int dni ), solo tenemos que utilizar ese nombre de función, y se encapsula el resto en el procedimiento */

Es algo sencillo si lo ves, pero explicado quizás resulte un poco lioso,no sé si me habré explicado bien.

Yo aquí te pongo una función, los procedimientos son similares.
Por ejemplo, la función BBDD_GET_NAME nos devolveria el nombre de alguien dando su dni, en PL/SQL ( hecho de memoria y con fallos de sintaxis supongo ) :

CREATE OR REPLACE FUNCTION BBDD_GET_NAME (dni IN NUMBER) RETURN VARCHAR AS
BEGIN
varchar name(30);

IF dni<0 THEN
    Return -1;
END IF;

BEGIN

  SELECT nombre
  INTO name
  FROM tabla
  WHERE dni = dni

END
return name
END BBDD_GET_NAMEl;
/


Cita de: 3s3qu3l3 en 22 Diciembre 2006, 04:27 AM
Acerca de lo de lo de multimples sentencias, la verdad es que no lo se tendre que investigar un poco mas,

Lo comento, porque en Oracle por ejemplo no se puede, lo cual dificulta mucho el poder alterar los datos, ya que por ejemplo no puedes realizar un UPDATE y un SELECT separados por ; a través del string ODBC.
También tendrás que tener en cuenta, que quizás el usuario de la BBDD con la que se ejecute esa sentencia no tenga privilegios suficientes para alterar la tabla.

Un Saludo,

wizache

Te agredezco mucho por la ayuda, me quedo claro y me ayudo muhco, sobre lo de ejecutar multiples sentencias, pues no pude encontrar algun "end-of-statement" para intentarlo, y sobre los privilegios, he encontrador tantas vulnerabilidades en la pgina que dudo que el administrador se haya preocupado en eso pero habria que probar , googleare un poco a ver que encuentro, si no me conformare con lo que ya logre que era mi objetivo  que no esta nada mal, usuarios y contraseñas de alumnos y porfesores jeje  (lo demas es por puro ego), todo con fines educativos claro ;D
De todas maneras dejo los datos de la base de datos que em regresa el error que como dices es una de IBM
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0104


Saludos y de nuevo gracias