Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

52
Prevención ante ataques XSS Algunos pequeños consejos para programadores 3º Betabeers Córdoba 29 de Noviembre de 2012 José María Canto Ortiz

description

Taller "prevención ante ataques XSS" de la mano de José María Canto en BEtabeers Córdoba

Transcript of Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Page 1: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Prevención ante ataques XSS

Algunos pequeños consejos para programadores

3º Betabeers Córdoba

29 de Noviembre de 2012

José María Canto Ortiz

Page 2: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Lo que soy

Diplomado en Informática

Analista Programador

Más 12 años de experiencia

Colegiado CPITIA

Ciclista aficionado

Page 3: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Mi experiencia

Programador web ISP local

Autónomo

2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012

Page 4: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

¿Qué es XSS?

Según Wikipedia:

Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad típico de las aplicaciones Web, que permite a una tercera parte inyectar en páginas Web vistas por el usuario código JavaScript o en otro lenguaje script similar, evitando las medidas de control.

Se le llamó XSS para no crear confusión con CSS, las hojas de estilo en cascada.

No se pretende hacer apología de este tipo de ataques, sino más bien, intentarcombatirlo con las armas que tiene un programador.

Page 5: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

¿Qué es XSS?

Según Wikipedia:

Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad típico de las aplicaciones Web, que permite a una tercera parte inyectar en páginas Web vistas por el usuario código JavaScript o en otro lenguaje script similar, evitando las medidas de control.

Se le llamó XSS para no crear confusión con CSS, las hojas de estilo en cascada.

No se pretende hacer apología de este tipo de ataques, sino más bien, intentarcombatirlo con las armas que tiene un programador.

Un ataque que permite la introducción de código de algún tipo en una página web.

Page 6: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Posibles puntos de entrada

Tablones de anuncios

Libros de visitas

Foros de discusión

Formularios de contacto

Búsquedas

Parámetros

Page 7: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

¿Cómo pueden ocurrir?

Aumento de la interacción con el usuario.

No se validan formularios con Javascript.

Si se hace puede que el atacante tenga Javascriptdesactivado.

En la parte servidor no se comprueban los parámetros.

Descuidos a la hora de implementar un formulario.

Mal planteamiento de determinadas acciones.

Page 8: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Ejemplos

Page 9: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)
Page 10: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)
Page 11: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)
Page 12: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)
Page 13: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)
Page 14: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)
Page 15: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Tipos

No Persistente(Reflejado)

Persistente(Almacenado)

Servidor Web

Atacante

Usuario

Atacante

Usuario

Servidor Web

enlace XSS

enlace XSS

respuestarespuesta

enlace XSS

Page 16: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Modalidades

Inyección de HTML

Inyección de SQL

Inclusión remota de ficheros (RFI)

Inyección de Código php

Cross Frame Scripting (XFS)

Inyección de LDAP

XST (Cross Site Tracing)

Page 17: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de HTML

Utiliza Javascript y las propiedades del DOM.

Incluye o manipula código HTML dentro de una página web.

Obtener información del usuario.

Page 18: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de HTML

Ejemplo 1

Page 19: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de HTML

Ejemplo 1

Ahí es dónde se muestra el texto indicado en el campo del formulario y que hace que se ejecute.

Page 20: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de HTML

Ejemplo 1

Ahí es dónde se muestra el texto indicado en el campo del formulario y que hace que se ejecute.

En el caso que se almacenara en una Base de datos (Ej: en un foro), se estaría “mostrando”cada vez que se entrara al mismo.

Page 21: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de HTML

Ejemplo 2

Page 22: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de HTML

Ejemplo 3

Se podría considerar este ejemplo como un ataque de Cross FrameScripting (XFS) aparte de la inyección de HTML.

Page 23: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de SQL

Introduce dentro de una sentencia SQL que espera un valor, otra no esperada.

Intenta obtener/manipular o destruir información del servidor (base de datos).

No es exclusivo de un lenguaje de programación, puede ocurrir en todos.

Posibles Sentencias de entrada:';

1' OR 1=1

' OR ''= '

Page 24: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de SQL

Ejemplo de sentencias:SELECT titulo,descripcion FROM libro WHERE codigo=1 OR 1=1; SELECT clave FROM cliente WHERE usuario=‘mortadelo’;

Puede Ir probando usuarios hasta que obtenga uno que no cause un error y sabrá que ese existe para intentar colarse dentro.

SELECT titulo,descripcion FROM libro WHERE codigo=1 OR 1=1; UPDATE cliente SET clave=‘ahoraentroyo’ WHERE usuario=‘mortadelo’;

Cambia la clave al usuario y ya puede entrar al sistema

Page 25: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de SQL

Ejemplo de sentencias:SELECT titulo,descripcion FROM libro WHERE codigo=1 OR 1=1; SELECT clave FROM cliente WHERE usuario=‘mortadelo’;

Puede Ir probando usuarios hasta que obtenga uno que no cause un error y sabrá que ese existe para intentar colarse dentro.

SELECT titulo,descripcion FROM libro WHERE codigo=1 OR 1=1; UPDATE cliente SET clave=‘ahoraentroyo’ WHERE usuario=‘mortadelo’;

Cambia la clave al usuario y ya puede entrar al sistema

Como ocurre:

Page 26: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inclusión remota de ficheros

Conocido normalmente como RFI (Remote File Inclusion)Ejecuta código en el lado del servidor que está incluidoen un fichero externo.Sólo ocurre en php.Uso incorrecto de las funciones:require()require_one()include()include_once()system()…

Page 27: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inclusión remota de ficheros

Ejemplo:Si tuviéramos algo así en el código:

O por ejemplo:

Luego veremos que esto ya no suele ser así.

Si se le pasa como parámetro esto:ls –l > ./listado.txtPodría generar el fichero indicado conteniendo la estructura de directorios del web.

Si se le pasa como parámetro algo como esto:http://webdelatacante/scriptdellio

Page 28: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de código php

Inyecta código personalizado en el lado del motor de secuencias de comandos del servidor.

Se aprovecha de la función eval().

eval() ejecuta el argumento como código.

eval($codigo):

evalua el código que se le facilita -$codigo- como código php.

Precaución: El constructor de lenguaje eval() es muy peligroso porque permite la ejecución de código de PHP arbitrario. Su uso está totalmente desaconsejado. Si se ha verificado cuidadosamente que no existe otra opción que usar este constructor, se ha de poner especial atención en no pasar ninguna información proporcionada por el usuario a esta función sin haberla validado apropiadamente con anterioridad.

Fuente: Manual php

Page 29: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección de código php

Ejemplo:

Si se le pasa como parámetro esto:1;phpinfo(); ó phpinfo()Podría mostrar la configuración de php.Y es un indicio para poder realizar cualquier otro intento de ataque, bien con system() u otras funciones.

Ahora se le pasa como parámetro esto:system("/bin/echo hola, holita"); Y nos mostrará en pantalla ese texto.

Page 30: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Cross Frame Scripting (XFS)

Afecta a webs que usan marcos (frames)

El atacante induce al usuario a navegar a una página web que el atacante controla; y roba los datos de acceso.

Se usa para describir un ataque que hace uso de un frame.

Page 31: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Cross Frame Scripting (XFS)

Ejemplo

Page 32: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección LDAP

Se basa en técnicas similares a la inyección SQL.

Atacante puede aprovechar el fallo para poder inyectar código y cambiar el resultado que se obtiene con el filtro.

No es exclusivo de un lenguaje de programación, puede ocurrir en todos.

Page 33: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inyección LDAP

Ejemplo:Filtro normal para verificar un usuario y clave en un servidor LDAP

(&(USER=usuario)(PASSWORD=clave))

Si el atacante conoce un usuario real (Ej: jmcanto), se podría indicar en el campo usuario: jmcanto)(&)), con lo cual la inyección sería:

(&(USER= jmcanto)(&)))(PASSWORD=clave))

Solamente se procesa el 1º filtro.La consulta siempre es cierta.Se accede a los recursos y documentos del mencionado usuario.

Page 34: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Cross Site Tracing (XST)

Se aprovecha del método TRACE de HTTP.

Puede ser útil para saltarse protección para acceder a cookies desde el lado del cliente, si el navegador lo permite.

Trace permite de una manera fácil, ver lo que el cliente HTTP envía y lo que el servidor recibe.

Se recomienda su desactivación.

Al probar este código, en cualquier navegador moderno, dará un error(NS_ERROR_ILLEGAL_VALUE en FF).Para probarlo hay que hacerlo en un navegador versión <=IE6.

No obstante

Page 35: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Algunos consejos

Page 36: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Errores personalizados

No dar pistas sobre el error ocurrido

php

ASP.NET

Page 37: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Inclusión de ficheros

Evitar en la medida de lo posible la inclusión de ficheros pasados como parámetros.

Si se tiene que hacer:

Se debe comprobar que exista el fichero.

