Desarrollo Web Avanzado

Transcripción

Desarrollo Web Avanzado
Universidad Jaume I
Desarrollo
Web Avanzado
Seguridad Web
2
Desarrollo Web Avanzado
Seguridad Web
ÍNDICE
3
Índice
Índice de figuras
3
1. Introducción a la seguridad Web.
6
2. Algunos datos.
7
3. Consideraciones básicas de seguridad.
3.1. Entrada de datos, variables globales y escapado automático, consideraciones.
3.2. Autenticación de usuarios. . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1. Almacenamiento de contraseñas. . . . . . . . . . . . . . . . . . . . .
3.3. Gestión de la sesión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9
11
14
15
4. Errores de seguridad convencionales.
4.1. HTML injection. . . . . . . . . . . . . .
4.2. SQL Injection. . . . . . . . . . . . . . . .
4.3. Blind SQL Injection. . . . . . . . . . . .
4.4. Cross Site Scripting (XSS). . . . . . . . .
4.4.1. XSS en sesiones no autenticadas.
4.4.2. XSS autocontenidos. . . . . . . .
4.5. Cross Site Request Forgeries (CSRF). . .
4.6. XPath Injection. . . . . . . . . . . . . .
4.7. Cross Site Tracing (XST). . . . . . . . .
4.8. Session Fixation. . . . . . . . . . . . . .
4.9. Session Hijacking. . . . . . . . . . . . . .
4.10. Weak Upload File Checks. . . . . . . . .
4.11. Allow url fopen. . . . . . . . . . . . . . .
4.12. División de respuesta HTTP. . . . . . . .
4.13. DNS Rebinding. . . . . . . . . . . . . . .
4.14. Comprobación insuficiente. . . . . . . . .
4.15. Null Byte. . . . . . . . . . . . . . . . . .
4.16. Apache y mod mime. . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
16
16
17
18
19
20
21
21
22
22
23
24
24
25
25
26
27
27
28
.
.
.
.
28
28
29
30
30
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5. Técnicas de protección adicionales.
5.1. Captchas, tipos de ataques. . . . . . . . . .
5.2. Controles anti-spam, ofuscación JavaScript. .
5.3. Herramientas de auditorı́a. . . . . . . . . . .
5.4. Cookies httponly y secure. . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Referencias
32
Índice de figuras
1.
2.
3.
Clasificación por objetivo de los atacantes. . . . . . . . . . . . . . . . . . .
A quién se ataca. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vulnerabilidades o tipos de ataques utilizados. . . . . . . . . . . . . . . . .
Desarrollo Web Avanzado
8
8
9
Seguridad Web
4
Índice de figuras
4.
5.
6.
7.
Inyección HTML. . . . . . . . . . . . . .
Cross Site Scripting. . . . . . . . . . . .
Un ejemplo de Captcha. . . . . . . . . .
Captcha de fácil reconocimiento de forma
Desarrollo Web Avanzado
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
automatizada.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
20
29
29
Seguridad Web
ÍNDICE DE FIGURAS
Desarrollo Web Avanzado
5
Seguridad Web
6
1 Introducción a la seguridad Web.
1.
Introducción a la seguridad Web.
La teorı́a de seguridad tradicional contempla tres dimensiones o propiedades básicas que
deben protegerse, éstas son la confidencialidad, la integridad y la disponibilidad.
Confidencialidad: Esta propiedad hace referencia a que el acceso a los datos solo
puede ser realizado por aquellas personas o entidades autorizadas.
Integridad: Esta propiedad indica que los datos deben mantenerse ı́ntegros, es decir,
exactamente igual que en su origen.
Disponibilidad: Esta propiedad hace referencia a que los datos deben estar accesibles
en el momento en el que son necesarios.
Autenticidad: Esta propiedad indica que los datos son auténticos, es decir, que
proceden de quien los originó y que no han sido modificados. Esta propiedad esta
ı́ntimamente relacionada con la integridad.
La teorı́a de seguridad tradicional intenta cubrir, fundamentalmente estos aspectos a pesar
de que no son las únicas propiedades a tener en cuenta1 .
Con la evolución de Internet y la Web, las aplicaciones de escritorio se han visto desplazadas por las aplicaciones Web basadas en tecnologı́as de cliente rico. Esto ha sido posible,
en parte, por la evolución de los navegadores que han pasado de ser simples presentadores
de páginas web a plataformas de ejecución de aplicaciones gracias a la adición por parte
de los desarrolladores de funcionalidades como XMLHttpRequest y redibujado dinámico
de secciones ası́ como la continua optimización aplicada sobre los motores JavaScript que
incorporan los navegadores.
Este hecho ha producido un desplazamiento de la investigación en materia de seguridad
desde la búsqueda y explotación2 en aplicaciones locales o de escritorio hacia la investigación en seguridad de aplicaciones Web. Fruto de esa investigación, aparece una clasificación
de vulnerabilidades más frecuentes, comúnmente aceptadas por los profesionales del sector. Organizaciones como OWASP3 o WASC4 dirigen sus esfuerzos hacia la mejora de la
seguridad Web en general ofreciendo para ello una clasificación de problemas comunes de
seguridad y qué medidas pueden adoptarse para cada una de ellas.
1
También existe, por ejemplo, el no repudio
Acto de aprovechar un error de seguridad para obtener un efecto que, inicialmente, no se nos permite.
3
Open Web Application Security Project
4
Web Application Consortium
2
Desarrollo Web Avanzado
Seguridad Web
7
2.
Algunos datos.
Sobre la mencionada clasificación, han surgido estudios que indican, en la medida de lo
posible, que objetivos se buscan detrás de un ataque contra una aplicación Web y qué tipo
de errores se suelen aprovechar para conseguirlos. Estos estudios, se realizan mediante la
exploración de las listas de información de vulnerabilidades5 o por empresas del sector de
la seguridad informática.
WASC esta llevando a cabo un proyecto en el que las empresas más relevantes en el ámbito
de la seguridad informática ofrecen sus datos estadı́sticos para mantener una información
completa sobre las amenazas más relevantes en cuanto a errores aprovechados por ataques
en aplicaciones Web.
A continuación expondremos los datos, para el informe que comprende el año 2007. El
primer aspecto que se estudia en el informe es la motivación de los ataques realizados, esto
es, el porqué de las acciones llevadas a cabo. Con respecto a esto, la figura 1 podemos ver
como la mayorı́a de los ataques buscan obtener información confidencial sobre la que no
tienen acceso lı́cito, esto vulnerarı́a la confidencialidad y el tipo de información que suele
buscarse en estos ataques son números de tarjetas de crédito, cuentas bancarias, credenciales de acceso a aplicaciones, direcciones de correo electrónico y secretos industriales.
Por otro lado vemos que la segunda motivación en orden de aparición es el “defacement”
o modificación de alguna de las páginas Web que componen el sitio, este hecho suele
responder a motivos polı́ticos6 o ideológicos y afecta fundamentalmente a la integridad
de la información. Podemos también apreciar como el objetivo de instalar “malware”7 en
los servidores web también es el tercer motivo de ataque de las aplicaciones Web, estas
instalaciones de “malware” permiten a los atacantes instalar software malicioso en algunas de las máquinas que visitan el sitio Web obteniendo el control sobre las mismas y
creando redes de botnets 8 . Por último el tipo de motivaciones que podemos identificar,
las podemos agrupar en chantajes y estafas o engaños. Recientemente surgió la alarma
en Internet por la aparición del virus GPCode9 , este virus realiza un cifrado de archivos
con ciertas extensiones utilizando criptografı́a fuerte de clave pública y después solicita la
compra de un software para recuperar lo archivos. Esto serı́a, obviamente, un ejemplo de
chantaje.
5
Como, por ejemplo, Bugtraq o Full-disclosure
Noticias relacionadas Hackean la web Ministerio de Vivienda y Un descuido en la web de Rajoy
permite que cualquiera la cambie.
7
Malware.
8
Botnet en wikipedia.
9
Información sobre el virus.
6
Desarrollo Web Avanzado
Seguridad Web
8
2 Algunos datos.
Figura 1: Clasificación por objetivo de los atacantes.
En este estudio también se clasifican los ataques por organizaciones como puede verse en
la figura 2. Podemos ver como los objetivos más atacados son aplicaciones Web gubernamentales, organizaciones educativas y tiendas on-line.
Figura 2: A quién se ataca.
El informe nos ofrece también una clasificación por tipos de errores o técnicas de ataque
utilizadas contra estas aplicaciones Web.Véase la figura 3.
Desarrollo Web Avanzado
Seguridad Web
9
A través de este documento presentaremos una descripción de estas técnicas y algunas
otras también utilizas ası́ como la forma de prevenirlas en nuestras aplicaciones web.
Figura 3: Vulnerabilidades o tipos de ataques utilizados.
3.
3.1.
Consideraciones básicas de seguridad.
Entrada de datos, variables globales y escapado automático,
consideraciones.
Podemos simplificar el funcionamiento de una aplicación web indicando que ésta funciona
de la siguiente forma:
1. El cliente, usualmente un navegador, solicita unos datos mediante una petición
HTTP. En algunos casos el cliente ofrece datos necesarios para acceder a esos datos
(inputs).
Desarrollo Web Avanzado
Seguridad Web
10
3 Consideraciones básicas de seguridad.
2. El servidor procesa los datos de entrada, en el caso de existir, y en función de
ellos recupera otros datos de alguna fuente (BBDD, ficheros,etc), les da un formato
determinado y los muestra.
La entrada de datos en el servidor desde el cliente puede darse de diferentes formas:
En la petición HTTP mediante GET o POST: Es la forma estándar de recibir datos
por parte del servidor, en el primer caso los datos se codifican en la URL de la
petición y en el segundo en el cuerpo de la misma petición.
En campos INPUT de un formulario: Estos campos input son enviados al servidor
utilizando uno de los dos métodos indicados arriba.
En forma de COOKIE: Podemos ver una cookie como un dato que establece un
servidor en un cliente y que éste último envı́a automáticamente en cada petición
posterior.
Estos inputs o entradas de datos deben ser siempre saneados en función del uso que se
vaya a hacer de ellos, por ejemplo, para utilizarlos en el acceso a BBDD debemos escapar
los caracteres \ ’ “ i NULL puesto que estos pueden dar lugar a modificaciones sobre las
consultas predefinidas provocando comportamientos no esperados en nuestra aplicación,
como veremos más adelante en la sección relativa a SQL injection y Blind SQL Injection.
Otro tipo de modificaciones sobre estos datos, pueden alterar el comportamiento de consultas sobre estructuras XML, como también veremos en la sección de XPath injection.
Si los datos de entrada van a ser incluidos en la presentación Web final, entonces, debemos tener especial cuidado con las marcas HTML que éstas entradas posean puesto que
nuevamente, una entrada especialmente diseñada puede modificar la página Web final.
Los lenguajes de programación más utilizados en programación web, nos ofrecen herramientas para realizar estos saneamientos, por ejemplo en PHP y Java podemos utilizar:
PHP
• magic quotes gpc: Esta directiva se establece en el fichero de configuración del
interprete PHP y hace que las entradas de datos a través de GET, POST y
COOKIE se “escapen” automáticamente frente a los caracteres ’,”,\ i NULL.
Esta funcionalidad ha sido motivo de polémica entre los desarrolladores de
PHP puesto que confiar en ella puede ser peligroso si la aplicación que lo hace
necesita migrarse por cualquier motivo y la nueva instalación de PHP tiene
esta funcionalidad desactivada. Probablemente, esto harı́a que en la aplicación
Desarrollo Web Avanzado
Seguridad Web
3.2 Autenticación de usuarios.
11
aparecieran multitud de problemas de seguridad que no existı́an antes. Otra
razón en contra es que todos los datos de entrada son escapados indiscriminadamente, a pesar de que éstos no vayan a ir a parar a una consulta SQL. Por
ultimo, tener en cuenta estos dos últimos aspectos, hace que la programación
sea algo más tediosa como puede verse en el siguiente ejemplo:
gpc.php
<?
if (!get_magic_quotes_gpc()) {
$data = addslashes($_POST[’data’]);
} else {
$data = $_POST[’data’];
}
?>
1
2
3
4
5
6
7
Por esto, los desarrolladores de PHP han decidido eliminar esta caracterı́stica
de la versión 6 de PHP y dejar en manos del programador o los entornos de
desarrollo las medidas de seguridad necesarias.
• strip tags(): Función PHP que elimina las marcas correspondientes a HTML y
PHP.
• addslashes(): Tiene el mismo efecto que la activación de magic quotes gpc al
ser aplicada sobre una variable.
• htmlentities(): Esta función convierte los caracteres especiales HTML a sus
correspondientes entidades codificadas de forma que el navegador las muestra
sin que interfieran en el código original.
• htmlspecialchars(): Convierte también caracteres especiales a entidades HTML,
la diferencia con htmlentities es que no convierte todos los caracteres, sólo los
más habituales.
Java
• PreparedStatement: En Java, esta clase escapa los caracteres especiales en relación a consultas SQL.
• StringEscapeUtils: Esta clase perteneciente al paquete commons de Apache,
nos permite realizar la misma traducción que htmlentities
3.2.
Autenticación de usuarios.
Entendemos por autenticación de usuarios el proceso que indica que un usuario es quien
dice ser o, al menos, tiene bajo su control las credenciales que le han sido ofrecidas en
algún tipo de proceso de registro.
Desarrollo Web Avanzado
Seguridad Web
12
3 Consideraciones básicas de seguridad.
Por otro lado la autorización es entendida como la capacidad de que un usuario ya identificado acceda a un recurso concreto dependiendo del grupo o rol al que pertenece dentro
de la aplicación.
En lo que al desarrollo de aplicaciones Web se refiere, debemos adoptar varias consideraciones especiales con respecto a este procedimiento:
Autenticación en el lado del cliente:
• Autenticación mediante scripts ejecutados en cliente: Nunca hay que autenticar
al usuario en el lado del cliente mediante scripts sobre los que él tiene control
puesto que puede manipularlos obteniendo acceso a recursos para los que no
esta autorizado.
• Autenticación utilizando Applets Java o Flash: Si la autenticación del usuario
va a llevarse a cabo mediante el despliegue de una aplicación Java (applet) o
Flash en el cliente, debe hacerse correctamente y cuidadosamente de forma que
no se incluyan datos relevantes en el proceso de autenticación que permitan
a un atacante saltarse el mismo. Esta recomendación viene dada puesto que
los applets Java son fácilmente decompilables con, por ejemplo, JAD10 y los
ficheros swf generados durante la compilación de flash, pueden decompilarse
también con facilidad utilizando, por ejemplo, Flash Decompiler11 .
La forma correcta de autenticar a un usuario utilizando un applet Java o una
aplicación flash, es mediante la utilización de un servicio Web que realice la
comprobación e indique la página a visitar en caso de éxito.
Autenticación por IP: La forma más simple de autenticar a un usuario es en función
de la ip de la máquina que utiliza y a pesar de ser éste un método poco seguro si se
utiliza de forma aislada, puede complementar controles sobre sesiones autenticadas
como veremos más adelante.
Cuando un cliente realiza una petición HTTP a un servidor, éste exporta dos variables de entorno que son fundamentales en la relación con la autenticación por IP,
estas son
• REMOTE ADDR: Nos indica la ip de la máquina que ha conectado con el
servidor.
• X FORWARDED FOR: La aparición de este campo en la petición HTTP es
debido a que la máquina que realiza la petición HTTP se encuentra detrás de
un proxy, y éste establece esta cabecera como información adicional sobre cual
de las máquinas que realizan peticiones a través de él ha sido la causante de la
petición.
Cuando autenticamos, o realizamos controles sobre la IP, no es suficiente comprobar el campo REMOTE ADDR puesto que dos máquinas que realizaran peticiones
10
11
Página del proyecto JAD
Página del proyecto Flash Decompiler
Desarrollo Web Avanzado
Seguridad Web
3.2 Autenticación de usuarios.
13
a través del mismo proxy compartirı́an el valor de este campo y por tanto la autenticación sin ser este el efecto deseado.
El utilizar únicamente el campo X FORWARDED FOR tampoco es correcto puesto
que este campo puede ser manipulado por el cliente para indicar cualquier dirección
IP.
Para realizar un correcto control de la dirección IP deberı́amos utilizar el campo
REMOTE ADDR y si existe el campo X FORWARDED FOR, la unión de ambos,
por ejemplo de esta forma: REMOTE ADDR - X FORWARDED FOR.
Autenticación por Usuario/Contraseña:
Cuando autenticamos al usuario por medio de un nombre de usuario y contraseña
y en general por cualquier tipo de datos que el usuario utilice como credenciales de
acceso y éstas le den acceso a ciertas partes de la aplicación Web, debemos tener
en cuenta que puede estar accediendo desde, por ejemplo, una red inalámbrica sin
cifrado de datos, o desde una LAN donde, con las herramientas adecuadas, puede
redirigirse el tráfico de datos de una máquina a otra sin que el usuario lo perciba.
Por esto, debemos utilizar SSL en la medida de lo posible, de forma que aunque los
datos sean capturados, estos no sean inteligibles por terceros.
Autenticación tipo CHAP:
Muchas veces, por restricciones de nuestro proveedor de hosting o por el hecho de
intentar eliminar el requisito SSL de nuestro proyecto, no podemos utilizar esta
tecnologı́a. En estos casos podemos utilizar CHAP12 .
CHAP es interesante por el hecho de que permite realizar autenticación sin transmitir ninguna contraseña por el canal de comunicaciones utilizado. Este método se
compone de los siguientes pasos:
1. Ambas partes, cliente y servidor conocen las credenciales de autenticación.
2. El cliente solicita iniciar el procedimiento de autenticación.
3. El servidor genera un reto aleatorio y lo envı́a al cliente.
4. Cliente y servidor realizan la operación x = hash(reto + credenciales), donde
hash es una función de resumen13 y + representa una operación de concatenación.
5. El cliente envı́a x al servidor.
6. El servidor compara x con x0 correspondiente al valor calculado por él. Si ambos
coinciden, la autenticación se ha llevado a cabo con éxito.
De esta forma si alguien captura x al ser enviado desde el cliente al servidor no
podrı́a utilizarlo puesto que deberı́a iniciar el proceso de autenticación y el servidor
generarı́a un nuevo reto y por tanto x serı́a distinto.
Se puede encontrar una implementación completa haciendo uso de JavaScript en el
lado del cliente y PHP en el lado del servidor en:
12
13
Challenge Handshake Authentication Protocol.
http://en.wikipedia.org/wiki/Cryptographic hash function
Desarrollo Web Avanzado
Seguridad Web
14
3 Consideraciones básicas de seguridad.
http://www.devarticles.com/c/a/JavaScript/Building-a-CHAP-Login-System-EncryptingData-in-the-Client/
Una implementación alternativa de este método pasa por la utilización del algoritmo
de cifrado por flujo RC4 de sencilla implementación y que sustituirı́a el uso de la
función de resumen.
Como contrapartida, este método obliga al servidor a almacenar la contraseña del
cliente en formato “plano”.
Autenticación X509:
Este tipo de autenticación forma parte del protocolo TLS14 y permite autenticar
tanto a cliente como servidor haciendo uso de una infraestructura de clave pública15 .
Para ello es necesario que tanto el servidor como el cliente “entiendan” ssl. Utilizando
un tamaño de clave adecuado para cada algoritmo de cifrado, este método es uno
de los más “fuertes” que podemos utilizar.
En este punto cabe mencionar que este tipo de autenticación puede utilizarse también sin necesidad de hacer uso de SSL. Para esto, serı́a necesario desplegar una
aplicación en el cliente, por ejemplo un applet Java, que le permitiera al usuario firmar unos datos aleatorios que el servidor habrı́a enviado, el procedimiento completo
serı́a:
1. El cliente realiza un petición de autenticación al servidor.
2. El servidor genera unos datos aleatorios y los envı́a junto con un applet que se
“despliega” en el cliente permitiéndole firmar.
3. El cliente firma esos datos haciendo uso del applet y envı́a la firma de vuelta
al servidor.
4. El servidor comprueba que la firma es correcta y válida y en tal caso da al
cliente como autenticado.
3.2.1.
Almacenamiento de contraseñas.
En el cliente: Una de las funciones de la aplicación en cuanto a su nivel de seguridad
es informar en la medida de lo posible y de una forma útil y clara al usuario de los
problemas de seguridad que puede experimentar al utilizar ciertas funcionalidades
de los navegadores, como por ejemplo el almacenamiento de contraseñas.
Este almacenamiento es relevante desde el punto de vista de la seguridad puesto que,
como veremos más adelante, existen técnicas para obtener esos datos utilizando otras
vulnerabilidades de las aplicaciones Web.
En el servidor: En el lado del servidor, las contraseñas deberı́an almacenarse, en la
medida de lo posible, de forma ininteligible. De esta forma las contraseñas estarán
14
15
http://www.faqs.org/rfcs/rfc2246.html
http://es.wikipedia.org/wiki/X.509
Desarrollo Web Avanzado
Seguridad Web
3.3 Gestión de la sesión.
15
protegidas frente a accesos no autorizados a este tipo de información. Para ello
podemos utilizar, nuevamente, una función de resumen (como sha1 o sha256 ).
3.3.
Gestión de la sesión.
En este punto nos referimos a sesión como la parte que queda en el servidor que relaciona
a un usuario con su “entorno” autenticado, dejando a un lado otras generalidades como
sesiones no autenticadas.
Sobre una sesión autenticada, debemos establecer, al menos, los siguientes controles:
Validez temporal de la sesión: La sesión debe expirar en un tiempo razonable,
dependiendo el objetivo de la misma, pero no debe permitir sesiones sin caducidad
ni con excesivo tiempo de expiración.
Un ejemplo donde la gestión incorrecta de este aspecto de la sesión podrı́a inducir
problemas de seguridad es en los ordenadores de acceso público, bien sean cibercafés,
bibliotecas, salas multimedia, etc. Donde al cambiar de un usuario a otro, si el
primero no ha eliminado la sesión de alguna forma, el segundo puede utilizarla
ilı́citamente.
Debe realizarse un control de IP: Si, por cualquier motivo, un atacante consigue
el identificador de sesión de otro, no debe ser posible que acceda a la aplicación
utilizando este identificador desde otra máquina.
Envı́o de token asociado a formularios: Este control consiste en establecer o bien
un campo hidden con un token único en formularios y enlaces a zonas autenticadas
de la aplicación o un parámetro token=xxxxxxxxxx a las URL destino de zonas
autenticadas. De esta forma emulamos sesiones autenticadas con accesos, “de un
solo uso” y este uso se invalida frente un acceso del usuario generando un nuevo
token. La forma de utilizar esto es la siguiente:
1. El cliente se autentica ofreciendo las credenciales correctas.
2. El servidor genera un valor aleatorio suficientemente grande, unos 20 bytes
serı́a más que suficiente, y lo añade a un campo hidden o a la URL de todas
los enlaces que se generen en la página a enviar al cliente.
3. El servidor almacena ese valor aleatorio en la sesión.
4. Cuando el cliente realiza una nueva petición, envı́a el token de forma transparente, el servidor lo valida, genera un nuevo token y sustituye el anterior. A
partir de aquı́ se continúa nuevamente desde el punto 2.
En entornos abiertos: En este punto, nos referimos a transmisiones realizadas mediante WIFI, LANs y entornos poco fiables. En estos casos, deberı́amos utilizar SSL
Desarrollo Web Avanzado
Seguridad Web
16
4 Errores de seguridad convencionales.
puesto que a un usuario autenticado, se le podrı́a robar el identificador de sesión y
suplantar su dirección IP.
Mediante cookies: Podemos ver las cookies como datos adicionales que se establecen
en el lado del cliente y contienen, en el caso de las sesiones, el identificador de sesión.
Sobre éstas, deben aplicarse las medidas de seguridad explicadas anteriormente.
SessionId: De forma alternativa a las cookies para almacenar el identificador de
sesión en el cliente, algunas implementaciones de lenguajes de servidor, nos permiten
inicializar la sesión añadiendo sessionid=xxxxxx al final de la URL que representa
la petición.
4.
Errores de seguridad convencionales.
A continuación, veremos una relación de descripción, ejemplo y solución a aplicar para
las técnicas más utilizadas en cuanto a explotación Web.
4.1.
HTML injection.
Descripción: Este tipo de técnica consiste en inyectar código HTML que no es
correctamente saneado para manipular el código HTML final que visualizará el
usuario. Este tipo de ataques se utilizan como complemento de otros más complejos
como, por ejemplo, el phishing16 .
Ejemplo: A continuación puede verse un código, escrito en PHP, que es vulnerable,
en él podemos introducir en el formulario <H1>Injection</H1> alterando el resultado final.
htmlinj.php
1
2
3
4
5
6
7
8
9
16
<?
if ($_GET[’user’]){
echo "Hola: " . $_GET[’user’];
}
else{
echo "<form method=’GET’ action=’’>".
"Introduce tu nombre: <input type=’text’ name=’user’>".
"<input type=’submit’ value=’enviar’>";
}
http://es.wikipedia.org/wiki/Phishing
Desarrollo Web Avanzado
Seguridad Web
4.2 SQL Injection.
10
17
?>
11
Figura 4: Inyección HTML.
Solución: Utilizar funciones de conversión de caracteres especiales a entidades HTML
para que éstos sean visualizados a través del navegador en lugar de ser interpretados
por él.
4.2.
SQL Injection.
Descripción: Esta técnica permite manipular las consultas SQL que se realizan contra una base de datos para que el comportamiento no sea el esperado por el programador.
Ejemplo: Imaginemos que en la consulta del siguiente ejemplo, “SELECT * FROM
users WHERE login=’$login’ and pass=’$pass”’ el usuario introduce el siguiente
valor de login: ’OR 1=1#, la consulta SQL resultante se convertirı́a en “SELECT *
FROM users WHERE login=’’OR 1=1#’ and pass=”” que siempre devolverá tantas filas como usuarios existan en la BBDD y por tanto la comprobación de la lı́nea
13 se evaluarı́a como cierta sin haber introducido las credenciales de acceso correctas.
sqlinj.php
1
2
3
4
<?
$login= $_POST[’login’];
$pass= $_POST[’pass’];
$host= "localhost";
5
6
7
8
$conexion= mysql_connect($host, ’user’, ’pwd’);
$consulta="SELECT * FROM users WHERE login=’$login’" .
"and pass=’$pass’";
Desarrollo Web Avanzado
Seguridad Web
18
4 Errores de seguridad convencionales.
9
10
11
12
13
14
15
16
17
$result= mysql_db_query(’bbdd’, $consulta)
or die("<h1>Fallo en la consulta</h1>");
$num_rows= mysql_num_rows($result);
if ($num_rows > 0)
//Usuario logeado;
else
//Usuario invalido;
?>
Solución: Utilizar funciones de escapado de caracteres especiales en consultas a
BBDD para los valores introducidos por el usuario. En PHP puede utilizarse la
función mysql real escape string y en Java la clase PreparedStatement.
4.3.
Blind SQL Injection.
Descripción: Esta técnica se basa en el mismo error de programación del SQL injection convencional con la diferencia de que, modificando la sentencia, el atacante
sólo logra alguna modificación sutil del sitio Web sin más información. Esto suele
aprovecharse por medio de ataques de fuerza bruta (prueba y error de determinado espacio de soluciones) o ataques con diccionario (prueba y error con espacio de
soluciones predefinido).
Ejemplo: En este ejemplo, podemos ver como ante una consulta válida, a pesar
de no existir un id determinado, el texto “Noticia:” aparecerá. Si la consulta falla,
este no aparecerá. De esta forma el atacante tiene la certeza de que esta enviando
consultas válidas contra la BBDD y por tanto puede ejecutar el código SQL que sea
necesario para conseguir su objetivo.
Un ataque común que aprovecha esta vulnerabilidad es el uso de la función user()
para obtener el usuario que conecta con la bbdd ejecutando la siguiente secuencia
de sentencias SQL aprovechando la inyección:
• select * where user() like “a %”
• select * where user() like “b %”
• select * where user() like “c %”
• select * where user() like “d %”
• ...
• select * where user() like “ra %”
• select * where user() like “rb %”
• select * where user() like “rc %”
• select * where user() like “rd %”
Desarrollo Web Avanzado
Seguridad Web
4.4 Cross Site Scripting (XSS).
19
• ...
Hasta obtener el nombre de usuario correcto.
bsqlinj.php
1
2
3
<?
$login= $_POST[’id’];
$host= "localhost";
4
5
6
$conexion= mysql_connect($host, ’user’, ’pwd’);
$consulta="SELECT text FROM news WHERE id=’$id’";
7
8
9
10
11
12
13
14
15
$result= mysql_db_query(’bbdd’, $consulta)
if (!$result)
die();
else{
while($r= mysql_fetch_assoc($result))
echo "Noticia: " . $r[’text’];
}
?>
Solución: Como en el caso anterior, utilizar funciones de escapado de caracteres
especiales SQL.
4.4.
Cross Site Scripting (XSS).
Descripción: Esta técnica aprovecha, de nuevo, el hecho de un saneamiento de
parámetros de entrada incorrecto para inyectar código de script en el cliente, por
ejemplo JavaScript, para obtener datos confidenciales y enviarlos a un tercer servidor.
Ejemplo: El código que se ha utilizado como ejemplo es el mostrado en el listado del
punto 4.1. En cuyo formulario hemos introducido la siguiente secuencia de caracteres
<script>alert(document.cookie);</script> haciendo que se nos muestre la cookie
seleccionada para ese dominio.
El ataque completo, consiste en hacer que un usuario “pinche” sobre un enlace
especialmente creado con el código indicado en él.
Desarrollo Web Avanzado
Seguridad Web
20
4 Errores de seguridad convencionales.
Figura 5: Cross Site Scripting.
En el ejemplo, hemos utilizado la función JavaScript alert para mostrar el efecto
aunque en un ataque real se utilzarı́an marcas como <img src= o <iframe src=
para hacer que el usuario enviara los datos de sesión a un tercer servidor controlado
por el atacante.
Solución: Este error se evita, también, realizando el saneamiento adecuado sobre las
variables de entrada, o bien eliminando las marcas especiales o bien traduciendo los
caracteres especiales a entidades html.
4.4.1.
XSS en sesiones no autenticadas.
Cuando la sesión aún no ha sido autenticada, el identificador de sesión existente en la
cookie aún no tiene valor, aún ası́, pueden realizarse dos tipos de ataques.
Fijación de sesión: Un atacante podrı́a establecer la cookie mediante, por ejemplo,
Javascript utilizando document.cookie=, una vez hecho esto, solo harı́a falta esperar
a que el usuario se autenticara para que el atacante posea un identificador de sesión
correspondiente a una sesión autenticada.
Abuso del gestor de contraseñas: Esta técnica se basa en intentar extraer la contraseña del formulario una vez se introduzca automáticamente por el gestor de contraseñas del navegador.
El ataque se basa en inyectar algo como:
Desarrollo Web Avanzado
Seguridad Web
4.5 Cross Site Request Forgeries (CSRF).
21
<script>
function getPwd(){
alert(document.forms[0].pwd.value);
}
setTimeout("getPwd();",4000);
</script>
En un sitio Web en el que existe un formulario de autenticación, el campo de introducción de password posee como name pwd y el usuario ha utilizado el gestor de
contraseñas para recordarla.
4.4.2.
XSS autocontenidos.
Las últimas versiones de navegadores Web, en concreto Firefox y Opera, incorporan la
implementación del RFC 239717 por medio del cual se pueden especificar url’s con el siguiente formato:
data:[<mediatype>][;base64],<data>
Esto permite evitar, por parte del atacante, los controles sobre marcas de formato puesto
que estas pueden ir codificadas en base64 como puede verse a continuación:
data:text/html;base64,PHNjcmlwdD4KYWxlcnQoIlNlbGYtY29udGFpbm
VkIFhTUyIpOwo8L3NjcmlwdD4=
Que es equivalente a:
<script>
alert("Self-contained XSS");
</script>
4.5.
Cross Site Request Forgeries (CSRF).
Descripción: Un forjado o creación de petición cruzada consiste, aprovechando una
vulnerabilidad de inyección de código HTML, en hacer que el usuario realice, sin
percatarse, una petición a determinado sitio.
17
http://www.ietf.org/rfc/rfc2397.txt
Desarrollo Web Avanzado
Seguridad Web
22
4 Errores de seguridad convencionales.
Ejemplo: Supongamos que un usuario permanece autenticado en, por ejemplo, un
webmail, nosotros desde un enlace especialmente diseñado, hacemos que cargue una
página en la que inyectamos el siguiente código:
<img src=http://webmail.xx.yy/index.php?cmd=delete&mailbox=Inbox&confirm=false/>
Casualmente el código inyectado realiza un borrado de la carpeta de entrada de
correo electrónico de ese usuario en el webmail y puesto que la petición la realiza
el navegador del usuario, éste envı́a el identificador de sesión y en consecuencia la
acción se ejecuta exitosamente.
Solución: Nuevamente, el escapado de caracteres especiales debidamente, soluciona
este problema.
4.6.
XPath Injection.
Descripción: Esta técnica permite manipular las consultas XPath que se realizan
contra estructuras de datos XML.
Ejemplo: Imaginemos la siguiente consulta
//user[name/text()=’$login’ and password/text()=’$pass’]
si se introduce como login: ’ or 1=1 or ”=’, la consulta XPath resultante se convertirı́a en “//user[name/text()=’’ or 1=1 or ”=’’ and password/text()=”] que siempre
devolverá tantas entidades como usuarios existan en la estructura XML y por tanto
si se comprobara que el número de entidades devueltas es distinto de cero, el atacante habrı́a conseguido obviar la autenticación.
Solución: Escapar los caracteres especiales en consultas XPath.
4.7.
Cross Site Tracing (XST).
Descripción: Este ataque utiliza el método TRACE del protocolo HTTP para tener
acceso a las cabeceras que envı́a el cliente. Como ejemplo de aplicación práctica,
supongamos que un cliente posee una cookie establecida con el valor httponly (ver
punto 5.4), de forma que no se puede acceder a ella mediante scripting por vulnerabilidades XSS pero, si el servidor tuviera activo este método, se podrı́a construir una
petición XMLHttpRequest haciendo uso del método TRACE y la cookie nos serı́a
devuelta en el cuerpo de la respuesta como puede verse en el ejemplo a continuación.
Ejemplo: Este es un ejemplo de funcionamiento del método TRACE en cuya lı́nea 17
podemos apreciar como se devuelve la cookie utilizada en el cuerpo de la respuesta.
Desarrollo Web Avanzado
Seguridad Web
4.8 Session Fixation.
1
2
3
4
5
6
7
23
xst.sh
paul@chip:~$ telnet jepsi.org 80
Trying 66.98.168.3...
Connected to jepsi.org.
Escape character is ’^]’.
TRACE / HTTP/1.1
Host: www.jepsi.org
Cookie: id=1234567
8
9
10
11
12
13
HTTP/1.1 200 OK
Date: Tue, 17 Jun 2008 14:57:09 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: message/http
14
15
16
17
18
3d
TRACE / HTTP/1.1
Cookie: id=1234567
Host: www.jepsi.org
19
20
21
0
22
23
Connection closed by foreign host.
Solución: Este ataque no se puede llevar a cabo por sı́, es necesario un vector de
ataque como puede ser la explotación de una vulnerabilidad XSS en la aplicación.
Por tanto la solución aquı́ pasa por, nuevamente, aplicar las medidas de filtrado de
entradas de forma adecuada.
Obviamente, la desactivación del método TRACE en el lado del servidor, anula la
posibilidad de explotar esta particularidad.
4.8.
Session Fixation.
Descripción: Esta técnica consiste en “fijar” la sesión del usuario previamente y
esperar a que se autentique en el sistema. De esta forma, como la sesión la ha
establecido el atacante posee su id y por tanto tiene acceso a esta sesión autenticada.
Ejemplo: El atacante hace que el usuario siga un enlace, bien sea publicándolo en un
foro, enviándole un mail o mediante un acceso a una página controlada por el atacante que contenga enlaces tipo <img src=”http://www.xxx.yy/?sessionid=123456”>.
Una vez que el usuario accede a esa URL de una forma u otra, se le establece una
cookie con ese identificador de sesión y en caso de autenticarse seguidamente en el
sitio al que pertenece la cookie, el atacante ya tendrı́a acceso autenticado.
Desarrollo Web Avanzado
Seguridad Web
24
4 Errores de seguridad convencionales.
Solución: El no aceptar sesiones que no hayan sido generadas por el servidor, la
regeneración del identificador de sesión frente a cada petición o el uso de tokens
(véase 3.3) son soluciones posibles. A continuación mostramos un ejemplo de como
aceptar únicamente sesiones generadas en el servidor:
sessfix.php
<?
if (!isset($_SESSION[’SERVER_GENERATED_SID’])) {
session_destroy(); // destroy all data in session
}
session_regenerate_id(); // generate a new session identifier
$_SESSION[’SERVER_GENERATED_SID’] = true;
?>
1
2
3
4
5
6
7
4.9.
Session Hijacking.
Descripción: Podemos traducir esta técnica como “secuestro de sesión” y consiste en
obtener acceso a los datos de la sesión para obtener acceso autenticado a determinado
sitio Web.
Ejemplo: En un entorno en el que utilizamos conectividad WIFI, alguien captura
todos los paquetes que las máquinas conectadas estas emitiendo, en uno de ellos
encuentra una petición HTTP generada por nuestra máquina en la que se envı́a una
cookie a un sitio Web en el que estamos autenticados. Este usuario, se establece
dicha cookie y accede al sitio.
Solución: Las soluciones en este punto pasan por cifrar el canal de comunicaciones
o realizar comprobaciones adicionales sobre el cliente que mantiene la cookie de
sesión lı́cita. Esta última, tiene también problemas de seguridad puesto que en una
red “abierta” cualquiera puede “competir” con nosotros por la misma dirección IP
si no se adoptan las medidas necesarias.
4.10.
Weak Upload File Checks.
Descripción: Se comprueba el upload o renombrado de ficheros de forma insuficiente.
Ejemplo: Permitimos que el usuario suba y nombre sus ficheros con extensiones del
tipo .php, .php4, .php5, .cgi, .py, .asp, .aspx, etc. Estos ficheros, dependiendo de
la configuración del servidor Web, pueden convertirse en ejecutables por módulos
interprete del servidor Web por el simple hecho de nombrarse ası́. De esta forma un
atacante que perciba esta situación podrı́a ejecutar código arbitrario en el servidor.
Desarrollo Web Avanzado
Seguridad Web
4.11 Allow url fopen.
25
Solución: Desactivar “motores interpretes” en los directorios en los que se almacenen
los ficheros (i.e. “php admin flag engine off” para PHP) o realizar comprobaciones
restrictivas en cuanto a nombre de ficheros, esto es, por ejemplo para imágenes .jpg,
permitir únicamente el upload y renombrado de ficheros con extensión .jpg en lugar
de permitir todas las extensiones salvo aquellas que acaben en .php, .php5, etc.
Las comprobaciones sobre la extensión y las comprobaciones permisivas tienen problemas de seguridad adicionales como veremos en los puntos 4.15 y 4.16
4.11.
Allow url fopen.
Descripción: Muchos módulos correspondientes a interpretes de lenguajes de servidor, permiten llevar a cabo acciones como esta (en PHP):
file get contents(“http://www.xxxxx.yy/a”)
Por otro lado, muchos programadores cometen el error de implementar sus aplicaciones Web con URLs como esta:
http://www.xxxx.yy/index.php?content=products.php
estas dos circunstancias permiten inyectar código en el servidor.
Ejemplo: En la URL anterior, el atacante introduce en vez de la cadena products.php, esta otra: http://www.xxxxx.yy/myphp de forma que su script se incluirá en el script del servidor y se interpretará pudiendo ejecutar código arbitrario.
Solución: Deshabilitar esta funcionalidad y no permitir que el usuario pueda modificar los “includes” que realiza el código del servidor.
4.12.
División de respuesta HTTP.
Descripción: Esta técnica consiste en hacer que el servidor imprima un “carriage return” junto con un “line feed” seguido de una respuesta especialmente confeccionada
por el atacante. De esta forma el atacante, puede conseguir realizar ataques XSS o
cache poisoning, éstos últimos, consisten en manipular la cache de los proxy-cache
intermedios si los hubiera, de forma que, después del ataque, enviarán la información
manipulada como válida.
Ejemplo: Supongamos una aplicación que establece el nombre de usuario en una
cookie obteniendo el mismo de una entrada que ha proporcionado el usuario, en
condiciones normales, la cookie se establecerı́a como vemos a continuación:
Desarrollo Web Avanzado
Seguridad Web
26
4 Errores de seguridad convencionales.
setcook
HTTP/1.1 200 OK
...
Set-Cookie: usuario=paul
...
1
2
3
4
1
2
3
Pero si el usuario introduce la siguiente cadena paulCRLFHTTP/1.1 200 OKCRLF
la respuesta ofrecida por el servidor es la siguiente:
setcookspl
HTTP/1.1 200 OK
...
Set-Cookie: usuario=paul
4
HTTP/1.1 200 OK
...
5
6
De esta forma, se ha divido la respuesta HTTP en dos confundiendo a proxy caches
intermedios los cuales pueden almacenar en cache la segunda respuesta como buena,
a partir de entonces servirán esa página como si de la original se tratara.
Solución: Filtrar correctamente las entradas para no permitir que el usuario pueda
manipular la respuesta del servidor.
4.13.
DNS Rebinding.
Descripción: La técnica de DNS rebinding es aprovechable desde Applets en Java,
aplicaciones Flash y tecnologı́as similares de cliente. El objetivo principal de esta
técnica suele ser la realización de un escaneo de servicios contra máquinas de una
red privada no visible desde Internet.
Ejemplo: La secuencia de realización de este ataque es la siguiente:
1. El atacante logra que la vı́ctima visite un sitio Web controlado por él y sobre
cuyo registro DNS correspondiente al dominio tiene control y ha seleccionado
un TTL muy bajo en la configuración del mismo.
2. El cliente descarga un applet.
3. Este applet únicamente puede conectarse con el dominio del que se descargo
debido a la “same origin policy”.
4. El atacante cambia el registro DNS para que apunte a un ip correspondiente
a la máquina que queremos escanear dentro de la red privada, por ejemplo
10.0.0.5
5. El applet intenta conectar a todos los puertos de esa máquina y recopila toda
la información posible.
Desarrollo Web Avanzado
Seguridad Web
4.14 Comprobación insuficiente.
27
6. El atacante restablece el registro DNS con su información original.
7. El applet conecta de nuevo al servidor para devolver el resultado del escaneo.
Solución: La gestión, a veces impredecible, de la cache de los servidores DNS hace
que este ataque sea impracticable en la realidad. A pesar de ello, las últimas versiones
de entornos de ejecución de aplicaciones en cliente (plugin Java, plugin Flash, etc.)
realizan una resolución de nombre en el despliegue de la aplicación y cachean el
resultado para utilizarlo durante toda la sesión.
4.14.
Comprobación insuficiente.
Descripción: Otro de los errores comunes en lo referente a la programación Web
es el hecho de no realizar las comprobaciones suficientes, por ejemplo, frente a la
autorización de usuarios al acceso de algunos recursos.
Ejemplo: En un sitio Web, cuando un usuario se autentica le aparece un enlace que
le permite llevar a cabo una acción privilegiada. Cuando otro usuario no autenticado
accede directamente a este enlace a pesar de no estar autenticado, puede realizar la
acción privilegiada.
Solución: Comprobar siempre la autorización frente al acceso a un recurso en cada
script. Una técnica aconsejable es separar scripts con acciones privilegiadas de aquellos que no lo son, en la medida de lo posible, e invocar funciones de comprobación
siempre al inicio de los scripts que requieren autenticación.
4.15.
Null Byte.
Descripción: Esta técnica se basa en la forma en la que se implementan ciertas
funcionalidades por parte de los interpretes de código. Cuando se abre un fichero o
se realiza una lectura, las llamadas a funciones suelen traducirse a implementaciones
nativas en C. Esta técnica aprovecha esta situación para introducir una marca de
fin de de cadena 0x0 que tiene el efecto de delimitar el fin de la cadena en C, pero
no tiene más significado que un carácter adicional en lenguajes interpretados.
Ejemplo: Si por ejemplo utilizamos el lenguaje de programación Java en el servidor,
podrı́amos realizar la comprobación de que un nombre de fichero finaliza con .jpg
de la siguiente forma:
1
2
3
nullbyte.java
if (filename.endsWith(".jpg"))
{
File f = new File(filename);
Desarrollo Web Avanzado
Seguridad Web
28
5 Técnicas de protección adicionales.
...
4
5
Esta comprobación se evaluarı́a a true ante la cadena fichero secreto.txt %00.jpg
pero al realizar la apertura del fichero, éste se interpretarı́a como fichero secreto.txt
puesto que la cadena contiene un byte nulo aquı́. Por tanto el fichero accedido
finalmente serı́a este último.
Solución: Filtrar y eliminar los Null Bytes de la cadena antes de realizar operaciones
de bajo nivel.
4.16.
Apache y mod mime.
Descripción: Puesto que Apache es uno de los servidores Web más utilizados para servir sitios Web, cabe comentar una particularidad que puede hacer que las
comprobaciones sobre ficheros no se realicen correctamente.
Ejemplo: Cuando nombramos un fichero como script.php.xyz, el módulo encargado
de interpretar el tipo de fichero adecuado (mod mime), intenta mapear el tipo .xyz,
sino existe, intenta mapear el tipo .php y ası́ sucesivamente.
Solución: Realizar comprobaciones restrictivas sobre los nombres de fichero como se
indica en el punto 4.10.
5.
Técnicas de protección adicionales.
A través del documento, se han ido mostrando técnicas de explotación de errores de
seguridad ası́ como las soluciones a aplicar en cada caso, pero existen vulnerabilidades
que tienen relación, no tanto con los errores de programación, sino con las aplicaciones
en sı́, a continuación, describimos algunas de estas situaciones.
5.1.
Captchas, tipos de ataques.
Si nuestra aplicación posee un formulario de registro, contacto, etc. Podemos sufrir un
ataque automatizado en el que un usuario malintencionado puede insertar cientos de
registros inválidos en la BBDD. Para evitar esto, se introducen los captchas, variantes de
la Prueba de Turing18 cuyo objetivo es garantizar o asegurar, en la medida de lo posible
que el registro no esta siendo realizado de forma automática.
18
http://es.wikipedia.org/wiki/Prueba de Turing
Desarrollo Web Avanzado
Seguridad Web
5.2 Controles anti-spam, ofuscación JavaScript.
29
Figura 6: Un ejemplo de Captcha.
Estos captchas deben ser lo suficientemente irregulares para imposibilitar el reconocimiento automático por programas de reconocimiento de imágenes. Por ejemplo un captcha
como el presentado en la figura 7 serı́a fácil de obviar por herramientas automatizadas.
Figura 7: Captcha de fácil reconocimiento de forma automatizada.
5.2.
Controles anti-spam, ofuscación JavaScript.
Una práctica habitual de los denominados spammers es la de descargar el contenido de
sitios Web y analizarlos en busca de direcciones de correo electrónico a las que poder
enviar correo basura. Para evitar el análisis automatizado en busca de direcciones de
correo por estas herramientas existen, al menos, dos opciones recomendables:
Codificar la dirección de correo electrónico indicando al usuario que se debe sustituir
para obtener el original. Por ejemplo santapau at uji dot es.
Como segunda opción podemos utilizar una codificación en javascript19 de forma que
este código transforma un texto ininteligible en la dirección correcta. Este método
funciona por el hecho de que los analizadores no suelen incorporar interpretes de
javascript y por tanto no encuentran la dirección de correo electrónico en el texto.
De estas opciones, la segunda es más recomendable puesto que algunos analizadores sı́ poseen la habilidad de sustituir ciertas cadenas como las mostradas en el ejemplo (at y dot)
obteniendo ası́ la dirección original.
19
Podéis encontrar un utilidad en: http://members.cox.net/timandbeth/spam/
Desarrollo Web Avanzado
Seguridad Web
30
5.3.
5 Técnicas de protección adicionales.
Herramientas de auditorı́a.
Existen diferentes herramientas para comprobar si nuestros desarrollos web son vulnerables a cierto tipo de ataques automatizados. Puesto que la descripción detallada del uso
de estas herramientas sobrepasa el objetivo de este texto, mencionaremos aquı́ cada una
de ellas junto con una descripción de las mismas.
WebScarab20 Herramienta promovida por el OWASP, permite auditar diferentes
tipos de errores como SQL injection o XSS entre otros. La herramienta ha sido
diseñada utilizando un arquitectura de plugins de forma que es bastante simple
incorporar nueva funcionalidad.
LiveHTTPHeaders21 Esta herramienta viene implementada en forma de extensión
para Mozilla Firefox y nos permite ver que cabeceras, tanto en la petición como en
la respuesta, se están produciendo en cada momento.
Tamper Data22 Esta herramienta también es una extensión para Mozilla Firefox, su
caracterı́stica principal es que permite manipular las cabeceras relativas al protocolo
HTTP antes de enviarlas.
Nessus Es una completa herramienta de auditorı́a que no se ciñe únicamente a la
auditorı́a web sino que explora otros diversos aspectos como arquitectura de red,
servicios de mail, DNS, etc. También posee una arquitectura de plugins que permite
incorporar fácilmente nuevas funcionalidades.
Fuzzers Podı́amos describir un fuzzer como “un alimentador de entradas aleatorias
de un espacio de posibilidades indicado”, es decir, un fuzzer genera entradas aleatorias que se corresponden a determinados criterios y las ofrecen al programa en
busca de comportamientos poco usuales.
5.4.
Cookies httponly y secure.
httponly: Este modificador de cookie hace que ésta no sea accesible mediante lenguajes de scripting en el lado del cliente, por tanto solo será enviada en peticiones
HTTP.
secure: Este modificador hace que la cookie sólo se envı́e si la conexión por la que
va a ser enviada implementa SSL, esto es, utiliza el protocolo https.
20
http://www.owasp.org/index.php/Category:OWASP webScarab Project
http://livehttpheaders.mozdev.org/installation.html
22
http://tamperdata.mozdev.org/
21
Desarrollo Web Avanzado
Seguridad Web
5.4 Cookies httponly y secure.
Desarrollo Web Avanzado
31
Seguridad Web
32
Referencias
Referencias
[1] Web Application Security Consortium. http://www.webappsec.org/. 2008.
[2] Open Web Application Security Project. http://www.owasp.org/. 2008.
[3] Gnu Citizen blog. http://www.gnucitizen.org/blog/self-contained-xss-attacks/. 2008.
[4] PortSwigger.
http://blog.portswigger.net/2008/05/null-byte-attacks-are-alive-andwell.html. 2008.
[5] Dafydd Stuttard and Marcus Pinto, The Web Application Hacker’s Handbook: Detecting and Exploiting Security Flaws.. Wiley, Octubre 2007.
Desarrollo Web Avanzado
Seguridad Web
REFERENCIAS
33
Reconocimiento - No comercial - Compartir igual: Este material puede ser distribuido,
copiado y exhibido por terceros si se muestra en los créditos la autorı́a del mismo. No se
puede obtener ningún beneficio comercial y las obras derivadas tienen que estar bajo los
mismos términos de licencia que el trabajo original.
Autor: Paúl Santapau Nebot. <[email protected]>
Revisado por: Manuel David Mollar Villanueva, Jacobo Avariento Gimeno.

Documentos relacionados