Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   La Taberna (https://www.clubdelphi.com/foros/forumdisplay.php?f=40)
-   -   Aprendiendo de los errores de otros en BDs (https://www.clubdelphi.com/foros/showthread.php?t=78374)

mamcx 15-04-2012 20:03:33

Cita:

Empezado por roman (Mensaje 430057)
¡Vaya! Parece que seguimos esquivos. El caso es que no dan un sólo ejemplo de inyección de código debido al uso de % sin parámetros. He visto algunos ejemplos pero se deben en realidad al uso de apóstrofos. Creo que soy de la opinión de Delphius.

Eso, o simplemente no les parece adecuado compartir sus conocimientos.

// Saludos

Es porque te has centrado en la parte de "rompimiento" y no en la de "extracción de información".

Hacer un
Código SQL [-]
drop table
es un daño, pero aparte de tumbar el servicio no provee una ventaja. El ejemplo de los apostrofes es para obtener acceso (login) o eliminar un filtro del SQL.

Ahora bien, una vez estas dentro, que es lo que sigue? Si no estas buscando tumbar el servicio, la opción logica es minar información. Es este punto donde entra el asunto del '%':

Extraer info de los usuarios (averiguar la info de Bob):

http://www.unixwiz.net/techtips/sql-injection.html
Cita:

We can do the query on email name or full name (or presumably other information), each time putting in the % wildcards that LIKE supports:
Código SQL [-]
SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = 'x' OR full_name LIKE '%Bob%';

Injectando el sql desde un query de pagina & deduciendo la tabla que tiene los logins de usuarios:

http://www.securiteam.com/securityre...DP0N1P76E.html
Cita:

We also can search for data using LIKE keyword:
Código SQL [-]
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Osea, lo que falto aclarar antes es que el ejemplo clásico de inyección es de rompimiento (acceso), pero una vez dentro, es uso mas "tradicional" del sql, el conocimiento del lenguaje, el tipo de motor, entorno, etc. Hay se usa el rango completo, como acceso a tablas de sistemas, funciones, comandos de búsqueda (donde entra el %!!!), etc...

El error mio fue presumir que era obvio que se puede usar cualquier comando del SQL con una inyección, sin ser claro en el porque..

Es por eso que se puede usar el '%' para una inyección, es cosa de darse cuenta que la inyección no solo rompe, sino que tambien extrae información.

roman 16-04-2012 16:08:05

No hombre, no. Para que tú puedas poner una consulta como las de arriba, necesitas inyectarla. Y para eso es necesario que puedas poner apóstrofos sin restricciones. Una vez que puedes hacer esto entonces claro que puedes hacer uso del comodín para averiguar información. Pero el mal no está en el comodín en sí.

Es por eso que molesta ver este tipo de mensajes en donde se hace una afirmación que asusta y que no necesariamente es correcta.

Digámoslo de otra manera. Un código como este:

Código Delphi [-]
Query1.SQL.Add('select * from tabla where nombre like ' + Edit1.Text );

deja abierta la puerta a la inyección SQL. Pero si escapamos los apóstrofos:

Código Delphi [-]
Query1.SQL.Add('select * from tabla where nombre like ' + Escape(Edit1.Text ));

sigo sin ver dónde está el problema con que el usuario escriba un comodín. Los ejemplos que pones se basan en poder inyectar una sentencia con comodín pero gracias a que se deja abierta la puerta del apóstrofo.

Es decir, no es que no entienda cómo usar el comodín para extraer información, una vez rota la entrada (usando tus términos). El caso es que el mensaje original dice, textualmente:

Cita:

He visto muchos casos donde por ejemplo en un soft de gestión, para buscar un producto por nombre le piden al usuario que escriba un "%" como comodín si no se sabe el nombre completo
Dando a entender que el mero uso del comodín es nocivo, sin siquiera saber si el software en cuestión usa o no parámetros, y aún no usándolos, sin saber si escapa o no los apóstrofos.

// Saludos

Chris 16-04-2012 20:46:59

Cita:

Empezado por roman (Mensaje 430104)
Dando a entender que el mero uso del comodín es nocivo, sin siquiera saber si el software en cuestión usa o no parámetros, y aún no usándolos, sin saber si escapa o no los apóstrofos.

No creo que Mario halla querido ensañarse con el comodín. Más bien debe ser un hipotético escenario en donde los desarrollares dejan al usuario ingresar código SQL arbitrariamente, confiando en la buena voluntad de los usuarios. O aveces, también confiando en la ignorancia de ellos...

Chris 16-04-2012 20:56:50

Cita:

Empezado por Delphius (Mensaje 430024)
Yo algo de injección SQL he escuchado, leído e investigado pero no he dedicado tiempo como para ponerlo en análisis y pruebas. En lo que hace a aplicaciones de escritorio, si el usuario no tiene demasiadas posibilidades de meter dedo ¿nos libra de algún ataque? :rolleyes:
Se escucha mucho hablar de injección SQL en el entorno web, es más las fuentes que estuve viendo de tu enlace se centra esto, pero hasta el momento no he visto algún artículo que hable de esto para aplicaciones de escritorio ¿Vale lo mismo?

Saludos,

Sí, vale igual.

Imagínate que tienes una ventana, en ella tienes un TEdit dónde se supone que el usuario ingresará un valor a buscar. En tu código la búsqueda la procesas así:
Código Delphi [-]
Query1.SQL.Text = ('select * from clientes where no_cliente = ' + Edit1.text);

Si el usuario ingresa "101" en el TEdit, la consulta SQL anterior quedaría así: select * from clientes where no_cliente = 102.

Pero supongamos que el usuario, en lugar de ingresar un número, ingresa en el TEdit algo cómo: "102; delete from clientes where 1=1;", la consulta anterior quedaría así: select * from clientes where no_cliente = 102; delete from clientes where 1=1;.

Es obvio lo devastador que resultaría esta consulta, no? Eso es inyección de SQL. Es hacer que tu aplicación ingenuamente ejecute código SQL arbitrario, sea cuál sea. Esta vulnerabilidad hace a tu aplicación quedar como una tonta que hace todo lo que le dicen sin poner reparo.

Saludos

roman 16-04-2012 21:10:50

Cita:

Empezado por Chris (Mensaje 430136)
No creo que Mario halla querido ensañarse con el comodín. Más bien debe ser un hipotético escenario en donde los desarrollares dejan al usuario ingresar código SQL arbitrariamente, confiando en la buena voluntad de los usuarios. O aveces, también confiando en la ignorancia de ellos...

Tienes razón. En realidad mi crítica no va tanto hacia el comentario de mamcx, sino al original de AzidRain. Vamos a ver: al leer el comentario original que abrió el hilo, de inmediato me vino a la mente un programa en el que hago precisamente eso: dejar que el usuario ponga un comodín para realizar búsquedas. Claro que yo lo hago usando parámetros. Pero al ver, así a secas, que se menciona el uso del comodín como uno de los ejemplos en donde tal vez por comodidad practicamente se puede hacer de todo, pues me alerto y por ello pregunto en qué reside el peligro del comodín. Y la única respuesta que he recibido se refiere a la no precaución de evitar los apóstrofos.

Lo que puedo concluir hasta el momento es que no tiene ningún peligro permitir que el usuario escriba un comodín en la consulta. A menos, claro, que no escape (bien directamente o bien por el uso de parámetros) el apóstrofo, pero eso es harina de otro costal.

// Saludos


La franja horaria es GMT +2. Ahora son las 11:40:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi