Seguridad de Sitios Web

Seguridad de Sitios Web

15 Jul 2020 in

La Seguridad web require vigilancia en todos los aspectos del diseño y empleo de un sitio web. Este artículo introductorio no te hará un gurú de la seguridad en sitios web, pero te ayudará a comprender de donde vienen las amenazas y qué puedes hacer para robustecer tu aplicación web contra los ataques más comunes.

Back to top

1) ¿Qué es la seguridad de sitios?

¡Internet es un sitio peligroso! Con mucha frecuencia escuchamos sobre sitios web que dejan de estar libres debido a ataques de denegación de servicio, o presentan información modificada (y habitualmente dañada) en sus páginas de comienzo. En otros casos de alto nivel, millones de contraseñas, direcciones de correo electrónico y detalles de tarjetas de crédito han sido filtrados al dominio público, exponiendo a los usuarios del sitio web tanto a bochorno personal como a peligro finaciero.

El propóisto de la seguridad web es prevenir ataques de esta (o bien de cualquier otra) clase. Pero formalmente, la seguridad es la acción/práctica de proteger sitios web del acceso, empleo, modificación, destrucción o bien interrupción, no autorizados.

La seguridad de sitios web eficiente precisa de sacrificios de diseño durante la totalidad del sitio web: en tu aplicación web, en la configuración del servidor web, en tus políticas para crear y renovar contraseñas, y en el código del lado usuario. Al mismo tiempo que todo esto suena muy inquietante, la buena nueva es que si estás utilizando un framework web de lado servidor, es casi seguro que habilitará por defecto mecanismos de defensa robustos y bien pensados contra gran cantidad de los ataques más comunes. Otros ataques pueden mitigarse por medio de la configuración de tu servidor web, por poner un ejemplo habilitando HTTPS. Finalmente, hay herramientas de escaneado de vulnerabilidades libres públicamente que pueden asistirte a averiguar si has cometido algún fallo obvio.

El resto de este artículo da más detalle sobre unas pocas amenazas comunes y algunos de los pasos simples que puedes dar para proterger tu sitio.

Nota: Este es un tema de introducción, diseñado para asistirte a meditar sobre la seguridad de sitios web. No pretende ser pormenorizado.

Back to top

2) Amenazas contra la seguridad de sitios web

Esta sección lista sólo ciertas pocas de las amenazas más comunes para los sitios web y cómo son mitigadas. A medida que vayas leyendo, fíjate cómo las amenazas tienen éxito cuando la aplicación web, ¡o confía o no es lo suficientemente paranoicaacerca de los datos que vienen del explorador web!

2.1) Cross-Site Scripting (XSS)

XSS es un término que se utiliza para describir una clase de ataques que permiten al atacante inyectar scripts de lado cliente, a travésdel sitio web, hasta los exploradores de otros usuarios. Como el código inyectado va del servidor del sitio al explorador, se supone de confianza, y de aquí que pueda hacer cosas como enviar al atacante la cookie de autorización al lugar del usuario. Cuando el atacante tiene la cookie pueden empezar sesión en el lugar como si fuera el auténtico usuario y hacer cualquier cosa que pueda hacer éste. En dependencia de que lugar sea, esto podría incluir acceso a los detalles de su tarjeta de crédito, ver detalles de contactos o cambiar contraseñas, etc.

Nota: Las vulnerabilidades XSS han sido históricamente más comunes que las de cualquier otro tipo.

