En el blog anterior hablamos de las vulnerabilidades de las aplicaciones web en base al documento que genera la organización OWASP (Top 10 de OWASP), así mismo en este documento la organización da una serie de recomendaciones para prevenir ese tipo de ataques y los cuales describimos a continuación.
1.- Inyecciones
- Uso de API’s confiables, que evite el uso de un interprete por completo o proporcionar una interfaz parametrizada o migrar para usar herramientas de Mapeo Relacional de Objetos (ORM).
- Validación de entrada del lado del servidor de lista blanca.
- El uso de limit y otros controles dentro dentro de las consultas SQL para evitar la salida masiva de información en caso de una inyección.
2.- Pérdida de Autenticación
- La implementación multifactor cuando sea posible.
- No enviar o implementar credenciales predeterminadas en especiales para usuarios de administradores.
- Implementación de verificador de contraseñas.
- Contraseñas alineadas a las políticas de longitud, complejidad y rotación en base a las pautas de NIST 800-63 B’s guidelines sección 5.1.1 for Memorized Secrets o alguna otra política moderna de contraseñas.
- Asegurarse de que las rutas de registro, recuperación de credenciales y API estén reforzadas contra los ataques de enumeración de cuentas utilizando los mismos mensajes para todos los resultados.
- Limitar o retrasar el tiempo de respuesta cada vez más por cada intento fallido de inicio de sesión, así mismo llevar el registro de todas las fallas para avisar a los administradores cuando se detecten el relleno de credenciales, la fuerza bruta u otros ataques.
- Utilice un administrador de sesión integrado, seguro y del lado del servidor que genere un nuevo identificador de sesión aleatoria con alta entropía después de iniciar sesión, de igual forma los identificadores no deberán estar en la URL, deben almacenarse de forma segura e invalidarse después del cierre de sesión, inactivo y tiempos de espera absolutos.
3.- Exposición de datos sensibles
- Clasifique los datos procesados, almacenados o transmitidos por el sistema. Identifique qué información es sensible de acuerdo a las regulaciones, leyes o requisitos del negocio y del país.
- Aplicar controles según la clasificación.
- No almacenar datos sensibles que no son necesarios o utilice un sistema de tokenizacion que cumpla con PCI DSS.
- Cifre todos los datos sensibles cuando sean almacenados.
- Cifre todos los datos enviados o recibidos con protocolos seguros como TLS con cifrado de secreto directo perfecto (PFS), priorización de cifrado por parte del servidor y parámetros seguros. Aplique el cifrado mediante directivas como HTTP Strict Transport Security (HSTS).
- Utilice únicamente algoritmos y protocolos estándares y seguros e implemente una gestión adecuada de claves.
- Deshabilite el almacenamiento en cache de datos sensibles.
- Almacene contraseñas utilizando funciones de hashing adaptables con un factor de trabajo (retraso).
- Verifique de forma independiente la eficacia de la configuración y los ajustes.
4.- Entidades Externas XML (XXE)
- Siempre que sea posible, utilice formatos de datos menos complejos como JSON y evite la serialización de datos confidenciales.
- Tener actualizado los procesadores y bibliotecas XML que utilice la aplicación o el sistema subyacente.
- Desactive las entidades externas de XML y procesamiento DTD en todos los analizadores XML en su aplicación.
- Implemente validación y el filtrado de lista blanca del lado del servidor para prevenir el ingreso de datos dañinos dentro de documentos, cabeceras y nodos XML.
- Revisión manual de codigo o uso de herramientas SAST para detectar XXE.
5.- Pérdida de Control de Acceso
- Denegar de forma predeterminada el acceso a los recursos que no son públicos.
- Implemente los mecanismos de control de acceso una vez y reutilizarlos en toda la aplicación, incluyendo minimizar el control de acceso HTTP.
- Los controles de acceso deben imponer la propiedad de los registros, en lugar de aceptar que el usuario puede crear, leer, actualizar o eliminar cualquier registro.
- Deshabilite el listado de directorios del servidor web y asegúrese que los metadatos/fuentes de archivos y copia de seguridad no estén presentes en las carpetas públicas.
- Registre errores de control de acceso y alerte a los administradores cuando corresponda.
- Limite la tasa de acceso a las APIs para minimizar el daño de herramientas de ataque automatizadas.
- Los tokens JWT deben ser invalidados luego de la finalización de la sesión por parte del usuario.
6.- Configuración de Seguridad Incorrecta
- Los entornos de desarrollo, de control de calidad (QA) y de Producción deben configurarse de manera idéntica y con diferentes credenciales para cada entorno.
- Elimine o no instale frameworks y funcionalidades no utilizadas.
- Siga un proceso para revisar y actualizar las configuraciones apropiadas de acuerdo a las advertencias de seguridad y siga un proceso de gestión de actualizaciones.
- La aplicación debe tener una arquitectura segmentada que proporcione una separación efectiva y segura entre componentes y acceso a terceros, contenedores o grupos de seguridad en la nube (ACLs).
- Envíe directivas de seguridad a los clientes.
- Utilice un proceso automatizado para verificar la efectividad de los ajustes y configuraciones en todos los ambientes.
7.- Secuencia de Comandos en Sitios Cruzados (XSS)
- Utilizar frameworks seguros que, automáticamente codifican el contenido para prevenir XSS.
- Codificar los datos de requerimientos HTTP no confiables en los campos de salida HTML (cuerpo, atributos, JavaScript, CSS, o URL).
- Aplicar codificación sensitiva al contexto, cuando se modifica el documento en el navegador del cliente.
- Habilitar una Política de Seguridad de Contenido (CSP).
8.- Deserialización Insegura
- Implementación de verificación de integridad como firmas digitales en cualquier objeto serializado.
- Cumplimiento estricto de verificaciones de tipo de dato, durante la deserialización y antes de la creación del objeto.
- Aislamiento del código que realiza la deserialización.
- Registro de excepciones y fallas en la deserialización, tales como cuando el tipo recibido no es el esperado, o la deserialización produce algún tipo de error.
- Restrinja y monitoree las conexiones de entrada y salida de red desde contenedores o servidores que utilizan funcionalidades de deserialización.
- Monitoree los procesos de deserialización, alertando si un usuario deserializa constantemente.
9.- Componentes con vulnerabilidades conocidas
- Remover dependencias, funcionalidades, componentes, archivos y documentación innecesaria y no utilizada.
- Utilizar una herramienta para mantener un inventario de versiones de componentes tanto del cliente como del servidor.
- Obtener componentes únicamente de orígenes oficiales utilizando canales seguros.
- Supervisar bibliotecas y componentes que no poseen mantenimiento o no liberan actualizaciones de seguridad para sus versiones obsoletas o sin soporte.
10.- Registro y Monitoreo Insuficientes
- Asegurar de que todos los errores de inicio de sesión, de control de acceso y de validación de entradas de datos del lado del servidor se pueden registrar para identificar cuentas sospechosas.
- Asegúrese de que las transacciones de alto impacto tengan una pista de auditoría con controles de integridad para prevenir alteraciones o eliminaciones.
- Establezca una monitorización y alertas efectivas de tal manera que las actividades sospechosas sean detectadas y respondidas dentro de períodos de tiempo aceptables.
- Establezca o adopte un plan de respuesta o recuperación de incidentes, tales como NIST 800-61 rev.2 o posterior.
Estas son algunas de las recomendaciones para evitar los ataques antes mencionados, así mismo siempre es indispensable que un experto en el tema pueda asesorarte y revisar a fondo tu aplicación web para evitar posibles vulnerabilidades.