PreguntasLinux

Versión Completa: [ARTICULO] Inyección SQL
Actualmente estas viendo una versión simplificada de nuestro contenido. Para ver la versión completa en el formato correcto, dale click aquí
Introduccion:

Como sabrán, hace unos días el sitio de preguntaslinux.org fue hackeado (en honor a la verdad fueron hackeados muchisimos sitios en Internet aparte de este).

N. del Mod.: esto sucedio en Agosto de 2005


Para aquellos que esten interesados en el tema de la seguridad informatica o simplemente para los que les interese saber que fue lo que paso y como fue posible, escribi este mini-articulo.

Antes que nada quiero decir que este articulo no es un manual de hacking ni pretende serlo. Simplemente intenta explicar uno de los temas de seguridad mas interesante que han surgido en los ultimos tiempos: la inyección SQL.

NOTA: Para un mejor entendimiento agregue un glosario de teminos al final del articulo.


Inyeccion SQL

Se entiente que hay Inyección SQL cuando se inserta o "inyecta" un codigo SQL "invasor" dentro de otro codigo SQL. Esto logra alterar el funcionamiento normal del ultimo, ejecutando maliciosamente el codigo del primero en una base de datos.

La inyeccion SQL es un problema de seguridad informática que debe ser tomado en cuenta por el o los programadores para prevenirlo. Un programa hecho con descuido, displicencia, o con ignorancia sobre el tema, podrá ser vulnerable y la seguridad del sistema puede ser ciertamente comprometida.

Esto puede suceder tanto en programas corriendo en computadoras de escritorio, como en páginas Web, ya que estas pueden funcionar mediante programas ejecutandose en el servidor que las aloja.

La vulnerabilidad ocurre cuando un programa "arma" descuidadamente una sentencia SQL, con parametros dados por el usuario, para luego hacer una consulta a una base de datos. Dentro de los parametros dados por el usuario se envia el codigo SQL inyectado.

Al ejecutarse esa consulta en la base de datos, el código SQL inyectado también se ejecutara y pudiendo hacer un sin numero de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos, e incluso, ejecutar código malicioso en el servidor.


Un ejemplo en concreto:

Por ejemplo, el siguiente codigo es usado muchas veces en la web en las conocidas paginas de login, donde aparte de Usuario y Contraseña tenemos el tipico link "Olvido su contraseña?" que nos envia por correo electronico la misma si es que nos la olvidamos:

SELECT fieldlist
FROM table
WHERE field = '$EMAIL';

Aca, $EMAIL es una variable que se reemplazara por la direccion que el usuario escriba en el formulario. Se ubica entre comillas simples ya que es un cadena de texto. Por lo pronto desconocemos el nombre de los campos o tablas involucradas, pero esto no es un problema.

Si en el formulario escribimos usuario@midominio.com'  (fijate que el ultimo caracter es una comilla simple) la sentencia SQL quedaria de la siguiente manera:

SELECT fieldlist
FROM table
WHERE field = 'usuario@midominio.com' ';

Al ejecutarse, el Sistema Gestor de Bases de Datos encontrara un error de sintaxis, ya que la sentencia termina con dos comillas simples en lugar de una.

El mensaje de error entregado al usuario dependera de los procedimientos internos de recuperación de errores del sistema, pero en la mayoria de los casos suele ser diferente de "email desconocido". Esta respuesta de error es una posible puerta de entrada ya que en apariencia los datos no estan siendo validados correctamente.

Por lo visto los datos que enviamos desde el formulario estan en la clausula WHERE de la sentencia SQL, podemos empezar a cambiar los mismos y ver que pasa...
podriamos ingresar, por ejemplo, algo como cualquiercosa' OR 'x'='x'. La sentencia SQL quedaria de la siguiente forma:

SELECT fieldlist
FROM table
WHERE field = 'cualquiercosa' OR 'x'='x';

Como la aplicacion no esta analizando la sentencia SQL podemos transformar el contenido de la clausula WHERE de uno a dos componentes. Ademas con el OR 'x'='x' nos aseguramos que sea cual sea el contenido de la primera clausula el resultado sera siempre true (verdadero)

Pero, a diferencia de la consulta original que devolveria de a un item por vez, esta version devolvera cada item de la tabla de la base de datos que contenga a los usuarios, es decir el usuario y contraseña de TODOS los usuarios del sistema.

En la "vida real" la inyeccion SQL no se limita a un "formulario" sino que se utilizan tecnicas mas avanzadas, que incluyen la programación de algun script que pueda pasar por encima de la aplicacion vulnerable y asi evitar dejar "huellas".
  
Como decia al comienzo, los programadores deberian tomarse el tiempo necesario para probar estas cosas y evitar abrir involuntariamente puertas traseras que puedan ser utilizadas por personas malintencionadas.


En el caso del sitio de Preguntaslinux, el software utilizado para los foros contenia una vulnerabilidad que explotaba la inyeccion SQL que no pudo "emparcharse" a tiempo 1-cry  


Glosario:

SQL: El Lenguaje de Consulta Estructurado (Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones sobre las mismas. Reune caracteristicas del algebra y el calculo relacional permitiendo ejecutar consultas con el fin de recuperar, modificar o insertar información de interes de una base de datos, de una forma sencilla.

Base de Datos: es un conjunto de datos que pertenecen al mismo contexto almacenados sistemáticamente para su uso posterior. En informática existen los Sistemas Gestores de Bases de Datos (SGBD), que permiten almacenar y posteriormente acceder a los datos de forma rapida y estructurada. Entre los SGBD mas conocidos podemos nombrar: DB2, Ingres, MySQL, Oracle, PervasiveSQL, PostgreSQL, SQL server, Sybase, etc.

Seguridad Informatica: Consta de procedimientos que buscan la proteccion contra los riesgos asociados a la informática. Los riesgos son en función de varios elementos:

• las amenazas que pesan sobre los activos (datos) a proteger
• las vulnerabilidades de estos activos
• su sensibilidad, la cual es la conjunción de diferentes factores:
-> la confidencialidad
-> la integridad
-> la disponibilidad o accesiblidad



Espero que les sea util. Saludos!!!! 1-wink
groso chaban..... lastima que nos castigaron feo con eso 1-sad
URLs de Referencia