Hay dos aproximaciones primordiales para lograr que el lugar devuelva scripts inyectados al explorador — se conocen como vulnerabilidades XSS reflejadasy persistentes.

  • Una vulnerabilidad XSS reflejadaocurre cuando contenido del usuario que se pasa al servidor se devuelve inmediatamente y sin modificarpar que los muestre el explorador — ¡cualquier script en el contenido original del usuario se ejecutará cuando se cargue una nueva página!
    Por ejemplo, considera una función de búsqueda en un lugar donde los términos de búsqueda están codificados como parámetros URL y estos términos se presentan junto con los resultados. Un atacante puede edificar un enlace de búsqueda que contenga un script malicioso como parámetro (ej. ?q=beer<script por ciento 20src="/tricky.js"></script>) y mandarlo como enlace en un correo electrónico a otro usuario: Si el receptor pincha en este "enlace interesante", el script se ejecutará cuando se muestren en pantalla los resultados de la búsqueda. Como discutimos arriba, ésto da al atacante toda la información que necesita para entrar en el lugar tal y como si fuera el usuario destinatario — efectuando compras potencialmente tal y como si fuera el usuario o bien compartiendo su información de contactos.
  • Una vulnerabilidad XSS persistentees aquella en la que el script malicioso se almacenaen el sitio web y después más tarde se vuelve a presentar en pantalla sin alterar para que otros usuarios lo ejecuten de manera involuntaria. Por servirnos de un ejemplo, un foro de discusión de discusión que accepta comentarios que contengan HTML sin modificar, podría guardar un script malicioso de un atacante. Cuando se muestren los comentarios se ejecutará el script y enviará al atacante la información requerida para acceder a la cuenta del usuario. Esta clase de ataque es extremadamente popular y muy potente, por el hecho de que el atacante no tiene que tener ninguna relación directa con las víctimas.

    Si bien los datos POSTo GETson las fuentes más comunes de vulnerabilidades, cualquier dato del explorador es frágil potencialmente (incluyendo los datos de cookies renderizados por el explorador, o los ficheros de los usuarios que éste sube o que se muestran).

Si bien los datos POSTo GETson las fuentes más comunes de vulnerabilidades, cualquier dato del explorador es vulnerable potencialmente (incluyendo los datos de cookies renderizados por el explorador, o los ficheros de los usuarios que éste sube o que se muestran).

La mejor defensa contra las vulnerabilidades XSS es quitar o deshabilitar cualquier etiqueta que pueda contener instrucciones para ejecutar código. En el caso del HTML ésto incluye etiquetas como <script>, <object>, <embed>, y <link>.

El proceso de alterar los datos del usuario de forma que no puedan emplearse para ejecutar scripts o bien que afecten de otra forma la ejecución del código del servidor, se conoce como "desinfección de entrada" (input sanitization). Muchos frameworks web desinfectan automáticamente la entrada del usuario desde formularios HTML, por defecto.

2.2) Inyección SQL

Las vulnerabilidades de Inyección SQL habilitan que usuarios maliciosos ejecuten código SQL arbitrario en una base de datos, dejando que se pueda acceder a los datos, se puedan alterar o borrar, con independencia de los permisos del usuario. Un ataque de inyección con éxito, podría falsificar identidades, crear nuevas identidades con derechos de administración, acceder a todos los datos en el servidor o bien destruir/modificar los datos para hacerlos inutilizables.

Esta vulnerabilidad está presente si la entrada del usuario que se pasa a la sentencia SQL subyacente puede cambiar el significado de la misma. Por servirnos de un ejemplo, considera el código de abajo, que pretende listar todos y cada uno de los usuarios con un nombre particularmente ( userName) que ha sido suministrado en un formulario HTML:

Si el usuario introduce su nombre real, la cosa marcha como se pretende. No obstante un usuario malicioso podría cambiar totalmente el comportamiento de esta sentencia SQL a la nueva sentencia de abajo, simplemente detallando para userNameel texto de abajo en " negrilla". La sentencia modificada crea una sentencia SQL válida que borra la tabla usersy selecciona todos y cada uno de los datos de la tabla userinfo(revelando la información de todos los usuarios). Esto funciona por que la primera una parte del texto inyectado ( a';) completa la sentencia original (' es el símbolo para indicar una cadena textual en SQL).

La forma de evitar esta clase de ataque es asegurar que cualquier dato de usuario que se pasa a un query SQL no puede cambiar la naturaleza del mismo. Una forma de hacer ésto estodos los caracteres en la entrada de usuario que tengan un significado singular en SQL.

Nota: La sentencia SQL trata el caracer ' como el principio y el final de una cadena de texto. Poniendo el carácter barra invertida \ delante, "eludimos" el símbolo (\'), y le afirmamos a SQL que lo trate como un carácter de texto (como parte de exactamente la misma cadena).

En la sentencia de abajo eludimos el carácter '. SQL interpretará ahora como "nombre" la cadena de texto completa mostrada en negrilla (!un nombre muy raro desde luego, pero no dañino¡)

Los frameworks web habitualmente tienen cuidado de hacer por tí la elusión de caracteres. Django, por servirnos de un ejemplo se asegura que cualquier dato de usuario que se pasa a los conjuntos de queries (modelo de queries) está corregido.

Nota: Esta sección se sustenta aquí en la información de.

2.3) Cross Site Request Forgery (CSRF)

