aplicaciones web seguras (anti-sqli)

9
Aplicaciones Web Seguras Anti-SQLinjection Autor: Francisco José Cruz Jiménez 2º ASIR

Upload: francisco-jose-cruz-jimenez

Post on 13-Jun-2015

418 views

Category:

Education


1 download

DESCRIPTION

Trabajo sobre Aplicaciones Web Seguras, en concreto Anti-SQL Injection, del módulo de Seguridad y Alta Disponibilidad del Ciclo Formativo de Grado Superior en Administración de Sístemas Informáticos en Red

TRANSCRIPT

Page 1: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones

Web Seguras Anti-SQLinjection

Autor: Francisco José

Cruz Jiménez

2º ASIR

Page 2: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

2

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

Aplicaciones Web

Seguras

Este documento ha sido realizado por:

© Francisco José Cruz Jiménez

Diciembre 2013

Algunos derechos reservados. Este artículo se distribuye

bajo la licencia “Reconocimiento-NoComercial 4.0 Internacional "

de Creative Commons, disponible en

http://creativecommons.org/licenses/by-nc/4.0/

Page 3: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

3

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

Aplicaciones Web

Seguras

Contenido

Introducción a las Aplicaciones Web ............................................................................... 4

Problemas de seguridad en Aplicaciones Web .................................................................. 5

Recomendaciones generales de seguridad para aplicaciones Web ................................. 5

Ejecutar aplicaciones con privilegios mínimos ............................................................. 5

Protegerse contra entradas malintencionadas ............................................................. 6

Tener acceso seguro a bases de datos ....................................................................... 6

Crear mensajes de error seguros .............................................................................. 6

Mantener segura la información confidencial .............................................................. 6

Usar cookies de forma segura .................................................................................. 6

Protegerse contra amenazas de denegación de servicio ............................................... 6

SQL Injection............................................................................................................... 7

Aplicaciones Web Anti-SQLi ........................................................................................... 8

PHP ...................................................................................................................... 8

Perl ....................................................................................................................... 8

Java ...................................................................................................................... 8

'or'1'=1 ................................................................................................................. 9

Page 4: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

4

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

Introducción a las Aplicaciones Web

En la ingeniería de software se denomina aplicación web a aquellas herramientas

informáticas que los usuarios pueden utilizar accediendo a un servidor web a través de

Internet o de una intranet, normalmente accediendo mediante un navegador web. Estas

aplicaciones o software se codifica en un lenguaje soportado por los navegadores web,

algunos de estos lenguajes son:

PHP Java, con sus tecnologías Java Servlets y JavaServer Pages (JSP)

Javascript Perl Python C# y Visual Basic con sus tecnologías ASP/ASP.NET

Las aplicaciones web son populares debido a lo práctico del navegador web como

cliente ligero, independientemente del sistema operativo que se use, carece de instalaciones,

así que no ocupa espacio en disco, así como a la facilidad para actualizar, mantener y

distribuir aplicaciones web sin

distribuir e instalar software a miles

de usuarios potenciales. Existen

aplicaciones como los webmails,

wikis, weblogs y tiendas online que

son ejemplos bien conocidos de

aplicaciones web. Moodle es un

ejemplo de aplicación web (Ver

imagen derecha).

Una aplicación web está

normalmente estructurada como una

aplicación de tres capas, aunque

existen muchas variaciones posibles. En su forma más común, el navegador web ofrece la

primera capa (la interfaz que se muestra al usuario), la segunda capa o capa intermedia es

un motor capaz de usar alguna tecnología web dinámica, por ejemplo las mencionadas

anteriormente. Por último, una base de datos constituye la tercera y última capa.

Su funcionamiento suele ser el siguiente, el navegador web manda peticiones a la capa

intermedia que ofrece servicios valiéndose de consultas y actualizaciones a la base de datos y

a su vez proporciona una interfaz de usuario. Es importante mencionar que una página Web

puede contener elementos que permiten una comunicación activa entre el usuario y la

información. Esto permite que el usuario acceda a los datos de modo interactivo, gracias a

Page 5: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

5

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

que la página responderá a cada una de sus acciones, como por ejemplo rellenar y enviar

formularios, participar en juegos diversos y acceder a gestores de base de datos de todo tipo.

Problemas de seguridad en Aplicaciones Web

El tema de la creación de una aplicación Web segura es muy amplio ya que requiere

realizar un estudio para conocer y comprender los puntos vulnerables de la seguridad. Es

esencial entender cómo usar estas características de seguridad para enfrentarse a las

amenazas, ya que con una aplicación web se da un servicio a los usuarios, éstos, en la

mayoría de los casos, introducen y confían sus datos y sus asuntos privados, así que para

ofrecer un buen servicio a aquellos que han confiado en usar la aplicación web hay que

mantener seguros y proteger sus datos e información confidencial a toda costa.

Aunque a la hora de crear una aplicación web no se tenga mucha experiencia en

seguridad, existen unas medidas básicas que siempre se deberían de adoptar para proteger

cualquier aplicación web. La lista siguiente proporciona pautas de seguridad mínima que se

aplican a todas las aplicaciones web y que se deberían seguir:

Recomendaciones generales de seguridad para aplicaciones Web

Utilizar firewall y establecer programas antivirus para supervisar el trafico entrante

y saliente Mantener todo el software instalado totalmente actualizado Ubicar el equipo del servidor en un lugar físico seguro Cierrar los puertos que no se utilicen y desactive los servicios no usados.

Ejecutar aplicaciones con privilegios mínimos

