Introducción: ¿Cuándo fue la última vez que examinaste la seguridad de tu aplicación web más allá de simplemente hacer que funcionara? Aquí está la aterradora verdad: cada campo de formulario, endpoint de API, script de terceros y archivo de configuración en tu aplicación podría ser un vector de ataque si se deja sin revisar. Las aplicaciones web modernas son más ricas y complejas que nunca, y eso significa una superficie de ataque creciente para los atacantes. De hecho, datos recientes muestran que las aplicaciones web están involucradas en casi la mitad de los incidentes de seguridad. Desde los infames riesgos del Top 10 OWASP hasta los CVEs recién descubiertos, las vulnerabilidades web no son teoría abstracta, están detrás de brechas reales que afectan a organizaciones de todos los tamaños.
El objetivo de este artículo es arrojar luz sobre las vulnerabilidades más críticas de las aplicaciones web desde las perspectivas de frontend y backend. Cubriremos los riesgos bien conocidos del Top 10 OWASP junto con exploits de alto perfil (como Log4Shell y otros) y errores de codificación comunes que los desarrolladores cometen en proyectos del mundo real. Para cada vulnerabilidad, explicaremos qué es, daremos un ejemplo o incidente real y describiremos cómo mitigarla. También verás – destacando cómo la plataforma de seguridad centrada en el desarrollador de Aikido (con características como escaneo de código, detección de secretos, SAST y escaneo IaC) puede ayudar a detectar o prevenir estos problemas antes de que te afecten en producción.
La lista:
1. Ataques de inyección (SQL, Command, LDAP)
2. Cross-Site Scripting (XSS)
3. Autenticación rota
4. Control de acceso roto
5. Configuraciones de seguridad incorrectas
6. Exposición de datos sensibles y fuga de secretos
7. Uso de componentes con vulnerabilidades conocidas
8. Falsificación de petición en sitios cruzados (CSRF)9. Falsificación de petición del lado del servidor (SSRF)
10. Deserialización insegura
¿Qué son las vulnerabilidades de las aplicaciones web?
Las vulnerabilidades de las aplicaciones web son debilidades o fallos en el diseño, implementación o configuración de una aplicación web que los atacantes pueden explotar para comprometer el sistema. Estas pueden variar desde errores de codificación como fallos de inyección, hasta configuraciones incorrectas como dejar una consola de administración abierta, o problemas de lógica que permiten a los usuarios eludir las comprobaciones de seguridad. Algunas vulnerabilidades permiten a los atacantes robar datos o tomar el control de cuentas de usuario; otras permiten el compromiso total del servidor o la propagación de malware a tus usuarios. Muchos de los errores "clásicos" se conocen desde hace años (y se resumen en la lista del Top 10 OWASP), sin embargo, siguen estando muy extendidos debido a la evolución de las pilas tecnológicas y al simple error humano.
A continuación, profundizaremos en las principales vulnerabilidades de seguridad de las aplicaciones web que todo desarrollador y equipo de DevSecOps debe conocer. Esta no es una lista exhaustiva de todos los errores existentes, sino más bien los problemas más comunes y peligrosos que vemos hoy en día, junto con consejos para evitarlos.
Las principales vulnerabilidades de las aplicaciones web (Frontend y Backend)
Las siguientes vulnerabilidades se extraen del Top 10 OWASP y de exploits recientes del mundo real. Cada una representa un riesgo grave para las aplicaciones web. Explorémoslas una por una:
1. Ataques de inyección (SQL, Command, LDAP, etc.)
Qué es: Los fallos de inyección ocurren cuando se envían datos no confiables a un intérprete como parte de un comando o consulta. Los más notorios son la inyección SQL (entrada maliciosa en consultas SQL) y la inyección de comandos del sistema operativo (entrada maliciosa ejecutada en el servidor). Cuando una aplicación incluye directamente la entrada del usuario en consultas de base de datos, comandos de shell, consultas LDAP o filtros ORM sin la validación adecuada, los atacantes pueden “inyectar” sus propios comandos. Esto puede llevar a robo de datos, corrupción de datos o toma de control completa del host. Según OWASP, la inyección es un riesgo de primer nivel, e incluso engloba el cross-site scripting en su clasificación.
Ejemplo: Un ejemplo destacado es la brecha de MOVEit Transfer de 2023. Los atacantes explotaron una vulnerabilidad de día cero de inyección SQL (CVE-2023-34362) en la aplicación web para compartir archivos MOVEit, lo que les permitió ejecutar código remoto en el servidor. El grupo de ransomware Clop utilizó este fallo para robar datos de cientos de organizaciones, demostrando cómo un solo error de inyección puede escalar a una brecha masiva. Este incidente mostró que SQLi no es solo un problema “de la vieja escuela”; sigue muy vivo y puede ser catastrófico.
Impacto: Los ataques de inyección exitosos pueden ser devastadores. Una inyección SQL puede volcar contraseñas de usuarios, registros personales o datos empresariales. La inyección de comandos del sistema operativo puede dar a un atacante una shell en su servidor, lo que lleva a un compromiso total de la infraestructura. En resumen, las vulnerabilidades de inyección a menudo conducen a una pérdida grave de datos, compromiso de cuentas o ejecución remota de código, lo que las convierte en una de las favoritas de los atacantes.
Prevención: La clave es nunca mezclar directamente la entrada no confiable con los comandos. Utilice consultas parametrizadas o declaraciones preparadas para el acceso a la base de datos (para que el intérprete SQL nunca confunda la entrada con el código). Para los comandos del sistema operativo, evite construir cadenas de comandos; utilice APIs seguras o incluya en la lista blanca los valores esperados. La validación de entrada y la codificación de salida también son capas defensivas importantes. El SAST (análisis estático de código) impulsado por IA de Aikido puede ayudar a detectar patrones de inyección peligrosos en su código antes del despliegue. Por ejemplo, el escaneo de código de Aikido marcará las ocurrencias donde la entrada del usuario se concatena en sentencias SQL o se pasa a llamadas al sistema sin sanitización. Al integrar dichos escáneres en su CI/CD o IDE, puede detectar y corregir automáticamente los fallos de inyección. ¡Con Aikido, podría haber detectado esa consulta SQL vulnerable mucho antes de que lo hicieran los atacantes!
2. Cross-site scripting (XSS)
Qué es: Cross-site scripting es un tipo de inyección dirigida a los navegadores de los usuarios. Una vulnerabilidad XSS permite a un atacante inyectar scripts maliciosos del lado del cliente (normalmente JavaScript) en páginas web vistas por otros usuarios. A diferencia de SQLi, que ataca su base de datos, XSS permite a un atacante manipular el contenido visto por los usuarios, potencialmente robando tokens de sesión, desfigurando la interfaz de usuario o entregando malware. XSS se presenta en variantes como XSS reflejado (el script malicioso proviene de una solicitud y se refleja en la respuesta), XSS almacenado (el script se almacena en el servidor, por ejemplo, en un campo de comentarios de una base de datos, y se sirve a cada espectador), y XSS basado en DOM (la vulnerabilidad está en el código del lado del cliente que modifica la página).
Ejemplo: Uno de los incidentes XSS más famosos fue la brecha de British Airways de 2018. El grupo de hackers Magecart inyectó un script malicioso en una biblioteca JS de terceros (Feedify) utilizada en el sitio web de BA. Este script extrajo detalles de tarjetas de crédito de la página de pago, enviando datos a un servidor controlado por el atacante. Los atacantes lograron robar información personal y de tarjetas de crédito de aproximadamente 380.000 transacciones antes de que se descubriera la brecha. En esencia, una vulnerabilidad XSS en un componente de la cadena de suministro llevó a un robo masivo de datos y multas costosas para BA. Otros ejemplos de XSS en el mundo real incluyen un error en la página web de Fortnite que podría haber expuesto millones de cuentas, y un XSS en el sitio de eBay que los atacantes explotaron para secuestrar cuentas de vendedores de alto valor.
Impacto: XSS compromete principalmente a los usuarios, pero puede afectar indirectamente la seguridad de su aplicación (y definitivamente su reputación). Los atacantes pueden robar cookies de sesión (para suplantar a los usuarios), realizar acciones como la víctima (como transferencias de fondos o cambios de contraseña si faltan protecciones CSRF), o mostrar formularios de phishing para engañar a los usuarios. Si la sesión de un usuario administrador es secuestrada a través de XSS, el atacante puede obtener el control total de la aplicación. Incluso los sitios no sensibles deberían preocuparse por XSS; nadie quiere que su sitio muestre avisos de inicio de sesión falsos o redirija a los usuarios a kits de explotación.
Prevención: La defensa contra XSS implica codificación de salida y políticas de seguridad de contenido. Cada vez que su aplicación muestra datos proporcionados por el usuario en una página web, debe escapar/codificar correctamente esos datos para el contexto (HTML, JavaScript, CSS, etc.) para que no pueda interpretarse como código. La mayoría de los frameworks web tienen bibliotecas de plantillas o codificación; úselas de forma consistente (evite crear HTML a partir de cadenas sin procesar). Implemente una Política de Seguridad de Contenido (CSP) robusta para limitar qué scripts pueden ejecutarse en sus páginas (aunque CSP es una segunda línea de defensa). El escaneo de código de Aikido puede detectar áreas donde la entrada del usuario se inserta en la página sin la sanitización adecuada. Por ejemplo, si utiliza inadvertidamente innerHTML o concatenación de cadenas para inyectar datos de usuario en el DOM, el analizador estático de Aikido lo marcará. Aikido también puede identificar banderas HTTP-only faltantes o cabeceras de Política de Seguridad de Contenido a través de su escaneo de configuración. Al detectar estos problemas a tiempo, evita el próximo ataque estilo Magecart a sus usuarios. (Extra: la base de conocimientos de vulnerabilidades integrada de Aikido puede incluso sugerir prácticas de codificación seguras, como usar textContent en lugar de innerHTML para evitar XSS basado en DOM.)
3. Autenticación rota
Qué es: Autenticación rota se refiere a las debilidades en la forma en que un sitio gestiona el inicio de sesión y la gestión de sesiones, como las credenciales de usuario, los IDs de sesión, el restablecimiento de contraseña y la recuperación de cuenta. Si los atacantes pueden comprometer fácilmente contraseñas, claves o tokens de sesión debido a una mala implementación, eso es autenticación rota. Los errores comunes incluyen políticas de contraseñas débiles (o ninguna limitación de velocidad en el inicio de sesión, lo que permite la fuerza bruta), no almacenar contraseñas de forma segura (por ejemplo, almacenar texto plano o hashes sin sal), usar IDs de sesión predecibles o inseguros, no invalidar sesiones al cerrar la sesión, y lógica defectuosa de “recordarme” o de restablecimiento de contraseña. Cualquier fallo que permita a un atacante hacerse pasar por otra persona (adivinando o robando credenciales/sesión) o iniciar sesión sin las credenciales adecuadas entra en esta categoría. Según OWASP, estos fallos de autenticación pueden llevar a la toma de control de cuentas y a importantes brechas de datos.
Ejemplo: No hay que buscar muy lejos para encontrar ejemplos: una gran parte de las brechas provienen de credenciales comprometidas. De hecho, el 81% de las brechas relacionadas con hacking en 2022 se debieron a contraseñas débiles o robadas. Un incidente específico: a principios de 2023, Uber reveló que la cuenta de un contratista fue comprometida porque el contratista reutilizó una contraseña encontrada en una brecha anterior. Los atacantes accedieron a los sistemas internos de Uber utilizando esa cuenta, esencialmente un fallo de autenticación (reutilización de contraseña y falta de MFA). Otro ejemplo: una brecha en 2024 en una empresa de servicios financieros donde la ausencia de autenticación multifactor (MFA) permitió a los atacantes usar contraseñas filtradas para acceder a cuentas, afectando a millones (esto se señaló en el contexto del incidente de datos de clientes de Snowflake; aunque la plataforma de Snowflake no fue directamente hackeada, la autenticación débil por parte del usuario llevó a la brecha). Estos casos demuestran que, incluso si el código de su aplicación es sólido, las prácticas de autenticación débiles (por parte de usuarios o desarrolladores) pueden abrir la puerta de par en par.
Impacto: La autenticación rota puede llevar a un compromiso total de la cuenta para cualquier usuario en el sistema, desde clientes habituales hasta administradores. Si un atacante obtiene credenciales de usuario (mediante fuerza bruta, relleno de credenciales utilizando contraseñas filtradas, o explotando un fallo en su lógica de autenticación), pueden suplantar a ese usuario y acceder a todos sus datos. Es particularmente grave si se comprometen cuentas de administrador o privilegiadas; el atacante podría robar todos los datos, cambiar configuraciones o pivotar aún más hacia redes internas. Incluso a menor escala, las cuentas de usuario comprometidas pueden resultar en fraude, violaciones de la privacidad y pérdida de confianza del usuario.
Prevención: Las defensas de autenticación robustas son imprescindibles. Aplique requisitos de contraseña fuertes y utilice hashing (con un algoritmo fuerte como bcrypt o Argon2) más salting para las contraseñas almacenadas; nunca almacene contraseñas en texto plano. Implemente autenticación multifactor para cuentas o acciones sensibles; MFA puede frustrar muchos ataques basados en contraseñas. Utilice una gestión de sesiones segura: haga que los IDs de sesión sean aleatorios e imposibles de adivinar, establezca su caducidad e invalide las sesiones al cerrar la sesión. Evite exponer los IDs de sesión en las URLs (utilice cookies con las banderas Secure y HttpOnly). Implemente protección contra fuerza bruta (bloqueos o CAPTCHAs después de varios intentos de inicio de sesión fallidos) y supervise el relleno de credenciales.
La plataforma de Aikido puede ayudar detectando debilidades comunes de autenticación en su código y configuración. Por ejemplo, el escáner de Aikido le advertirá si está utilizando un método de hashing de contraseñas débil (o, peor aún, almacenando contraseñas en texto plano). También puede detectar si las cookies de sesión no están marcadas como Secure/HttpOnly, o si la configuración de seguridad de su framework web (como Django o Express) está mal configurada para la gestión de sesiones. Además, la detección de secretos de Aikido podría alertarle si accidentalmente codifica una clave API o una contraseña de cuenta de servicio en su código (evitando que esos secretos se conviertan en una puerta trasera de inicio de sesión para un atacante). Al detectar estos problemas a tiempo, usted impone un esquema de autenticación más fuerte desde el principio.
4. Control de acceso roto (Fallos de autorización e IDOR)
Qué es: El control de acceso roto es actualmente el riesgo más crítico para las aplicaciones web, según OWASP. Se refiere a fallos en la aplicación de la autorización —es decir, las reglas sobre lo que los usuarios autenticados pueden hacer. Incluso si un usuario es quien dice ser (autenticación exitosa), la aplicación debe restringirlo únicamente a los datos y funciones permitidos. Los fallos comunes en el control de acceso incluyen no verificar los roles/permisos de usuario en ciertas acciones, confiar en la aplicación del lado del cliente (que los atacantes pueden eludir) o exponer referencias a objetos internos sin verificar la propiedad. Una variante extremadamente común es IDOR (Referencia Directa Insegura a Objeto), donde una aplicación utiliza IDs proporcionados por el usuario (como números de cuenta, IDs de documentos, etc.) para obtener datos sin confirmar que el usuario actual tiene permiso para acceder al objeto especificado. Por ejemplo, si GET /api/orders/12345 devuelve el pedido #12345 para cualquier usuario que lo solicite, un atacante podría simplemente cambiar el ID a 12346 y recuperar el pedido de otro usuario, un escenario de IDOR de manual. Otros ejemplos incluyen la falta de controles de acceso en endpoints de administración "ocultos", o errores de escalada de privilegios donde un usuario normal puede convertirse en administrador modificando un parámetro o un token JWT.
Ejemplo: La prevalencia del control de acceso roto es asombrosa: un estudio encontró que el 94% de las aplicaciones probadas tenían alguna forma de debilidad en el control de acceso. En cuanto a incidentes reales, considere la vulnerabilidad de la API de Kia Motors (2024): los investigadores descubrieron que, al proporcionar solo el VIN o el número de matrícula de un coche, podían llamar a ciertos endpoints de la API de Kia/Hyundai y ejecutar comandos del vehículo de forma remota (como desbloquear puertas), sin ningún token de autenticación. Este fallo crítico se redujo a un fallo de control de acceso en una API: el sistema no garantizó que la solicitud proviniera de un propietario autorizado. Otro ejemplo es la brecha de MOVEit que mencionamos anteriormente: aunque fue principalmente un problema de SQLi, se observó que la falta de autenticación en el endpoint vulnerable permitió a los atacantes explotarlo directamente. También vemos regularmente errores IDOR en aplicaciones web donde un usuario puede ver o modificar los datos de otro: por ejemplo, una vulnerabilidad de 2021 en la API de una popular plataforma de redes sociales permitió a los atacantes enumerar IDs de perfiles de usuario para obtener información de perfil privada que debería haber estado restringida. En resumen, los controles de acceso rotos a menudo conducen a una escalada de privilegios vertical (el usuario se convierte en administrador) o una escalada horizontal (el usuario A puede actuar como el usuario B).
Impacto: Cuando el control de acceso falla, las consecuencias van desde fugas de datos hasta la toma completa del sistema. Un atacante podría leer datos sensibles de otros usuarios (violando la confidencialidad) o modificar datos que no debería (violando la integridad). En casos graves, el control de acceso roto puede permitir que una parte externa obtenga privilegios de administrador, lo que significa el fin para la aplicación. Por ejemplo, un IDOR en un sitio de comercio electrónico podría permitir a alguien ver los pedidos o la información personal de otros clientes; una verificación de administrador faltante podría permitir que un usuario normal acceda a un /admin/deleteUser endpoint y borre datos. Estos fallos conducen directamente a violaciones de confidencialidad y a menudo son muy fáciles de explotar para los atacantes una vez descubiertos (no se necesitan payloads sofisticados, solo una URL o un parámetro cambiado).
Prevención: El mantra aquí es “denegar por defecto.” Cada solicitud que acceda a una operación sensible o a un registro de datos debe estar sujeta a controles de acceso del lado del servidor. Utilice frameworks o middleware que centralicen la aplicación de roles/permisos. Por ejemplo, si tiene roles de usuario, asegúrese de que cada función de administrador verifique el rol del usuario en el servidor (nunca confíe únicamente en las comprobaciones del lado del cliente, como ocultar botones de administrador en la interfaz de usuario). Para el acceso a nivel de objeto (como ver o editar un recurso por ID), implemente verificaciones de propiedad, por ejemplo, confirme que el orderId solicitado pertenece al usuario autenticado que realiza la solicitud. Las pruebas automatizadas pueden ayudar a verificar que el acceso no autorizado se bloquea correctamente.
Aikido le ayuda a detectar el control de acceso roto de varias maneras. Primero, el pentesting autónomo (Aikido Attack) de Aikido puede sondear dinámicamente su aplicación en ejecución en busca de estos fallos; por ejemplo, puede simular un atacante con una cuenta de usuario normal intentando acceder a APIs de administrador o a datos de otros usuarios, e informará de cualquier bypass de privilegios exitoso. En el lado del código, el análisis estático de Aikido puede identificar rutas o controladores con comprobaciones de autenticación faltantes (especialmente en frameworks donde las rutas deben estar anotadas con roles). Si su base de código utiliza infraestructura como código o configuración para políticas de acceso (por ejemplo, reglas de gateway de API o IAM en la nube), los escáneres de Aikido también pueden evaluarlas. Al usar Aikido para probar continuamente la lógica de autorización, detectará esos errores de "ups, olvidé aplicar el inicio de sesión en ese endpoint" antes de que lo hagan los atacantes. Recuerde siempre: excepto para recursos verdaderamente públicos, todo debería requerir una autorización adecuada; Aikido puede ayudar a verificar que usted se adhiere a ese principio.
5. Configuraciones de seguridad incorrectas
Qué es: Incluso una aplicación perfectamente codificada puede ser comprometida por una configuración insegura. La configuración de seguridad incorrecta es una categoría amplia que cubre cualquier ajuste o configuración insegura en la infraestructura o pila de aplicaciones. Esto incluye cosas como: dejar credenciales predeterminadas activas en los servidores (por ejemplo, admin/admin), usar archivos de configuración o secretos predeterminados, dejar endpoints sensibles (como paneles de administración de bases de datos o dashboards en la nube) públicamente accesibles, no deshabilitar la lista de directorios en un servidor web, tener encabezados HTTP mal configurados (por ejemplo, encabezados de seguridad faltantes) u olvidar establecer permisos adecuados en el almacenamiento en la nube. Las configuraciones incorrectas a menudo surgen de ajustes de desarrollo/prueba que no se han endurecido para producción, o simplemente por error humano en la implementación. En entornos de nube, una configuración incorrecta clásica es dejar un bucket S3 o un almacenamiento de blobs de Azure públicamente legible cuando contiene datos privados. Esencialmente, es cuando su sistema está diciendo "¡Bienvenidos atacantes, la puerta está abierta!" debido a un descuido en la configuración.
Ejemplo: Desafortunadamente, las configuraciones incorrectas causan muchas brechas reales. Un caso llamativo de 2024: 1.3 millones de registros de pacientes quedaron expuestos en un servidor público durante dos semanas debido a una simple configuración incorrecta del servidor. No se necesitó ningún exploit; los datos fueron esencialmente publicados al mundo debido a un descuido. Otro ejemplo: un incidente en Prudential Financial (2024) donde una única configuración incorrecta en un sistema de control de acceso permitió a los atacantes acceder discretamente a 2.5 millones de registros de clientes. Y quién puede olvidar la brecha de Capital One (2019) —si bien implicó SSRF como mecanismo de ataque, la causa raíz fue un firewall de aplicaciones web mal configurado en su entorno AWS, lo que permitió al atacante alcanzar recursos internos. En el caso de Capital One, un bucket de almacenamiento AWS S3 con datos sensibles fue accesible una vez que se explotó la configuración incorrecta del WAF, lo que llevó al robo de más de 100 millones de registros de clientes. Estos ejemplos subrayan que a menudo los "pequeños" errores de configuración (como un puerto abierto, una credencial olvidada o un control de seguridad deshabilitado) pueden tener consecuencias enormes.
Impacto: El impacto varía según lo que se haya configurado incorrectamente. En el extremo inferior, una configuración incorrecta podría "solo" filtrar información no crítica (por ejemplo, una página de error detallada que revele versiones de software, útil para los atacantes pero no una brecha por sí misma). En el extremo superior, una configuración incorrecta puede llevar directamente a un compromiso total: una interfaz de administración abierta podría permitir a los atacantes iniciar sesión (especialmente si las credenciales predeterminadas no se cambiaron), un bucket de almacenamiento en la nube abierto puede exponer millones de registros, o una configuración de seguridad deshabilitada podría permitir exploits triviales. Las configuraciones incorrectas se encuentran entre las principales causas de las brechas de datos en los servicios en la nube. También son fácilmente escaneadas por los atacantes: hay motores de búsqueda y bots buscando continuamente cosas como dashboards abiertos de Elasticsearch/Kibana, puertos de bases de datos expuestos o buckets públicos. En resumen, las configuraciones incorrectas pueden convertir su aplicación segura en un “campo de juego para hackers” si no tiene cuidado.
Prevención: La diligencia y la automatización son clave. Cambie siempre las contraseñas y claves predeterminadas (nada debería ejecutarse con "admin/admin" o valores predeterminados similares). Endurezca las configuraciones de su servidor y framework: por ejemplo, desactive los modos de depuración y las aplicaciones de ejemplo en producción, asegúrese de que la navegación por directorios esté desactivada y aplique los encabezados de seguridad recomendados (Content Security Policy, X-Frame-Options, etc.). Utilice el principio de mínimo privilegio para los recursos en la nube: si un servicio o bucket no necesita acceso público, restrínjalo (y para aquellos que necesitan ser públicos, asegúrese de que solo expongan lo que se pretende). Revise regularmente su infraestructura como código o la configuración de su entorno frente a los puntos de referencia de seguridad.
El escaneo IaC y la auditoría de configuración de Aikido Security pueden ser un salvavidas aquí. Si utilizas Terraform, CloudFormation, Kubernetes YAML o similar, Aikido Security puede escanearlos en busca de configuraciones inseguras (como grupos de seguridad abiertos, buckets S3 públicos o configuraciones de cifrado faltantes). También puede verificar tu entorno de nube en ejecución en busca de configuraciones erróneas. Para servidores web y aplicaciones, los escáneres de Aikido Security marcarán la falta de encabezados de seguridad o mensajes de error excesivamente detallados. Además, las características de protección en tiempo de ejecución de Aikido Security pueden monitorear el uso anormal que podría indicar que alguien está explotando una mala configuración. La conclusión es hacer que las verificaciones de configuración sean parte de tu pipeline; Aikido Security puede automatizar eso, detectando los errores de "ups, dejé ese bucket público" antes del despliegue. Y siempre mantente atento a los nuevos parches y actualizaciones; a veces, las configuraciones erróneas provienen de ejecutar software obsoleto con debilidades predeterminadas conocidas.
6. Exposición de Datos Sensibles y Fuga de Secretos
Qué es: Esta categoría cubre las fallas en la protección adecuada de la información sensible, tanto los datos de usuario como las claves secretas. La "exposición de datos sensibles" (también llamada fallas criptográficas) significa que una aplicación no asegura adecuadamente los datos en tránsito o en reposo. Los ejemplos incluyen no usar HTTPS para comunicaciones sensibles, usar cifrado débil o nulo para datos almacenados (como hashes sin sal para contraseñas, o datos personales en texto plano en una copia de seguridad de la base de datos), o exponer datos accidentalmente a través de la depuración o los registros. Estrechamente relacionada está la fuga de secretos, que ocurre cuando los desarrolladores exponen inadvertidamente si no tienen cuidado.
Prevención: La diligencia y la automatización son clave. Cambia siempre las contraseñas y claves predeterminadas (nada debe ejecutarse con "admin/admin" o valores predeterminados similares). Refuerza las configuraciones de tu servidor y framework: por ejemplo, desactiva los modos de depuración y las aplicaciones de ejemplo en producción, asegúrate de que la navegación de directorios esté desactivada y aplica los encabezados de seguridad recomendados (Content Security Policy, X-Frame-Options, etc.). Utiliza el principio de mínimo privilegio para los recursos en la nube; si un servicio o bucket no necesita acceso público, restríngelo (y para aquellos que sí necesitan ser públicos, asegúrate de que solo expongan lo previsto). Revisa regularmente tu infraestructura como código o la configuración del entorno según los puntos de referencia de seguridad.
El escaneo IaC y la auditoría de configuración de Aikido Security pueden ser un salvavidas aquí. Si utilizas Terraform, CloudFormation, Kubernetes YAML o similar, Aikido Security puede escanearlos en busca de configuraciones inseguras (como grupos de seguridad abiertos, buckets S3 públicos o configuraciones de cifrado faltantes). También puede verificar tu entorno de nube en ejecución en busca de configuraciones erróneas. Para servidores web y aplicaciones, los escáneres de Aikido Security marcarán la falta de encabezados de seguridad o mensajes de error excesivamente detallados. Además, las características de protección en tiempo de ejecución de Aikido Security pueden monitorear el uso anormal que podría indicar que alguien está explotando una mala configuración. La conclusión es hacer que las verificaciones de configuración sean parte de tu pipeline; Aikido Security puede automatizar eso, detectando los errores de "ups, dejé ese bucket público" antes del despliegue. Y siempre mantente atento a los nuevos parches y actualizaciones; a veces, las configuraciones erróneas provienen de ejecutar software obsoleto con debilidades predeterminadas conocidas.
6. Exposición de Datos Sensibles y Fuga de Secretos
Qué es: Esta categoría cubre las fallas en la protección adecuada de la información sensible, tanto los datos de usuario como las claves secretas. La "exposición de datos sensibles" (también llamada fallas criptográficas) significa que una aplicación no asegura adecuadamente los datos en tránsito o en reposo. Los ejemplos incluyen no usar HTTPS para comunicaciones sensibles, usar cifrado débil o nulo para datos almacenados (como hashes sin sal para contraseñas, o datos personales en texto plano en una copia de seguridad de la base de datos), o exponer datos accidentalmente a través de la depuración o los registros. Estrechamente relacionada está la fuga de secretos, que ocurre cuando los desarrolladores exponen inadvertidamente secretos como claves API, contraseñas de bases de datos, credenciales o tokens, ya sea codificándolos directamente en el código, dejándolos en archivos de configuración subidos a repositorios, o almacenándolos en código del lado del cliente. Una cantidad asombrosa de secretos son filtrados por los desarrolladores cada año (a menudo en GitHub público). En resumen, si tu aplicación no cifra correctamente lo que debería estar cifrado, o si eres descuidado con la información confidencial y las claves, estás invitando a los atacantes a obtener esos datos sin mucho esfuerzo.
Ejemplo: Un aspecto de este problema son los datos no cifrados. Un ejemplo sencillo pero ilustrativo: hace muchos años, los sitios web a veces aceptaban credenciales de inicio de sesión a través de HTTP sin cifrar; esos días han quedado atrás en gran medida, pero incluso ahora ocurren errores. En 2023, se descubrió que una importante integración de API transmitía datos de salud personales sin el cifrado adecuado (debido a una cadena de certificados TLS mal configurada), exponiendo información privada en la red. Otro ejemplo: si un archivo de copia de seguridad de una base de datos se almacena en un bucket de la nube no seguro (lo que se relaciona con una mala configuración), todos los datos personales que contiene podrían quedar expuestos; esto le sucedió a una aerolínea en 2022, filtrando cientos de miles de registros de clientes porque la copia de seguridad no estaba cifrada ni controlada por acceso.
En cuanto a los secretos, el problema es endémico. Solo en 2024, los investigadores detectaron casi 23.8 millones de nuevos secretos codificados en commits públicos de GitHub, un aumento del 25% respecto al año anterior. Esta "proliferación de secretos" ha provocado brechas reales. Por ejemplo, en 2023 un atacante filtró todo el código fuente del New York Times de un repositorio privado, supuestamente explotando credenciales filtradas. En otro caso, una empresa de inteligencia de negocios (Sisense) sufrió la filtración de una credencial interna en un foro público, que los atacantes utilizaron para acceder a datos sensibles de clientes. Más cerca de los desarrolladores: ¿con qué frecuencia hemos oído hablar de una clave secreta de AWS subida accidentalmente a GitHub, solo para que cripto-mineros o algo peor la usen en cuestión de minutos? Estos ejemplos demuestran que no proteger los datos con cifrado y no mantener los secretos secretos puede llevar directamente a filtraciones de datos y acceso no autorizado.
Impacto: Si se exponen datos sensibles de usuario (información personal, datos financieros, historiales médicos, etc.), el impacto suele ser sentido tanto por los usuarios (violaciones de la privacidad, riesgo de robo de identidad) como por la empresa (sanciones regulatorias, daño reputacional). Por ejemplo, los historiales médicos expuestos pueden dar lugar a multas y demandas por HIPAA. Las contraseñas o números de tarjeta de crédito expuestos obviamente conducen al fraude. Mientras tanto, los secretos filtrados (como claves API o tokens) pueden ser el billete dorado de un atacante: por ejemplo, una contraseña de base de datos filtrada podría permitir a un atacante conectarse y volcar toda tu base de datos; una clave API de la nube filtrada podría permitirles activar servidores (a tu cargo) o acceder a datos sensibles en la nube. Una credencial de administrador filtrada a veces puede comprometer una aplicación completa o incluso una flota de sistemas. No es de extrañar que el IBM Cost of a Data Breach Report encuentre consistentemente que las brechas que implican credenciales comprometidas y datos sensibles se encuentran entre las más costosas (tanto en términos económicos como de pérdida de confianza).
Prevención: Aquí hay dos aspectos: proteger los datos sensibles y gestionar los secretos adecuadamente. Para los datos sensibles de usuario/empresa, usa siempre HTTPS (forzar TLS para todo el tráfico y usar protocolos/configuraciones modernos). Nunca transmitas información sensible como contraseñas o tokens en texto plano, ni siquiera en comunicaciones internas. En reposo, cifra los campos de datos críticos (muchas bases de datos y servicios de almacenamiento en la nube ofrecen cifrado en reposo; úsalo y considera el cifrado a nivel de aplicación para campos extremadamente sensibles). Evita la exposición excesiva de datos: no almacenes datos innecesariamente que no necesites, y purga los datos sensibles cuando ya no sean necesarios. En cuanto a la gestión de secretos: nunca codifiques secretos directamente en el código o en la configuración que va al control de código fuente. Usa variables de entorno, servicios de gestión de secretos (como HashiCorp Vault o almacenes de secretos en la nube), o al menos almacena los secretos en archivos de configuración seguros que no estén en el repositorio. Si debes confirmar alguna configuración, usa herramientas para buscar secretos antes de hacer push. Rota las claves regularmente para que, si algo se filtra, solo sea válido por un corto período.
La plataforma de seguridad de Aikido cuenta con potentes funciones para ayudar en ambos frentes. Su capacidad de detección de secretos escaneará tu código y configuración en busca de claves API, contraseñas, certificados privados y otras credenciales. Por ejemplo, si alguien deja accidentalmente una clave de AWS o una cadena de conexión de base de datos en un archivo confirmado, Aikido lo marcará inmediatamente, lo que podría evitar una toma de control de tu cuenta de AWS. Aikido puede incluso monitorizar tus repositorios continuamente para detectar filtraciones de secretos en tiempo real. En cuanto a la protección de datos, el escaneo de Aikido puede identificar el uso de criptografía débil (como el uso de funciones hash o algoritmos de cifrado obsoletos). También puede verificar ciertas comprobaciones de cumplimiento (por ejemplo, asegurando que tienes TLS habilitado en todos los endpoints mediante el escaneo de infraestructura como código o definiciones de API). Al integrar Aikido, obtienes un vigilante automatizado que grita «¡Oye, eso es una clave API, quítala!» antes de que llegue a producción. Y si tu organización tiene muchos repositorios privados o equipos de desarrolladores, este tipo de escaneo automatizado de secretos es esencial, como lo demuestra el número cada vez mayor de secretos encontrados en el código cada año.
7. Uso de componentes con vulnerabilidades conocidas (riesgos de la cadena de suministro)
Qué es: Las aplicaciones web modernas se construyen sobre innumerables componentes de terceros: frameworks, librerías, paquetes, imágenes de contenedores y servicios. El uso de componentes con vulnerabilidades conocidas significa que tu aplicación incluye una dependencia (o se ejecuta en un servidor) que tiene una falla de seguridad públicamente conocida, y no la has parcheado o actualizado. Este es esencialmente el problema de la «cadena de suministro»: una vulnerabilidad en una librería que utilizas puede comprometer tu aplicación incluso si tu propio código es perfecto. Abundan los ejemplos: una versión vulnerable de un framework web, una librería OpenSSL desactualizada, una herramienta de depuración con fugas, etc. Los atacantes escanean activamente las aplicaciones que utilizan versiones específicas vulnerables de software para explotarlas. El Top 10 OWASP ha enfatizado este riesgo (anteriormente «Uso de componentes con vulnerabilidades conocidas», ahora integrado en una categoría más amplia en 2021), y la industria ha aprendido duras lecciones de incidentes como Log4Shell, donde una única falla en una librería tuvo un efecto dominó a nivel global.
Ejemplo: El caso paradigmático es, de hecho, Log4Shell (CVE-2021-44228). Esta fue una vulnerabilidad RCE crítica en la popular librería de registro Log4j (ampliamente utilizada en aplicaciones Java). Cuando se reveló en diciembre de 2021, hizo saltar las alarmas en todas partes porque miles de aplicaciones eran indirectamente vulnerables, si incluían una cierta versión de Log4j. Los atacantes comenzaron rápidamente a explotarla en la práctica, lo que llevó a incidentes en muchas empresas. Como decía un informe, “la vulnerabilidad de Log4j demostró cómo un único componente ampliamente utilizado puede crear una exposición a nivel de toda la organización”. Otro ejemplo: Apache Struts 2 tenía una falla RCE conocida (CVE-2017-5638) que llevó famosamente a la brecha de Equifax en 2017; Equifax no había actualizado el framework, y los atacantes lo explotaron para robar datos de 147 millones de personas. Más recientemente, en 2022-2023 vimos Spring4Shell (CVE-2022-22965), una vulnerabilidad del Spring Framework que hizo eco de Log4Shell (aunque menos grave), y varias vulnerabilidades de paquetes npm/PyPI que permitieron a los atacantes ejecutar código o robar datos si utilizabas esos paquetes. Ni siquiera las librerías de front-end están exentas: por ejemplo, una vulnerabilidad en la librería DOMPurify en 2021 podría socavar la protección XSS si no se actualizaba. Todo esto ilustra que las CVEs conocidas en tu pila son bombas de relojería.
Impacto: El impacto depende completamente de la vulnerabilidad específica del componente, pero puede ser tan grave como sea posible: ejecución remota de código, fuga de datos, bypass de autenticación, lo que sea. El problema es que estas vulnerabilidades son de conocimiento público, y a menudo el código de explotación está fácilmente disponible, por lo que los atacantes pueden automatizar escaneos para encontrar cualquier servidor que no haya sido parcheado. Un solo componente sin parchear puede llevar a un compromiso masivo si es propagable (como lo hicieron las vulnerabilidades ProxyShell/ProxyLogon de MS Exchange en 2021, no exactamente una «aplicación web» pero un concepto similar de vulnerabilidades conocidas explotadas en masa). Para tu aplicación, usar un componente vulnerable podría significar que un atacante no necesita encontrar un error en tu código, simplemente explota la librería. El resultado puede ser el mismo que en otras categorías: brecha de datos, toma de control del servidor, etc., pero es particularmente frustrante porque una solución podría haber estado disponible y simplemente no se aplicó.
Prevención: Esto se reduce a la gestión de dependencias y la disciplina de parcheo. Mantén un inventario de todos los componentes (incluidas sus versiones) utilizados en tu aplicación; esto a menudo se denomina lista de materiales de software (SBOM). Suscríbete a fuentes de vulnerabilidades o utiliza herramientas automatizadas para que te alerten cuando una librería que utilizas tenga una CVE conocida. Muchos gestores de paquetes tienen comandos de auditoría (por ejemplo, npm audit, pip-audit) paquetes maliciosos en el ecosistema de código abierto; ocasionalmente los atacantes publican una librería comprometida (o secuestran una cuenta de mantenedor) para que la próxima vez que npm install, podrías estar obteniendo una actualización con puerta trasera. Usar fuentes fiables y bloquear las versiones de las dependencias (y verificar la integridad mediante sumas de comprobación/firmas) puede ayudar a mitigar eso.
Aikido facilita enormemente la gestión de este riesgo a través de sus funciones de análisis de composición de software (SCA) y análisis de dependencias. El escáner Dependencies (SCA) de Aikido detectará automáticamente las librerías de código abierto y las versiones que utiliza tu código, las cruzará con bases de datos de vulnerabilidades y te alertará sobre cualquier CVE conocida. Por ejemplo, si tu proyecto está utilizando, digamos, Log4j 2.14.0 (que es vulnerable a Log4Shell), Aikido lo marcaría con detalles sobre la CVE e incluso sugeriría la versión corregida a la que deberías actualizar. Puede hacer esto directamente en tu IDE o pipeline de CI. Aún mejor, Aikido proporciona sugerencias de corrección automática con IA; en muchos casos, puede abrir automáticamente una solicitud de extracción para actualizar una dependencia a una versión más segura, o aplicar un parche necesario. La plataforma también puede escanear imágenes de contenedores en busca de componentes obsoletos (asegurando que tus imágenes base y paquetes del sistema operativo estén actualizados). Al integrar Aikido, esencialmente subcontratas la tediosa tarea de rastrear CVEs a un sistema automatizado que nunca duerme. Esto significa una remediación más rápida, algo crítico cuando los exploits suelen estar en circulación días u horas después de que se anuncie una vulnerabilidad. En resumen: mantén todo actualizado y utiliza herramientas como Aikido SCA para adelantarte a los atacantes en el frente de los componentes.
8. Falsificación de Solicitudes entre Sitios (CSRF)
Qué es: CSRF (Cross-Site Request Forgery) es un ataque en el que un sitio web malicioso engaña al navegador de un usuario para que realice peticiones no intencionadas a su aplicación web. Explota el hecho de que los navegadores incluyen automáticamente credenciales (como las cookies de sesión) con las peticiones. Si un usuario ha iniciado sesión en su sitio y luego visita un sitio malicioso, este sitio malicioso podría, por ejemplo, cargar una imagen o un formulario oculto que envíe una petición a su sitio (el objetivo), y el navegador incluirá la cookie de sesión del usuario. Sin una defensa adecuada, su servidor pensará que el usuario realizó esa petición legítimamente y la ejecutará. En esencia, CSRF 'secuestra' la sesión autenticada de un usuario para realizar una acción que este no pretendía. Ejemplo clásico: un usuario ha iniciado sesión en su banco. Visita una página del atacante que contiene código oculto que emite una petición de transferencia de fondos al sitio del banco; el banco ve una cookie de sesión válida y procesa la transferencia. CSRF no roba datos directamente; engaña al navegador de la víctima para que sea cómplice del atacante. Muchos frameworks modernos tienen protecciones CSRF integradas (normalmente mediante tokens), y los navegadores modernos añadieron atributos de cookie SameSite para mitigar CSRF, pero está lejos de erradicarse. En 2025, CSRF 'no está muerto, solo es diferente', especialmente con las aplicaciones de una sola página (SPA) y las API que utilizan cookies para la autenticación, donde los desarrolladores podrían olvidar implementar las protecciones habituales.
Ejemplo: Un caso real: Reddit (2023) tuvo una vulnerabilidad CSRF en una página de configuración que permitía a los atacantes cambiar silenciosamente las preferencias de un usuario e incluso vincular la cuenta de la víctima a una cuenta de spam. Aunque cambiar las preferencias de notificación no es tan grave como las transferencias de dinero, demuestra que CSRF estaba presente en la funcionalidad de un sitio importante. Otro ejemplo destacado involucra aplicaciones de monederos de criptomonedas: los atacantes han utilizado CSRF para cambiar las direcciones de pago predeterminadas o iniciar pequeñas transacciones explotando la interfaz web del monedero, agotando fondos sin que el usuario se diera cuenta. Históricamente, también ha habido ataques CSRF más devastadores: Gmail sufrió un CSRF en 2007 que permitía a los atacantes cambiar las direcciones de reenvío de correo electrónico de los usuarios (espiando correos), y estuvo el famoso Samy Worm en MySpace en 2005, que en realidad era un CSRF auto-propagante (combinado con XSS) que hizo que el perfil de Samy Kamkar acumulara un millón de 'amigos'. Estos ejemplos van desde travesuras hasta brechas significativas, pero todos subrayan la idea: si no tiene protecciones CSRF, un atacante puede hacer que sus usuarios realicen acciones que no pretendían.
Impacto: La gravedad de CSRF depende de las acciones que sean vulnerables. Si solo son posibles algunos cambios menores de preferencias (como en el ejemplo de Reddit), el impacto es limitado (molesto pero no catastrófico). Pero si acciones críticas como transferencias de dinero, cambios de contraseña o eliminaciones de cuentas son vulnerables, entonces CSRF es un problema importante. Considere un CSRF que cambie la contraseña de un usuario con sesión iniciada por una conocida por el atacante; eso es una toma de control total de la cuenta. O un CSRF en una aplicación bancaria basada en web que emite un pago; eso es un robo financiero directo. En un contexto corporativo, un CSRF que desencadena algún cambio de estado (como modificar una configuración de control de acceso o inyectar datos maliciosos) podría ser un paso hacia un compromiso más profundo. La naturaleza silenciosa de CSRF —sin malware en la máquina del usuario, sin señal externa inmediata— significa que tales ataques pueden pasar desapercibidos hasta que es demasiado tarde.
Prevención: La buena noticia es que CSRF es bien conocido y existen defensas estándar:
- Tokens CSRF: Implemente tokens anti-CSRF para peticiones que cambian el estado. El servidor genera un token aleatorio, lo establece en la sesión del usuario (o como una cookie) y también lo inyecta en formularios o APIs (como un campo oculto o una cabecera). Cuando llega una petición, el servidor espera el token y lo verifica. Una petición falsificada por un atacante no tendrá el token correcto, por lo que será rechazada.
- Atributo de cookie SameSite: Configure sus cookies de sesión con
SameSite=LaxoStrict. Esto ayuda a evitar que el navegador incluya cookies en peticiones entre sitios (aunqueLaxtodavía permite algunas peticiones GET, que idealmente no deberían tener efectos secundarios). Muchos frameworks ahora configuran las cookies de sesión por defecto aSameSite=Lax. Solo ten cuidado si tu aplicación necesita legítimamente solicitudes entre sitios (por ejemplo, integraciones de terceros) – podrías necesitar excepciones, pero aíslalas en ese caso. - Asegúrate de que las acciones que cambian el estado utilicen los verbos HTTP adecuados (por ejemplo, usa POST/PUT/DELETE, no GET, para las acciones). Los navegadores no enviarán credenciales en POST entre sitios si SameSite es Lax o Strict, y es más difícil para un atacante realizar un POST oculto que un GET.
- Verifica los encabezados Origin/Referer: Como capa adicional, verificar que las solicitudes provengan de tu dominio esperado puede detectar intentos entre sitios en algunos casos (aunque no es infalible).
- Seguridad del framework: Utiliza el middleware de protección CSRF integrado de tu framework; casi todos los frameworks modernos tienen uno.
- No lo desactives durante el desarrollo (los desarrolladores a veces desactivan las comprobaciones CSRF para probar las API y luego olvidan volver a activarlas).
Aikido puede ayudar a garantizar que tu aplicación no sea vulnerable a CSRF sin que lo sepas. Por un lado, El escaneo dinámico (DAST) de Aikido puede simular CSRF intentando realizar acciones que cambian el estado desde un contexto externo y viendo si tiene éxito. Informará de cualquier acción que carezca de la protección CSRF adecuada. Por el lado del código, el análisis estático de Aikido (con su comprensión de los frameworks) puede identificar rutas que modifican datos pero no tienen verificación de token CSRF. (De hecho, herramientas como Ghost Security – una herramienta AppSec similar – anuncian específicamente la búsqueda de «endpoints que mutan el estado pero carecen de tokens CSRF», y Aikido ofrece capacidades comparables). Aikido también puede detectar configuraciones erróneas de SameSite atributos inspeccionando los encabezados Set-Cookie en tus respuestas o configuraciones de seguridad. Al usar Aikido para probar tus formularios y endpoints de API, se te alertará si alguna ruta crítica carece de defensas CSRF, para que puedas solucionarlo (normalmente añadiendo el token o las comprobaciones de encabezado apropiados). Con estas medidas, puedes desactivar eficazmente CSRF, asegurándote de que tu aplicación solo atiende las solicitudes que realmente provienen de tu sitio y de tus usuarios.
9. Falsificación de Solicitudes del Lado del Servidor (SSRF)
Qué es: SSRF es una adición más reciente al Top 10 OWASP (se convirtió en un elemento del Top 10 en la edición de 2021) y con razón. Falsificación de Solicitudes del Lado del Servidor ocurre cuando una aplicación toma una URL o una ubicación de recurso de una fuente no confiable (como la entrada del usuario) y el código del lado del servidor recupera esa URL sin la validación adecuada. Esencialmente, un atacante engaña a tu servidor para que envíe una solicitud en su nombre. Esto puede ser explotado para que el servidor realice solicitudes a recursos internos a los que el atacante no puede acceder directamente, o a direcciones externas con las credenciales del servidor. Un escenario clásico es una aplicación web con una función como «obtener el contenido de esta URL» (para previsualizar o importar datos) – un atacante proporciona una URL como http://localhost/admin o una URL de metadatos de AWS (http://169.254.169.254) para recuperar información interna sensible a través de tu servidor. SSRF también puede permitir el escaneo de puertos de tu red interna a través de tu servidor, o incluso la explotación de servicios internos. En entornos de nube, SSRF es particularmente peligroso porque las instancias de nube a menudo tienen acceso a endpoints de metadatos que proporcionan credenciales. La brecha de Capital One de 2019 fue un excelente ejemplo de SSRF utilizado en la práctica (combinado con una mala configuración).
Ejemplo: La brecha de Capital One: Una exingeniera de AWS explotó una vulnerabilidad SSRF en un WAF (firewall de aplicaciones web) mal configurado que Capital One estaba utilizando. Al elaborar solicitudes desde una aplicación web accesible externamente, pudo consultar el servicio de metadatos de AWS del servidor, que devolvió tokens de acceso de AWS. Utilizando esos tokens, accedió a datos sensibles (cubos S3 con información de clientes), lo que resultó en el robo de más de 100 millones de registros. En resumen, SSRF fue el punto de entrada inicial que eludió las barreras de red externas al aprovechar los propios privilegios del servidor. Otro ejemplo: En 2022, investigadores de seguridad descubrieron que un SSRF en una popular herramienta DevOps les permitía alcanzar endpoints de API internos que de otro modo no estaban expuestos, lo que potencialmente permitía acciones de administración. También hemos visto fallos de SSRF en funcionalidades de procesamiento de imágenes o generación de PDF (donde el servidor recupera una URL de la entrada) que los atacantes convirtieron en escáneres de puertos o utilizaron para acceder a consolas de administración de bases de datos internas. Otro caso más: algunos servicios en la nube tenían SSRF en sus webhooks que permitían a los atacantes activar solicitudes a endpoints HTTP internos, obteniendo acceso a elementos como Redis o paneles internos.
Impacto: A primera vista, SSRF se trata de realizar solicitudes, lo que podría parecer limitado. Pero puede tener un impacto crítico:
- Acceso a la red interna: Si tu servidor puede acceder a hosts internos (por ejemplo, en la misma VPC o centro de datos), un SSRF puede potencialmente comunicarse con servicios internos que no están expuestos públicamente. Esto podría llevar a la lectura de datos sensibles (como contactar con una API HTTP interna que devuelve información de clientes) o incluso a la emisión de comandos privilegiados si una interfaz de administración interna carece de autenticación (ya que asumía que solo las llamadas internas la alcanzarían).
- Fuga de metadatos en la nube: En proveedores de la nube (AWS, GCP, Azure), SSRF se utiliza a menudo para obtener credenciales del servicio de metadatos de la instancia. Estas credenciales podrían permitir un mayor compromiso de los recursos de la nube (como en Capital One).
- Elusión de restricciones basadas en IP: Si restringes alguna funcionalidad, por ejemplo, a solicitudes de «localhost» o de ciertas IP, un SSRF podría eludirlo realizando la solicitud desde el propio servidor local.
- Potencial de gusano: En algunos casos, SSRF puede ser un punto de pivote para explotaciones adicionales – por ejemplo, un SSRF a un servicio interno que tiene una RCE conocida podría resultar en la ejecución remota de código real en la red interna.
Dada la nota de OWASP, los problemas de SSRF están realmente en aumento en las aplicaciones modernas debido a las complejidades de los microservicios y la nube, y pueden ser bastante graves.
Prevención: Prevenir SSRF significa principalmente validar y sanear cualquier URL proporcionada por el usuario o solicitud de recurso remoto. Si tu aplicación necesita obtener una URL proporcionada por un usuario (o una dirección), implementa una lista blanca estricta: por ejemplo, solo permite URLs de un conjunto de dominios en los que confías (y hazlo cumplir mediante búsquedas DNS, etc., para evitar engaños). Nunca permitas que la entrada de usuario sin procesar controle directamente el destino de las recuperaciones del lado del servidor. También puedes implementar protecciones a nivel de red: por ejemplo, deshabilitar la capacidad de tu servidor para acceder a direcciones internas si no lo necesita. Algunos proveedores de la nube te permiten desactivar o restringir el acceso al servicio de metadatos (AWS tiene IMDSv2 que mitiga las solicitudes GET simples). Además, el código debe verificar el esquema de la URL – deshabilitar file:// URIs u otros esquemas locales, y potencialmente deshabilitar literales IP o direcciones link-local. Utiliza bibliotecas o parches que realicen protección SSRF si están disponibles (por ejemplo, algunas bibliotecas cliente HTTP permiten restringir qué hosts pueden ser contactados). Esencialmente, trata las URLs proporcionadas externamente como entrada peligrosa – porque lo son.
Las herramientas de escaneo de Aikido pueden ayudar a identificar riesgos de SSRF en tu código. Por ejemplo, el análisis estático de Aikido puede detectar el uso de funciones o librerías que realizan solicitudes HTTP (como requests.get() requests en Python, HttpClient en Java, etc.) donde la URL se deriva de la entrada del usuario. Puede entonces marcarlo como un posible SSRF si no hay filtrado. Aikido también podría detectar si tu código intenta obtener recursos de URLs sin validación, y puede sugerir añadir comprobaciones de lista blanca (allowlist). En el lado dinámico, las herramientas DAST y de pentesting de Aikido pueden intentar payloads SSRF comunes (como proporcionar http://169.254.169.254 como entrada a cualquier funcionalidad de obtención de URL) para ver si pueden engañar al servidor para que responda con contenido interno. Si se encuentra un vector SSRF, Aikido lo informará junto con la evidencia. Con esta información, puedes implementar una validación adecuada o restringir el acceso a la red. Las funciones de escaneo en la nube de Aikido también pueden advertirte si tus instancias tienen configuraciones de red excesivamente permisivas (por ejemplo, si tu servidor web puede salir a internet o a la red interna cuando no debería). Al combinar el análisis de código y las pruebas, puedes detectar las debilidades de SSRF temprano, antes de que un atacante use tu aplicación como su proxy.
10. Deserialización Insegura
Qué es: La deserialización insegura es una vulnerabilidad más especializada, pero increíblemente peligrosa cuando existe. Surge cuando una aplicación deserializa datos de una fuente no confiable sin la validación adecuada —lo que significa que toma datos binarios o estructurados (como objetos, JSON/XML o blobs binarios) del cliente y reconstruye un objeto en memoria. Ciertos formatos de serialización (especialmente en lenguajes como Java, .NET, Python, PHP) pueden ser explotados para ejecutar código durante el proceso de deserialización. Los atacantes crean objetos serializados maliciosos (a menudo llamados «cadenas de gadgets») que, cuando el servidor los deserializa, desencadenan comandos o comportamientos elegidos por el atacante. Esto puede llevar a la ejecución remota de código o a la manipulación de la lógica en el servidor, sin siquiera necesitar una falla de inyección normal. Las vulnerabilidades de deserialización insegura son esencialmente bombas lógicas ocultas en los datos. Fueron destacadas en el Top 10 OWASP 2017 y siguen siendo relevantes, aunque el Top 10 2021 lo amplió a «Fallas de integridad de software y datos». Si una aplicación acepta cualquier tipo de objetos serializados (como objetos Java Serializable objetos, ViewState de .NET, o incluso ciertos JSON con información de tipo de clase) de los usuarios, podría estar en riesgo.
Ejemplo: Un ejemplo reciente que ha causado revuelo es CVE-2025-55182 en React Server Components (revelado en diciembre de 2025). Se trató de una RCE crítica que resultó ser causada por una deserialización insegura en el protocolo de React Server Components. Esencialmente, un atacante podría enviar un payload HTTP malformado que el lado del servidor de React deserializaría incorrectamente, permitiendo la ejecución de código arbitrario. Tenía un CVSS de 10 y afectó a un gran número de aplicaciones (dado que React está tan extendido). Esto demuestra que incluso los frameworks de vanguardia no son inmunes a los problemas de deserialización. Otro ejemplo clásico: el exploit de Java Commons Collections de 2016 —una deserialización insegura en muchas aplicaciones Java (a través de una librería) permitió a los atacantes enviar un objeto serializado que, al deserializarse, ejecutaría comandos en el servidor. Esto fue ampliamente explotado en productos como Jenkins, WebLogic, etc. En .NET, existió la vulnerabilidad de deserialización de ViewState (CVE-2017-8759) y otras donde datos no saneados en un view state llevaron a RCE. Las aplicaciones PHP han tenido problemas cuando unserialize() se llama a `unserialize` sobre la entrada del usuario. Incluso JavaScript (Node.js) tuvo uno notorio en el paquete serialize-javascript paquete. Así, desde sistemas empresariales hasta frameworks modernos, la deserialización insegura aparece, a menudo con resultados graves.
Impacto: La deserialización insegura es a menudo una ruta directa a la ejecución remota de código (RCE). Eso es tan grave como puede ser: el atacante puede ejecutar código arbitrario en tu servidor, potencialmente tomando el control total del mismo. Incluso si no es una RCE completa, las fallas de deserialización pueden usarse para manipular la lógica (por ejemplo, alterando estructuras de datos para obtener privilegios más altos sobre los datos de objetos). Pero típicamente, el impacto es crítico: si un atacante puede explotarla, a menudo puede dejar una webshell, crear un usuario de puerta trasera o profundizar en la red. El peligro se amplifica por el hecho de que los exploits de deserialización a menudo no requieren autenticación (si la aplicación está deserializando datos antes de la autenticación) y pueden realizarse con una sola solicitud. Es una forma sigilosa de entrada: sin consultas SQL sospechosas ni scripts entre sitios, solo un blob de datos aparentemente inofensivo que hace explotar tu aplicación desde dentro.
Prevención: La mejor manera de evitar la deserialización insegura es nunca deserializar datos no confiables. Si no necesitas absolutamente aceptar objetos serializados de los usuarios, no lo hagas. Utiliza formatos de datos más seguros (JSON, por ejemplo, sin metadatos de tipo de clase que puedan invocar constructores arbitrarios). Si necesitas serializar/deserializar, considera implementar comprobaciones de integridad: por ejemplo, firma los datos serializados o incluye un MAC, para que la manipulación sea detectable. Algunos frameworks permiten restringir qué clases pueden deserializarse (listas blancas de clases). Eso puede evitar que las cadenas de gadgets arbitrarias funcionen. Mantén las librerías actualizadas, porque muchas fallas de deserialización se corrigen al restringir el código que se ejecuta durante la construcción de objetos. OWASP también sugiere aislar el proceso de deserialización, quizás ejecutándolo en un entorno de bajo privilegio o en un sandbox, para que si se activa un exploit, tenga un impacto mínimo. En general, trata los datos serializados como potencialmente hostiles. Además, ten en cuenta la serialización oculta, como en las comunicaciones entre servicios o en las cachés.
La inteligencia de vulnerabilidades y el escaneo de Aikido pueden ayudar a detectar estos problemas. En el lado del análisis estático, Aikido puede marcar usos de funciones o patrones peligrosos, por ejemplo, el uso de ObjectInputStream.readObject() en Java, o de PHP unserialize() sobre datos de usuario, o bibliotecas de deserialización inseguras que se sabe que son explotables. Te advertirá: «Oye, estás deserializando algo aquí, ¿es seguro?». El análisis de dependencias de Aikido también entra en juego: puede alertarte si estás utilizando una versión de biblioteca que se sabe que tiene una vulnerabilidad de deserialización (por ejemplo, una versión obsoleta de una biblioteca de serialización común). Si surge una CVE importante como CVE-2025-55182 (la de React), los feeds de inteligencia de amenazas de Aikido (como Aikido Intel) destacarían cuáles de tus proyectos podrían verse afectados y necesitarían un parche. En cuanto a las pruebas, esta es más difícil para los escáneres dinámicos, pero Aikido Attack podría intentar cargas útiles de exploits conocidos si tu aplicación utiliza un framework común conocido por un error de deserialización. En última instancia, la mitigación a menudo requiere cambios en el código o actualizaciones de bibliotecas, y el papel de Aikido es alertarte rápidamente del riesgo. Al detectar la deserialización insegura durante el desarrollo o el escaneo, puedes refactorizar para usar formatos de datos seguros o actualizar a versiones parcheadas antes de desplegar una bomba de relojería.
Construyendo una postura de seguridad para aplicaciones web
Como hemos visto, las aplicaciones web actuales se enfrentan a una multitud de vulnerabilidades —desde fallos de inyección que pueden volcar tu base de datos, hasta fallos lógicos que permiten a los atacantes eludir tu autorización, pasando por fugas de secretos y riesgos de dependencias que provienen de las herramientas en las que confiamos—. Puede parecer abrumador, pero el hilo conductor es la conciencia y la defensa proactiva. Al comprender estas principales vulnerabilidades, ya estás un paso por delante en su mitigación.
Algunos puntos clave para una postura de seguridad robusta en aplicaciones web:
- Desplaza la seguridad a la izquierda: Detecta los problemas al principio del desarrollo. Integra herramientas SAST/SCA (como Aikido) en tu pipeline de CI y en tu IDE, para que las vulnerabilidades se detecten y se corrijan antes de que el código se fusione. Es mucho más fácil corregir una consulta SQL insegura o añadir una comprobación de autenticación durante la codificación que tener que actuar con urgencia después de una brecha.
- Defensas en capas: Utiliza múltiples capas de controles de seguridad. Por ejemplo, para prevenir la inyección y el XSS, combina prácticas de codificación seguras con bibliotecas de seguridad, y también ejecuta un firewall de aplicaciones web (WAF) para una protección adicional. Para la autenticación, aplica la MFA y utiliza la monitorización para detectar inicios de sesión sospechosos. La defensa en profundidad significa que, incluso si una capa falla, otras detectan el problema.
- Mantente actualizado: Mantén las dependencias y los servidores parcheados. Considera habilitar las actualizaciones automáticas para componentes críticos cuando sea factible. Aprovecha los feeds o plataformas de vulnerabilidades (Aikido, Dependabot, etc.) para saber cuándo tienes algo vulnerable en tu stack. Cuanto más rápido parches los problemas conocidos, menos probable será que te veas afectado por campañas de explotación masiva.
- Gestión de secretos y mínimo privilegio: Trata las credenciales como las joyas de la corona. Utiliza bóvedas o configuraciones de entorno para los secretos, rótalos regularmente y otorga a cada servicio el acceso mínimo que necesita. De esa manera, incluso si una clave se ve comprometida, se limita el radio de impacto.
- Seguridad por diseño: Incorpora el modelado de amenazas y los principios de diseño seguro desde el principio. Para las nuevas funcionalidades, considera cómo podrían ser explotadas e incorpora las comprobaciones necesarias (por ejemplo, asegúrate de que una nueva función de carga de archivos valide los tipos y tamaños de archivo para prevenir problemas de deserialización o DoS; asegúrate de que un nuevo endpoint de API compruebe los roles de usuario para prevenir fallos de control de acceso, etc.).
- Educa y automatiza: Mantén al equipo de desarrollo informado sobre los errores comunes (como los del Top 10 OWASP). Utiliza escáneres y pruebas automatizadas como red de seguridad, pero también fomenta una cultura en la que los desarrolladores piensen en el impacto de la seguridad. Un poco de conciencia ayuda mucho a evitar, por ejemplo, la tentación de deshabilitar los tokens CSRF «solo para probar» o de copiar y pegar código de StackOverflow sin considerar la seguridad.
Al centrarse en estas prácticas fundamentales, puedes reducir drásticamente el perfil de riesgo de tu aplicación. Muchos ataques tienen éxito no porque sean ultrasofisticados, sino porque se pasó por alto la higiene de seguridad básica. Cierra esas brechas y los atacantes pasarán a objetivos más fáciles.
Conclusión
Crear aplicaciones web que puedan resistir las amenazas actuales está absolutamente al alcance de los equipos de desarrollo —especialmente con las herramientas adecuadas en tu arsenal—. Hemos revisado las principales vulnerabilidades web que afectan a las aplicaciones y hemos visto cómo se corresponden con incidentes reales. El denominador común es que la conciencia y la detección temprana marcan la diferencia. Cuando sabes qué buscar —ya sea una entrada no saneada, una comprobación de acceso faltante o una biblioteca desactualizada— puedes abordarlo de forma proactiva en lugar de reactiva.
Como desarrollador o ingeniero DevSecOps, no tienes que abordar esto solo. Las soluciones modernas de AppSec como Aikido Security están diseñadas para integrarse sin problemas en tu flujo de trabajo y detectar estos problemas rápidamente. Imagina tener un experto en seguridad automatizado revisando cada commit: señalando ese escurridizo error XSS, detectando la clave de AWS antes de que salga de tu portátil, indicando que estás utilizando una versión de una biblioteca con una CVE crítica, e incluso sugiriendo o aplicando correcciones. Eso es lo que Aikido ofrece: un escaneo todo en uno para código, dependencias, configuración y más, creado para desarrolladores. Es como tener el Top 10 OWASP y la última base de datos de CVEs vigilando tus espaldas, sin ralentizarte.
Próximos pasos: No esperes a una auditoría o (peor aún) a una brecha para encontrar estas vulnerabilidades. Puedes empezar ejecutando un escaneo de seguridad en tu base de código para ver dónde te encuentras. Configura reglas de linting para la seguridad, añade la comprobación de dependencias y habilita la 2FA en todas partes. Si estás interesado en una plataforma pensada para desarrolladores que hace todo esto y más, considera probar Aikido: ofrece escaneo de código, SAST, detección de secretos, escaneos de IaC y contenedores, además de correcciones asistidas por IA en una interfaz unificada. De hecho, Aikido puede mapear automáticamente el estado de tu proyecto con la cobertura del Top 10 OWASP y ayudarte a cerrar las brechas.
Al final, el objetivo es integrar la seguridad en el tejido del desarrollo. Al centrarse en estas principales vulnerabilidades, escribir código seguro y utilizar herramientas para automatizar el trabajo pesado, reducirás significativamente el riesgo para tus aplicaciones web. Los datos de tus usuarios permanecen seguros, tu aplicación sigue funcionando y puedes dormir un poco más tranquilo por la noche (¡al igual que el 42% de los equipos que se mantenían despiertos preocupados por la seguridad de los contenedores y las aplicaciones, mencionado anteriormente!).
También le podría interesar:

