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
Lo que soy
Diplomado en Informática
Analista Programador
Más 12 años de experiencia
Colegiado CPITIA
Ciclista aficionado
Mi experiencia
Programador web ISP local
Autónomo
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 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.
¿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.
Posibles puntos de entrada
Tablones de anuncios
Libros de visitas
Foros de discusión
Formularios de contacto
Búsquedas
Parámetros
¿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.
Ejemplos
Tipos
No Persistente(Reflejado)
Persistente(Almacenado)
Servidor Web
Atacante
Usuario
Atacante
Usuario
Servidor Web
enlace XSS
enlace XSS
respuestarespuesta
enlace XSS
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)
…
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.
Inyección de HTML
Ejemplo 1
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.
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.
Inyección de HTML
Ejemplo 2
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.
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 ''= '
…
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
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:
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()…
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
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
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.
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.
Cross Frame Scripting (XFS)
Ejemplo
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.
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.
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
Algunos consejos
Errores personalizados
No dar pistas sobre el error ocurrido
php
ASP.NET
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.
Validaciones en Javascript
Barrera inicial
Puede que desistan en el caso de no tener conocimientos más amplios
• Inconveniente: se puede desactivar fácilmente
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
…
Control de entradas (I)
Expresiones regularesEjemplos utilización:
php
Control de entradas (I)
Expresiones regularesEjemplos utilización:
ASP.NET
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
…
Control de entradas (II)
Funciones
Implementar nuestras propias funcionesphp
Control de entradas (II)
Funciones
Implementar nuestras propias funcionesASP.NET
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
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.
Procedencia
Comprobar de dónde viene el formulario
php ASP.NET
Inconvenientes:Puede que no esté activoSe puede falsificar
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.
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"
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.
¿Preguntas?
Top Related