Los ataques de CSRF permiten que un usuario malicioso ejecute acciones usando las credenciales de otro usuario sin el conocimiento o bien consentimiento de éste.

Este tipo de ataque se explica mejor con un ejemplo. John es un usuario malicioso que sabe que un lugar en particular permite a los usuarios que han comenzado sesión mandar dinero a una cuenta específica usando una petición HTTP POSTque incluye el nombre de la cuenta y una cantidad de dinero. John edifica un formulario que incluye los detalles de su banco y una cantidad de dinero como campos ocultos, y lo envía por correo electrónico a otros usuarios del lugar (con el botón de Enviarcamuflado como link a un sitio "hazte rico rápidamente").

Si el usuario pincha el botón de enviar, se envía al servidor una petición HTTP POSTque contiene los detalles de la transacción y todos los cookies de lado-cliente del servicio que el explorador asocia con el sitio(añadir cookies asociados con el sitio es un comportamiento normal de los exploradores). El servidor comprobará los cookies, y los usará para determinar si el usuario ha empezado sesión o bien no y si tiene permiso para hacer la transacción.

El resultado es que cualquier usuario que pinche en el botón Enviarmientras tiene la sesión iniciada en el sitio comercial hará la transacción. ¡John se hará rico!

Nota: El truco aquí es que John no necesita tener acceso a los cookies del usuario (o acceso a sus credenciales) — El explorador del usuario guarda esta información, y la incluye automáticamente en todas las solicitudes al servidor asociado.

Una forma de prevenir este tipo de ataque por parte del servidor es requerir que la petción POSTincluya una palabra secreta específica del usuario generada por el sitio (la palabra segrega podría proporcionarla el servidor cuando envía el formulario web que se emplea para hacer trasferencias). Esta aproximación evita que John pueda crear su propio formulario, pues necesitaría conocer la palabra segrega que el servidor ha proporcionado para el usuario. Incluso si conociese esta palabra y crease un formulario para un usuario particularmente, no podría emplear exactamente el mismo formulario para atacar a todos los usuarios.

Los frameworks web incluyen con cierta frecuencia semejantes mecanismos de prevención de CSRF.

2.4) Otras amenazas

Otros ataques/vulnerabilidades incluyen:

  • . En este tipo de ataque, el usuario malicioso secuestra las pulsaciones de ratón dirigidas a un sitio perceptible sobre los demás y las redirige a una página oculta por debajo. Esta técnica se usaría, por ejemplo, para presentar un sitio bancario legítimo mas apresar las credenciales de comienzo de sesión en uninvisible controlado por el atacante. De forma alternativa podría emplearse para conseguir que el usuario pinchara sobre un botón en un sitio visible, pero al hacerlo realmente estuviera sin advertirlo pinchando en otro botón completamente diferente. Como defensa, tu sitio puede resguardarse de ser embebido en un iframe de otro sitio configurando las cabeceras HTTP apropiadamente.
  • , DoS). DoS se consigue por norma general inundando el lugar objetivo con solicitudes espúreas de manera que se interrumpa el acceso a los usuarios legítimos. Las solicitudes pueden simplemente ser numerosas, o consumir individualmente gran cantidad de recursos (ej. lecturas lentas, subidas de grandes archivos, etcétera) Las defensas contra DoS por norma general trabajan mediante la indentificación y el bloqueo de tráfico "malo" permitiendo no obstante que atraviesen los mensajes legítimos. Estas defensas se hallan típicamente dentro o ya antes del servidor (no son una parte de la aplicación web misma).
  • /Revelación de Ficheros. En este género de ataque un usuario malicioso procura acceder a partes del sistema de archivos del servidor web a los que no debería tener acceso. Esta vulnerabilidad ocurre cuando el usuario es capaz de pasar nombres de fichero que incluyen caracteres del sistema de navegación (ej. ../../). La solución es desinfectar la entrada antes de emplearla.
  • . En este ataque un usuario es capaz de precisar, para enseñar o bien ejecutar, un fichero "no intencionado para ello" en los datos que le pasa al servidor. Una vez ha sido cargado este fichero podría ejecutarse en el servidor web o bien en el lado cliente (llevando a un ataque XSS). La solución es desinficionar la entrada antes de utilizarla.
  • . Los ataques de inyección de comandos permiten a un usuario malicioso ejecutar comandos del sistema arbitrarios en el sistema operativo del host. La solución es desinfectar la entrada de usuario antes de que pueda ser utilizada en llamadas al sistema.