No ejecute la aplicación identificado como el administrador del sistema. Ejecutar la aplicación con un usuario con los mínimos privilegios posibles. Mantener los archivos de la aplicación web en una carpeta ubicada debajo del raíz

de la aplicación.

Page 6: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

6

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

Protegerse contra entradas malintencionadas

Nunca dar por segura del todo una aplicación web ya que a los usuarios malintencionados les resulta fácil enviar información potencialmente peligrosa desde el cliente a la aplicación.

Establecer filtros.

Tener acceso seguro a bases de datos

Usar el sistema de seguridad de la base de datos para limitar quién puede tener acceso a los recursos de dicha base.

Si la aplicación utiliza el acceso anónimo, crear un único usuario con permisos muy

limitados, y hacer que las consultas se ejecuten conectándose como dicho usuario. No crear instrucciones SQL concatenando cadenas que contengan información

aportada por los usuarios (Lo desarrollaré posteriormente).

Crear mensajes de error seguros

No escribir mensajes de error que presenten información que pudiera resultar útil a los usuarios malintencionados, como un nombre de usuario.

Configure la aplicación para que no muestre errores detallados a los usuarios. Controlar bien las excepciones.

Mantener segura la información confidencial

Si la aplicación transmite información confidencial entre el explorador y el servidor, utilizar el protocolo SSL.

Utilizar algoritmos de cifrado de alta seguridad.

Usar cookies de forma segura

No almacenar información vital en cookies. Establecer el período de tiempo mínimo posible para la fecha de expiración de las

cookies.

Protegerse contra amenazas de denegación de servicio

Establecer límites de tamaño para consultas a bases de datos, o subida de

archivos. Configurar servidor para utilizar la regulación de procesos, que evita que una

aplicación use una cantidad desproporcionada de la CPU.

Page 7: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

7

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

Como podemos ver, hay multitud de precauciones que se deben de tomar, en este

trabajo nos vamos a centrar en las bases de datos, concretamente en prevenir el uso

malintencionado de consultas a las bases de datos de la aplicación web, con la infiltración de

código intruso, esto recibe el nombre de SQL Injection.

SQL Injection

Este tipo de ataque consiste en inyectar código SQL en una sentencia SQL ya

programada, con el fin de alterar el funcionamiento de la base de datos. Consiste en generar

consultas a la base de datos para que nos devuelva datos de interés, como usuarios,

contraseñas, información personal de los clientes, etc...

Decir que SQL es un lenguaje normalizado, estructurado de consultas a bases de datos.

Esto quiere decir, que en casi todas las consultas a distintos tipos de bases de datos, se usan

las mismas sentencias. SQL cuenta con dos tipos de comandos, que son los DLL (permiten

crear y definir bases de datos, campos e índices) y por otro lado los comandos DML (permiten

generar consultas, filtrar y extraer datos de la base de datos). Como con SQL Injection se

quiere conseguir datos de interés generando consultas a la base de datos, el tipo de comando

que se usa son los DML.

El origen de esta vulnerabilidad radica en el incorrecto chequeo y/o filtrado de las

variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho,

un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier

lenguaje de programación o script que esté embebido dentro de otro.

Para mostrar un ejemplo de SQL Injection, adjunto un videotutorial realizador por mí,

alojado en YouTube. Lo que se hace a lo

largo de este tutorial, será inyectar código

SQL a una web, con el fin de ocasionarle

errores a la base de datos para que

devuelva datos que usaremos en nuestra

inyección y finalmente obtener usuario y

contraseña del administrador. El enlace es

el siguiente (la imagen de la derecha

contiene un hipervínculo):

http://www.youtube.com/watch?v=

u15Pj74hWk4

Page 8: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

8

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

Aplicaciones Web Anti-SQLi

Conocido el problema, ahora hay que poner solución a este. Para que una aplicación

web no tenga esta vulnerabilidad, las medidas que hay que tomar depende del lenguaje que

se esté usando para acceder a la base de datos, aquí unos ejemplos de cómo evitar SQLi:

PHP

En el lenguaje PHP, hay diferentes funciones que pueden servir de ayuda para usar con

distintos sistemas de gestión de bases de datos. Si se usa MySQL, la función a usar es

mysql_real_escape_string:

$query_result = mysql_query("SELECT * FROM usuarios WHERE nombre =

\"" . mysql_real_escape_string($nombre_usuario) . "\"");

Perl

En lenguaje Perl, el método DBI::quote filtra los caracteres especiales:

$query = $sql->prepare

(

"SELECT * FROM usuarios WHERE nombre = "

.

$sql->quote($nombre_usuario)

);

Java

En lenguaje Java, se puede usar la clase PreparedStatement:

Connection con = (acquire Connection)

Page 9: Aplicaciones Web Seguras (Anti-SQLi)

Aplicaciones Web Seguras

9

Seguridad y

Alta Disponibilidad

Autor: Francisco José Cruz Jiménez

PreparedStatement pstmt = con.prepareStatement("SELECT * FROM

usuarios WHERE nombre = ?");

pstmt.setString(1, nombreUsuario);

ResultSet rset = pstmt.executeQuery();

'or'1'=1

Con respecto a la segunda parte del videotutorial, el uso de la sentencia 'or'1'=1, la

solución consiste en no concadenar los campos en la select que se va a usar para verificar un

usuario y contraseña, un ejemplo de mal configuración:

Select id

from t_usuarios

where usuario='$usuario' and pass='$pass';

Ya que si introducimos admin como usuario y la sentencia

'or'1'=1 como contraseña, el resultado será este, que como se

puede ver abajo, se cumple, así que si existe un usuario admin nos

logueará.

Select id

from t_usuarios

where usuario='admin' and pass=''or '1'='1';