Este documento ofrece consejos para prevenir ataques XSS. Explica brevemente qué es un ataque XSS y cómo pueden ocurrir. Luego, detalla varios tipos de ataques XSS como inyección de HTML, SQL, código PHP e inclusión remota de archivos, y proporciona ejemplos de cada uno. Finalmente, el documento proporciona consejos para prevenir estos ataques como realizar validaciones en el cliente y servidor, usar expresiones regulares para validar entradas, y configurar php.ini y .htaccess de manera seg
1. 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
2. Lo que soy
Diplomado en Informática
Analista Programador
Más 12 años de experiencia
Colegiado CPITIA
Ciclista aficionado
3. Mi experiencia
Autónomo
Programador web ISP local
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
4. ¿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, intentar
combatirlo con las armas que tiene un programador.
5. ¿Qué es XSS?
Según Wikipedia:
Cross-site scripting es un tipo de inseguridad
informática o agujero de seguridad típico de las
Un ataque que permite la
aplicaciones Web,de código de algún
introducción que permite a una tercera
parte inyectar en páginas Web vistas por el
tipo código JavaScriptweb. otro lenguaje
usuario
en una página o en
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, intentar
combatirlo con las armas que tiene un programador.
6. Posibles puntos de entrada
Tablones de anuncios
Libros de visitas
Foros de discusión
Formularios de contacto
Búsquedas
Parámetros
7. ¿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 Javascript
desactivado.
En la parte servidor no se comprueban los parámetros.
Descuidos a la hora de implementar un formulario.
Mal planteamiento de determinadas acciones.
15. Tipos
No Persistente Persistente
(Reflejado) (Almacenado)
Servidor Web Servidor Web
enlace XSS
respuesta
respuesta
Usuario Usuario
enlace XSS
S S
c eX
en la
Atacante Atacante
16. 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)
…
17. 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.
19. 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.
20. 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.
22. Inyección de HTML
Ejemplo 3
Se podría considerar este ejemplo como un ataque de Cross Frame
Scripting (XFS) aparte de la inyección de HTML.
23. 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 ''= '
…
24. 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
Cambia la clave al
clave=‘ahoraentroyo’ WHERE
usuario y ya puede
usuario=‘mortadelo’;
entrar al sistema
25. 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’;
Como ocurre: 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
Cambia la clave al
clave=‘ahoraentroyo’ WHERE
usuario y ya puede
usuario=‘mortadelo’;
entrar al sistema
26. Inclusión remota de ficheros
Conocido normalmente como RFI (Remote File
Inclusion)
Ejecuta código en el lado del servidor que está incluido
en un fichero externo.
Sólo ocurre en php.
Uso incorrecto de las funciones:
require()
require_one()
include()
include_once()
system()
…
27. Inclusión remota de ficheros
Ejemplo:
Si tuviéramos algo así en el código: Si se le pasa como parámetro esto:
ls –l > ./listado.txt
Podría generar el fichero indicado
conteniendo la estructura de directorios
del web.
O por ejemplo:
Si se le pasa como parámetro algo como
esto:
http://webdelatacante/scriptdellio
Luego veremos que esto ya no suele ser así.
28. 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
29. 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,
Ahora se le pasa como parámetro bien con system() u otras
esto: funciones.
system("/bin/echo hola, holita");
Y nos mostrará en pantalla ese
texto.
30. 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.
32. 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.
33. 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.
34. 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.
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
Se recomienda su desactivación.
37. 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.
38. Validaciones en Javascript
Barrera inicial
Puede que desistan en el caso de no tener
conocimientos más amplios
• Inconveniente: se puede desactivar fácilmente
39. Control de entradas (I)
Expresiones regulares
Se 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
…
42. Control de entradas (II)
Funciones
Usar las del lenguaje
php ASP.NET
htmlentities
IsDate (Visual Basic)
htmlspecialchar
mysql_real_escape_string(MySQL) IsNumeric (Visual Basic)
real_escape_string (mysqli)
Regex.IsMatch
addslashes
stripslashes Regex.Replace
preg_replace
…
…
43. Control de entradas (II)
Funciones
Implementar nuestras propias funciones
php
44. Control de entradas (II)
Funciones
Implementar nuestras propias funciones
ASP.NET
45. 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
46. 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 escritura
otro para operaciones de lectura
No crear nunca instrucciones SQL directamente a partir
de datos indicados por el usuario.
47. Procedencia
Comprobar de dónde viene el formulario
php ASP.NET
Inconvenientes:
Puede que no esté activo
Se puede falsificar
48. Otras configuraciones
php.ini
register_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.
49. 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 URLs
Ej: RewriteCond %{QUERY_STRING} drop.+procedure [NC,OR]
…
mod_security: módulo de seguridad para Apache
Ej: SecFilterSelective ARGS "drop[[:space:]]+procedure"
50. Otras configuraciones
.htaccess
SetEnv REGISTER_GLOBALS 0
Desactivar TRACE de HTTP
RewriteEngine on
Antes de recargar%{REQUEST_METHOD} ^TRACE
RewriteCond el fichero .htaccess ó el httpd.conf con muchas
instrucciones de este[F]
RewriteRule .* – 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
Módulos Apache
algunas validaciones.
mod_rewrite: módulo de manipulación de URLs
Ej: RewriteCond %{QUERY_STRING} drop.+procedure [NC,OR]
…
mod_security: módulo de seguridad para Apache
Ej: SecFilterSelective ARGS "drop[[:space:]]+procedure"