Hay muchas más. Para un lisado completo ver(Wikipedia) y(Open Web Application Security Project).

Back to top

3) Unos cuantos mensajes clave

Casi todos los exploits de las secciones anteriores tienen éxito cuando la aplicación web confía en los datos que vienen del explorador. Sea lo que sea que hagas para prosperar la seguridad de tu sitio, deberías desinficionar todos los datos producidos por el usuario ya antes de ser mostrados en el explorador, utilizados en queries SQL o bien pasados en una llamada al sistema operativo o archivo de sistema.

Importante: La lección más esencial que debes aprender acerca de la seguridad de sitios web es nunca confíes en los datos del explorador web. Esto incluye los datos en parámetros URL de las solicitudes GET, datos POST, cabeceras HTTP y cookies, archivos subidos por los usuarios, etc. Verifica siempre y en todo momento y desinficiona todos y cada uno de los datos entrantes. Siempre acepta lo peor.

Otras cuantas medidas específicas que puedes tomar son:

  • Usar una gestión de contraseñas más efectiva. Promover las contraseñas fuertes y que se cambien de forma regular. Estimar para tu sitio web la autenticación de dos factores, de manera que, además de la contraseña, el usuario tenga que introducir algún otro código de autenticación (por norma general alguno que se distribuye mediante algún hardware que sólo tiene el usuario, como un código en un mensaje de texto mandado a su teléfono móvil).
  • Configurar tu servidor web para usary(HSTS). HTTPS encripta los datos enviados entre el cliente y el servidor. Esto asegura que las credenciales de incio de sesión, cookies, datos POSTe información de cabecera permanecen menos libres a los atacantes.
  • Seguir la pista a las amenazas más populares () y agredir las vulnerabilidades más comunes primero.
  • Usar herramientas depara efectuar pruebas automáticas de seguridad en tu sitio (más adelante, si tu sitio web llega a ser super exitoso puedes también hallar bugs por medio de ofrecer recompensas por encontrar bugs).
  • Almacena y muestra sólo los datos que precisen serlo. Por ejemplo, si tus usuarios deben guardar información sensible como los detalles de las tarjetas de crédito, sólo muestra lo bastante del número de tarjeta de forma que pueda ser identificada por el usuario, y no suficiente para que pueda ser copiado por el atacante y usado en otro lugar. El patrón más común hoy en día es mostrar sólo los cuatro últimos dígitos del número de la tarjeta de crédito.

Los frameworks web pueden asistir a atenuar muchas de las vulnerabilidades más comunes.

Back to top

4) Sumario

Este artículo ha explicado el término de seguridad en sitios web y ciertas amanazas más comunes contra las que tu lugar debería empezar a protegerse. Lo más esencial que deberías entender es que ¡una aplicación web no puede confiar en ningún dato que proceda de explorador web! Todos los datos de usuario deberían ser desinfectados antes de ser mostrados, o bien usados en queries SQL o bien llamadas a archivos de sistema.

Hemos llegado al final de, tratando tus primeros pasos en la programación de lado servidor de un sitio. Esperamos que hayas disfrutado del aprendizaje de los conceptos esenciales y estés listo para escoger un framework web y empezar a programar.

Back to top

5) En este módulo

Back to top
Share icon

ESTOS EXCLUSIVOS INFORMES GRATUITO REVELAN

7 SECRETOS DE EXPERTOS SEO QUE TE LLEVÁN AL 1#
7 SECRETOS DE EXPERTOS SEO QUE TE LLEVÁN AL 1# EN GOOGLE PARA GANAR 10.000s DE TRÁFICO DE CALIDAD GRATUITO - EN SÓLO 2 MESES
 

Los 7 pasos más poderosos para disparar tu ranking orgánico para ALCANZAR Y MANTENER un impresionante tráfico orgánico es TUYO.

Consigue gratis lo que el 1% de los expertos en SEO venden por miles de euros... y el otro 99% ni siquiera sabe que existe.


OBTEN MI INFORME GRATUITO
5 errores que debes evitar en tu sitio web de Drupal
Ebook - 5 errores que debes evitar en tu sitio web de Drupal (¡podrían costarte miles de euros!)
 

Este Ebook cubre 5 terribles errores que probablemente estés cometiendo ahora mismo con tu sitio web de Drupal.

¡Nº3 TE SORPRENDERÁ! Esta lectura de 10 minutos te ahorrará miles de euros.



OBTEN MI INFORME GRATUITO