La funcionalidad de un sitio web y su adaptabilidad a todos tipo de dispositivos es importante, pero también lo es que sea la seguridad de la página y la protección de tus usuarios.
Hacemos un repaso de los ataques más comunes y cómo podemos defendernos ante esos ataques.
Según un informe hecho por Verizon en colaboración con el USSS (United States Secret Service).
Es un informe muy completo que analiza en profundidad los distintos tipos de ataques llevados a cabo con el objetivo final de robar información a corporaciones o particulares.
Estos son algunos datos relevantes del informe:
- 40% de robos por hacking.
- 98% de datos robados, procedentes de servidores.
- 85% de ataques considerados fáciles.
- 96% de los robos evitables con simples medidas.
Al ver estos datos, son suficientes para ponerse al día en el tema de seguridad web. A continuación explicamos los tipos de ataques más comunes.
Cross-Site Scripting (XSS)
Tipo de vulnerabilidad web que permite a personas malintencionadas insertar código de lado de cliente (Javascript, VBScript, Flash…) en páginas web accesibles por el resto de usuarios. Debido a esto, un atacante podría conseguir acceso a contenido sensible, cookies de sesión y demás información que el navegador almacene sobre el usuario atacado.
Una forma de evitar esta vulnerabilidad, sería ejecutar un código Javascript que obtenga la cookie que almacena el identificador de sesión (SID) y lo envía al atacante, pudiendo así usar esa cookie para suplantar al usuario afectado.
Hay una pequeña categorización de este tipo de ataques, que los divide en dos:
(A través de XSS una persona malintencionada puede insertar código en una web estando expuesto a sus peligros.) .
No persistente
Este es el más común y se produce cuando un usuario envía datos al servidor, “normalmente a través de la Query String (GET) o de un formulario (POST)” e inmediatamente el código del servidor genera una respuesta usando esa misma información sin limpiar de manera adecuada los datos.
Persistente
Puede llegar a afectar a cualquier usuario que entre en tu web. Consiste en insertar y almacenar código malicioso en el servidor, de forma que se muestre a cualquier persona que acceda a dicha página.
Esto es muy fácil de conseguir en las aplicaciones web que permiten a los usuarios generar contenido, como envíar comentarios, dar opinión en foros, etc…
Diferencias entre ataques Persistentes y No Persistentes
La diferencia entre persistente y no persistente es que en los ataques persistentes, el código queda almacenada en el servidor, mostrándose y ejecutándose en cada petición, mientras que los ataques no persistentes, inyectan el código de forma temporal como respuesta a una petición específica.
Cómo podemos protegernos
- Asegúrate de que todas las salidas generadas con textos potencialmente inseguros (enviados por usuarios) son completamente escapados. PHP nos ofrece algunas funciones como htmlentities o htmlspecialchars, o también puedes validar y sanear datos en PHP de forma bastante sencilla.
- El principal objetivo de este tipo de ataques, es el robo de las cookies. Muchos sitios web, evitan que un atacante pueda suplantar cookies de otros usuarios vinculando la cookie a la dirección IP para la cual se había creado. De esta forma, cuando alguien intente usar una cookie desde otro ordenador, será considerado como usuario malicioso y se ignorará la cookie. También existe la opción de especificar una cookie como HttpOnly, de forma que los navegadores no permiten acceder a dicha cookie al código ejecutado en el lado de cliente. Esta opción es soportada prácticamente por todos los navegadores modernos.
Cross-site request forgery (CSRF o XSRF)
Consiste en que una persona malintencionada envía un link a una persona que sabe que está identificada en una web, de esta forma provoca que la persona ejecute ciertos comandos sin enterarse.
Ejemplo:
Un banco dispone de un url para hacer una transacción. Fácilmente se podría generar un url para que un usuario identificado, enviara el dinero ha ese link.
Imagina que ese banco tiene un foro con su usuarios registrados donde poder opinar, etc. Si los textos no está saneados, una persona podría insertar una etiqueta HTML.
De esa manera cualquier usuario de ese foro intentará descargar esa imagen, pero en realidad lo que hará es enviar una orden de transacción en caso de que sea un usuario registrado.
Cómo podemos protegernos
- Requerir una clave secreta: al usuario antes de llevar a cabo cualquier acción.
- Limitar el tiempo de vida de la sesión.
- Deshabilitar la opción de “Recordarme”.
- Comprobar la cabecera Referer: cualquier petición que no contenga esta cabecera debe ser denegada. debido a que existen formas sencillas de evitar el envío de esa cabecera.
- Usar GET y POST debidamente: las peticiones GET nunca deben tener un efecto permanente. Si son envíos POST también se podrían falsear aunque lleva más complicidad.
SQL injection
Tipo de ataque que explota la vulnerabilidad de la capa de base de datos de una aplicación. Se muestra cuando los filtros pasados a una sentencia SQL no son escapados correctamente. Por lo que un usuario malitencionado puede envíar caracteres con significado especial en SQL para modificar la consulta.
“El 25% de los robos de los robos en 2009 a través de hacking fueron usando SQL injection.”
Ejemplo:
Imagina que la consulta en SQL para comprobar datos de inicio de sesión de un usuario son correctos.
Si las variables son recibidas directamente del formulario que ha sido enviado y no son escapadas, otro usuario podría hacer lo siguiente:
Usuario : carlos
Contraseña : ‘ or ‘1’=’1
Con esto conseguiría que la contraseña siempre fuera cierta y podría identificarse como cualquier usuario.
El uso de SQL tiene una gran variedad de posibilidades, ya que alguien con experiencia podría llegar a investigar en la base de datos y robar información, eliminar tablas importantes, añadir contenido malicioso, etc.
Cómo podemos protegernos
La solución es escapar los datos antes de añadirlos en la consulta. En PHP disponemos de una función llamada mysql_real_escape_string que limpiará todos los caracteres que tienen significado especial para MySql y pueden modificar la consulta.
Session Fixation
Este ataque aprovecha de la vulnerabilidad de algunos sitios que permiten a un usuario fijar el identificador de sesión (SID) de algún otro usuario.
Ejemplo:
Un usuario malintencionado se percata de que en el sitioweb “http://xyz.com” existe la posibilidad de cambiar el SID de los usuarios.
Este usuario, envía el siguiente link a una otra persona: http://xyz.com?SID=este_sera_tu_sid
Cuando la persona que ha recibido el link entre en el sitio web, el servidor establecerá su SID con el valor “este_sera_tu_sid”, por lo que el usuario que ha cambiado el link podrá saber el SID del usuario que ha abierto el link).
Entra en la web e inicia sesión.
El usuario malintencionado , al conocer el SID de un usuario identificado en la web, puede suplantarlo simplemente accediendo desde el link: http://vulnerable.com?SID=este_sera_tu_sid