Tuve que preparar esta presentación para explicar en clase cómo es una inyección de SQL. Tal vez a alguien le sea de utilidad, así que lo dejo para descargar, junto con el código para explicarlo con un ejercicio. Hay otros ejemplos parecidos referidos desde la wikipedia, pero están en inglés. La inyección de SQL es la típica cosa que contada no se entiende, pero una vez la has visto no se te olvida.
La presentación:
En este fichero rar están el vídeo, el código fuente del script y la estructura de la tabla para postgres. No es difícil pasarla a otro sistema de base de datos. El ejemplo es un script que gestiona una tabla. No usa APIs ni abstracciones como PEAR porque los alumnos están aprendiendo lo básico.
El vídeo muestra el ejemplo de inyección aplicado a un sencillo formulario de consulta y modificación de una tabla en base de datos. El ejercicio original de mantenimiento de la tabla no contemplaba protecciones a posta, para posteriormente ilustrar el concepto de forma cruda.
La idea es que los programadores no comprueban los datos que llegan de fuera y los insertan en su programa alegremente. Eso es tremendo, porque un programa es una ventana abierta a tu sistema, y, si está en internet, esa ventana da al mundo. Ocurre más a menudo de lo que la gente piensa, porque el mercado laboral necesita muchos informáticos, y la gente se incorpora muy verde, y porque se trabaja muy deprisa y no se dedica tiempo suficiente a los detalles.
Los datos elementales como la tabla se pueden deducir. Por ejemplo, casi todo el mundo emplea nombres de tabla parecidos: "users", "usuarios", etc. Si se muestran errores por pantalla, además se puede obtener más información.
Los ataques de este tipo tienen varios remedios. En primer lugar, la inyección se previene mediante una técnica de lista blanca: dices qué aceptas, no qué no aceptas, de forma que reduces las opciones abiertas y tu programa es controlable. Por ejemplo: si esperas un número, no aceptes otra cosa. Para eso, hay que comprobar primero los datos, tanto en tipo como en longitud. En segundo lugar, hay que tener un buen diseño. Por ejemplo, en este video de otra inyección SQL, el atacante hace login porque la aplicación está mal planteada y, en realidad, no se comprueba estrictamente la contraseña, si no si una consulta ha dado un resultado positivo lo que, aparentemente, es lo mismo, pero no, porque hay varias respuestas válidas a la comprobación (en otras palabras, se pretende comprobar una cosa, pero se está comprobando otra condición distinta que contiene lo que preguntas, y más cosas que no preguntas). En tercer lugar, el propio lenguaje de programación tiene sus mecanismos para evitar esta clase de intrusiones, pero no son perfectos. Por ejemplo, se escapan las comillas y no se ejecutan ciertas instrucciones drásticas si vienen en grupo. Por ejemplo, PHP no ejecuta un droptable
si la instrucción viene acompañada por un select
en la misma orden de ejecución.
Una página colectiva y ecléctica para comentar y apuntar cosas.
Estás viendo los archivos de Marzo de 2007. Visita la portada para ver las últimas notas.
Si quieres curiosear, puedes consultar:
http://tira.escomposlinux.org
La tira ecol ha vuelto.