martes, 4 de febrero de 2014

SQL Injection - Introducción



Según se define en Microsoft, SQL Injection es un ataque en el cual se inserta código malicioso en las cadenas que posteriormente se pasan a una instancia de SQL Server para su análisis y ejecución.

Es decir, en este ataque se aprovecha un mal filtrado en la entrada de datos para así realizar la consulta que queramos en la base de datos.

¿Que alcance tiene esta técnica?

Pues bien, si tuviesemos una web vulnerable a SQL Injection, cualquier atacante podría extraer/modificar/borrar toda nuestra base de datos incluyendo usuarios y contraseñas que se almacenasen en ella, hacerse con el control de dicha web, hacer un defacement, meter codigo malicioso para infectar a los visitantes, etc.

Un ataque así realizado a una simple página personal no tendría mucha repercusión, pero imaginemos que dicho ataque, se realizase a una gran empresa o a una web que ofrezca un software muy popular que utilicen muchas personas.
Si fuese así y se diese a conocer dicho ataque, bajaría mucho la confianza de dicho sitio, mucha gente ya no visitaría la web y la empresa perdería reputación, clientes y dinero.

¿Qué tipos de lenguajes de programación son vulnerables?

La inyección se puede realizar cualquier lenguaje que sea capaz de llamar a la base de datos y concatenar los datos que le pasen, aunque PHP y ASP son los más habituales.

¿Cómo sabemos si una web es vulnerable a SQL Injection?

Imaginémos que tenemos una web con, por ejemplo, una galeria de imágenes.
Cuando accedemos a la sección de la galeria nos muestra una url como esta:

http://miwebvulnerable.com/gallery.php?id=1

Normalmente para identificar si es vulnerable o no, se le añadiría una comilla detras del "1" y si fuese vulnerable podrían pasar 4 cosas:
  • La web se desfigura.
  • Muestra un mensaje de error.
  • Tarda mucho en recargar la página.
  • La web no se desfigura, no muestra errores y muestra la página tal y como estaba sin tardar en cargar.
 Si diesemos con cualquiera de los 3 primeros casos, estaríamos ante una web vulnerable.

Ahora si quisiesemos realizar una consulta, deberíamos identificar antes el tipo de base de datos, ya que cada una utiliza sus propias consultas. Ejemplo:

Sacar version en MySQL: php?id=1 UNION SELECT @@version--
Sacar version en Postgres SQL: php?id=1 UNION SELECT version()--
Sacar version en oracle: php?id=1 UNION SELECT version()--

¿Cómo podemos identificar la base de datos de un sitio web?

Existen diferentes herramientas que ayudan a identificar un sistema, una de ella es HttpPrint.
Esta herramienta se utiliza en el proceso de Fingerprinting y su función se basa en analizar el orden de las cabeceras de las respuestas HTTP, de los códigos de error cuando haces petición con un método no válido, versión de HTTP inexistente, o intentando usar un protocolo incorrecto.
Los servidores web no responden de la misma manera a estas situaciones, y esto se puede aprovechar para reconocer el comportamiento de un servidor en concreto.

¿Cómo proteger una web ante SQL Injection?
  •  Debemos aplicar una estricta validación a los datos.
  •  Evitar que se pueda ejecutar más de una sentencia SQL en el mismo comando.
  • Restringir los tipos de datos aceptados.
  • Utilizar funciones ya preparadas para realizar el trabajo con la Base de datos, como por ejemplo en PHP la función mysql_real_escape_string.
  • Implementar Web Application Firewall, como por ejemplo, Kona.


Esto ha sido todo por hoy.

Saludos!!!


Referencias:
http://technet.microsoft.com/es-es/library/ms161953%28v=sql.105%29.aspx
http://foro.elhacker.net/tutoriales_documentacion/tutorial_de_inyeccion_sql_sql_injection-t98448.0.html
http://spanish.akamai.com/enes/html/solutions/prevent_sql_injection_attack.html
https://www.youtube.com/watch?feature=player_embedded&v=LSySUX8n-PQ#t=327



**No me hago responsable del mal uso que se de a la información presentada. Esta información es de carácter didáctico.** 

No hay comentarios:

Publicar un comentario