Se podría pasar como parámetro solo el nombre sin extensión.

Page 38: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Validaciones en Javascript

Barrera inicial

Puede que desistan en el caso de no tener conocimientos más amplios

• Inconveniente: se puede desactivar fácilmente

Page 39: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Control de entradas (I)

Expresiones regularesSe puede controlar los parámetros/campos de forma

rápida y sencilla.

Ejemplos:[ -~]: todos los caracteres Ascii desde el espacio hasta ~

[^0-9]: no sean números

[0-9]: números

[a-z]: letras en minúscula

[A-Z]: caracteres en mayúscula

[0-9]{2}/[0-9]{2}/[0-9]{4}: fecha

[1-9]{1,3}\.[0-9] {1,3}\.[0-9] {1,3}\.[0-9] {1,3}: Dirección IP

Page 40: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Control de entradas (I)

Expresiones regularesEjemplos utilización:

php

Page 41: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Control de entradas (I)

Expresiones regularesEjemplos utilización:

ASP.NET

Page 42: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Control de entradas (II)

Funciones

Usar las del lenguaje

phphtmlentitieshtmlspecialcharmysql_real_escape_string(MySQL)real_escape_string (mysqli)addslashesstripslashespreg_replace…

ASP.NET

IsDate (Visual Basic)

IsNumeric (Visual Basic)

Regex.IsMatch

Regex.Replace

Page 43: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Control de entradas (II)

Funciones

Implementar nuestras propias funcionesphp

Page 44: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Control de entradas (II)

Funciones

Implementar nuestras propias funcionesASP.NET

Page 45: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Formularios

Captcha– Inconveniente: mala visibilidad

Preguntas aleatorias– Inconveniente: puede que se necesite un número grande de preguntas para que no lleguen a repetirse.

Aceptación de la política de privacidad o similares

Page 46: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Bases de datos

Utilización de procedimientos almacenados con parámetros.Utilizar funciones para controlar las cadenas.Usar varios usuarios para acceder a la base de datos.

uno para operaciones de escrituraotro para operaciones de lectura

No crear nunca instrucciones SQL directamente a partir de datos indicados por el usuario.

Page 47: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Procedencia

Comprobar de dónde viene el formulario

php ASP.NET

Inconvenientes:Puede que no esté activoSe puede falsificar

Page 48: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Otras configuraciones

php.iniregister_globals off: desactiva esta directiva ya que permite aceptar parámetros $_GET y $_POST como variables.

Ej: $_POST[‘nombre’] -> $nombre

allow_furl_open off: al desactivarla no se permite la inclusión de ficheros remotos.

safe_mode on: restringe el uso de ejecutables.

openbase_dir ruta: limita la ejecución a la ruta indicada.

disable_functions <lista_funciones>: no permite la utilización de las funciones indicadas.

disable_classes <lista_clases>: no permite el uso de las clases.

Page 49: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Otras configuraciones

.htaccess

SetEnv REGISTER_GLOBALS 0

Desactivar TRACE de HTTP

RewriteEngine on

RewriteCond %{REQUEST_METHOD} ^TRACE

RewriteRule .* – [F]

Módulos Apache

mod_rewrite: módulo de manipulación de URLsEj: RewriteCond %{QUERY_STRING} drop.+procedure [NC,OR]

mod_security: módulo de seguridad para Apache

Ej: SecFilterSelective ARGS "drop[[:space:]]+procedure"

Page 50: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

Otras configuraciones

.htaccess

SetEnv REGISTER_GLOBALS 0

Desactivar TRACE de HTTP

RewriteEngine on

RewriteCond %{REQUEST_METHOD} ^TRACE

RewriteRule .* – [F]

Módulos Apache

mod_rewrite: módulo de manipulación de URLsEj: RewriteCond %{QUERY_STRING} drop.+procedure [NC,OR]

mod_security: módulo de seguridad para Apache

Ej: SecFilterSelective ARGS "drop[[:space:]]+procedure"

Antes de recargar el fichero .htaccess ó el httpd.conf con muchas instrucciones de este tipo, habría que evaluar si realmente merece la pena bajar la velocidad de ejecución del web al introducirlas, cuando quizás se pueda realizar todo esto por código implementando algunas validaciones.

Page 51: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

¿Preguntas?

Page 52: Prevencion ante ataques XSS - Betabeers Córdoba (29/11/2012)

¡Muchas Gracias!

@jmcanto_km1

www.linkedin.com/in/josemariacantoortiz

[email protected]@