Inyección SQL

La inyección SQL es uno de los palabros que más frecuentemente pueblan los blogs de seguridad informática, así como los servicios de alertas y gestión de vulnerabilidades.

sql

En líneas generales, la inyección SQL consiste en tratar de obtener beneficios como consecuencia de someter a una base de datos relacional SQL a comandos que en circunstancias normales, no son los que ejecuta o son distintos a los previstos en su programación. Se trata de mandarle comandos a la base de datos, para obtener algún privilegio que en circunstancias normales, no tendríamos. Esto se consigue identificando parámetros que no son saneados correctamente, y que por tanto, admiten código adjunto de índole maliciosa, que acompañe al código sin adulterar en las consultas. La definición de la Wikipedia es bastante bastante mejor ;)

Veamos un ejemplo real. Me váis a permitir que no ejemplifique las inyecciones SQL en entornos ASP, así nadie podrá decir que la he tomado por enésima vez con MS. Vamos a irnos al software libre, y para ello, podríamos a seleccionar al auténtico campeón mundial, a la hora de sufrir vulnerabilidades en lo que a PHP+SQL se refiere. No es otro que PHPNuke, auténtico número uno (seguido de cerca por Mambo Server) a la hora de sufrir inyecciones SQL. De todos modos, para ilustrar un caso reciente, nos vamos a ir a un problema de seguridad de Mambo.

El pasado 28 de agosto se documentó una vulnerabilidad en Mambo Server. Esta vulnerabilidad permitía, en versiones 4.5.4 y anteriores, pasarle a la aplicación, mediante un parámetro que emplea mambo llamado «id», código arbitrario SQL. El resultado final: posibilidad de adquirir privilegios de editor. Otro ejemplo podría ser esta otra vulnerabilidad en Mambo, mediante la cual es posible inyectar código vía los parámetros «field» y «catid».

Casos como estos, hay muchos, ya que los CMS en general, y especialmente Mambo y PHPNuke, son gestores muy expuestos en los que es relativamente frecuente que se puedan conducir ataques de inyección de código SQL. El ejemplo de la Wikipedia es bastante bueno, así que lo reproduzco, pues es muy fácil comprender de qué hablamos una vez leído. En negrita aparecen comentarios míos al código, para que todos lo comprendan perfectamente sin necesidad de saber SQL. He modificado ligeramente las consultas, para hacerlo más comprensible:

Asumiendo que el siguiente código está en una aplicación web y que existe un parámetro «nombreUsuario» que contiene el nombre de usuario que nosotros le demos, la inyección SQL es posible:

consulta := «SELECT * FROM usuarios WHERE nombre = ‘» + nombreUsuario + «‘;»

(seleccionamos de la tabla usuarios aquellas entradas cuyo valor sea el que el usuario ha introducido en el formulario)

Si el usuario escribe su nombre, digamos «Alicia», nada anormal sucedería, la aplicación generaría una sentencia SQL similar a la siguiente, que es perfectamente correcta, en donde se seleccionaría al usuario «Alicia»:

SELECT * FROM usuarios WHERE nombre = ‘Alicia’;

Pero si un usuario malintencionado escribe como nombre de usuario: «Alicia’; DROP TABLE usuarios», se generaría la siguiente consulta SQL:

SELECT * FROM usuarios WHERE nombre = ‘Alicia’;
DROP TABLE usuarios

(selecciona todos los usuarios que se llamen Alicia, y de paso cepíllate la tabla usuarios)

Creo que el ejemplo habla por sí mismo. Si queréis tener una óptica más específica sobre qué es la inyección SQL, no dejéis de ojear Understanding Sql Injection, escrito por el investigador Hardik Shah. Ejemplos de inyección SQL avanzada también hay muchos. Os recomiendo mirar Advanced SQL Injection in Oracle databases, y de paso comprobáis cómo todos los gestores de bases de datos están expuestos a este problema.

Y el que quiera más información, ahí tiene a Google :)

Un saludo ;)

6 comentarios sobre “Inyección SQL

  1. y de paso comprobáis cómo todos los gestores de bases de datos están expuestos a este problema.

    Hombre, es que más que un error del gestor de bases de datos es un error provocado por una mala programación… Igualmente si desde el código se hacen las comprobaciones pertinentes antes de ejecutar la select no debería de dar problemas en ningún gestor. Ni siquiera en el de Microsoft ;-)

    [OT:] ¿Qué tal por los madriles?¿aclimatado?

  2. Hombre, es que más que un error del gestor de bases de datos es un error provocado por una mala programación

    Me alegro de que lo comentes. No sabes la de gente que cree que estos problemas son ocasionados por el gestor, y no por errores de diseño que, tal y como comento, facultan que se pasen en las queries comandos maliciosos, por no haber saneado los parámetros.

    De momento yo diría que estoy casi casi al 100% aclimatado. Gracias ;)

    Échame tu móvil a mi pedazo de correo sergio UBICADO^EN sahw PUN*TITO com, y te llamo para tomar unas cañillas tan pronto sea posible ;)

    Saludos,

    PD: El que quiera dejarme su correo o teléfono en ese correo, es bienvenido, con vistas a tomar unas cañas claro (requisito, vivir en Madrid). Lo mismo nos juntamos 4 o 5, y cruzamos correos y nos vemos todos las caras.

  3. Un comentario: los escapes en php… probablemente de las pocas cosas en las que destaca este entorno.

    En php a las variables enviadas se les aplica por defecto un filtro que sustituye las comillas simples por un slash-comilla, con lo cual no es tan facil hacer una inyeccion. En su momento hubo problemas con la codificacion de caracteres en unicode, pero intuyo que ese tipo de cosas se han tenido en cuenta en las ultimas versiones.

    Por ultimo, señalar que por regla general, la mejor solucion para prevenir esos ataques son las consultas precompiladas (aparte de ser una buena optimizacion)

    saludos…

  4. Por ultimo, señalar que por regla general, la mejor solucion para prevenir esos ataques son las consultas precompiladas (aparte de ser una buena optimizacion)

    Consultas precompiladas y crear software de una manera profesional, es decir, aplicar ingeniería del software: metrodologías completas de análisis, desarrollo y mantenimiento ;)

    Un saludo :)

  5. yo tengo conociminetos de abse de datos SQL se todo respecto a las consultas, subconsultas,crear base de datos y hacer restricciones,pero lo k no se es onde popner todo ese codigo ,ya lo e tratado de poner en el codigo fuente y volver al text en text.html pero no abre

Comentarios cerrados.