Introduction to Web Aplications
Last updated
Last updated
Importancia de las aplicaciones web: Todas las empresas tienen aplicaciones web (blogs, sitios estáticos o sistemas complejos). Representan una gran superficie de ataque, y cambios simples en el código pueden introducir vulnerabilidades críticas.
Vulnerabilidades comunes:
Inyección SQL: Permite acceder a datos sensibles, escribir/leer archivos en bases de datos o ejecutar código remoto.
Carga de archivos maliciosos: Formularios que aceptan código malicioso.
Inclusión de archivos: Aprovechada para ejecución remota de código.
Relación con Active Directory (AD):
Vulnerabilidades como inyección SQL en aplicaciones que usan AD pueden extraer direcciones de correo de usuarios.
Estas direcciones pueden utilizarse en ataques de "password spraying" contra portales autenticados con AD (VPN, O365).
Impacto de una vulnerabilidad: Una falla puede encadenarse para comprometer toda la infraestructura de una empresa.
Habilidades requeridas: Un pentester con dominio en aplicaciones web puede destacarse al identificar fallas ignoradas por otros.
Estructura del DOM:
<head>
: Contiene elementos como el título y metadatos (CSS, JS).
<body>
: Contiene los elementos principales visibles de la página.
<style>
y <script>
: Almacenan el CSS y JS respectivamente.
Definición del DOM:
Es una interfaz estándar definida por W3C para acceder y modificar dinámicamente el contenido, estructura y estilo de un documento.
Partes del DOM:
Core DOM: Modelo general para cualquier documento.
XML DOM: Modelo específico para XML.
HTML DOM: Modelo para HTML.
Utilidad práctica:
Identificar elementos en el DOM por id
, tag name
o class name
.
Inspeccionar código fuente de elementos específicos para localizar vulnerabilidades.
Manipular el DOM para explotar vulnerabilidades como XSS o insertar nuevos elementos.
Vulnerabilidades del front-end:
Ejecutadas en el lado del cliente, no afectan directamente el back-end.
Pueden poner en peligro al usuario final y, en casos graves, a administradores.
Importancia de probar componentes de front-end:
Aunque el foco suele estar en el back-end, las vulnerabilidades de front-end pueden permitir acceso a funcionalidades sensibles como paneles de administración.
Exposición de datos sensibles:
Datos sensibles pueden encontrarse en el código fuente HTML, visible para cualquier usuario.
El código fuente del front-end no debe confundirse con el back-end.
Cómo acceder al código fuente:
Utiliza el navegador (clic derecho > Ver código fuente).
Atajos como Ctrl + U o herramientas como Burp Suite son útiles incluso si se bloquea el clic derecho.
Información sensible en el código fuente:
Credenciales de inicio de sesión.
Hashes.
Enlaces, directorios, o información de usuarios expuestos.
Impacto potencial:
Aprovechar vulnerabilidades en la aplicación web.
Escalar el ataque hacia la infraestructura de soporte (servidores web o de base de datos).
Buenas prácticas:
Revisar el código fuente de las páginas web como primer paso.
Buscar elementos de bajo esfuerzo para explotar ("low-hanging fruit"), como credenciales expuestas o enlaces ocultos.
Validación y sanitización de entradas:
Debe realizarse en ambos lados: front-end y back-end.
Previene que datos maliciosos lleguen al servidor o afecten el comportamiento del cliente.
Inyección de HTML:
Causas: Mostrar datos del usuario sin filtrarlos.
Ejemplos:
Formularios maliciosos que roban credenciales.
Alteraciones visuales como el defacement o la inserción de anuncios.
Impacto potencial:
Robo de datos de los usuarios.
Daño a la reputación de la empresa.
Manipulación visual de las páginas para propósitos maliciosos.
Mitigación:
Validar y sanitizar cualquier entrada de usuario antes de procesarla o mostrarla.
Este ejercicio demuestra cómo una inyección de HTML puede manipular el contenido de una página web y potencialmente comprometer su seguridad. Para prevenir este tipo de vulnerabilidades, es crucial sanitizar adecuadamente todas las entradas de usuario y evitar incluir código HTML o JavaScript no seguro en la aplicación web.
HTML Injection como puerta de entrada a XSS:
La inyección de HTML puede evolucionar hacia XSS al incluir código JavaScript malicioso.
Esto permite ejecutar comandos en el navegador de la víctima.
Impacto del XSS:
Acceso no autorizado a cuentas de usuario.
Compromiso potencial del sistema de la víctima.
Ataques más avanzados y peligrosos que los de inyección de HTML simple.
Tipos principales de XSS:
Reflected XSS: Inyección de código en una solicitud que se refleja inmediatamente en la respuesta.
Stored XSS: El código malicioso se almacena en el servidor y afecta a múltiples usuarios.
DOM-Based XSS: El código se ejecuta manipulando el DOM en el navegador del cliente.
El conocimiento y la identificación de estas vulnerabilidades son cruciales para mitigar ataques que podrían comprometer la seguridad de los usuarios y sistemas.
Descripción del Payload:
El payload utiliza el evento onerror
en una etiqueta <img>
para ejecutar JavaScript malicioso.
En este caso, muestra las cookies del documento mediante un popup.
Impacto de la vulnerabilidad:
Robo de cookies: Un atacante podría capturar sesiones activas y usarlas para acceder a cuentas de las víctimas sin necesidad de sus credenciales.
Ataques avanzados: Además del robo de sesiones, esta técnica puede emplearse para ataques como phishing, manipulación del DOM y redireccionamientos maliciosos.
Importancia de la validación y el saneamiento:
La entrada del usuario debe ser cuidadosamente validada y desinfectada tanto en el cliente como en el servidor para prevenir la ejecución de este tipo de payloads.
Content Security Policy (CSP): Una configuración adecuada de CSP puede mitigar la ejecución de scripts no autorizados.
Tema de XSS en profundidad:
Este ejemplo es solo una introducción. Los ataques XSS tienen un alcance amplio, con diferentes vectores y técnicas que se desarrollarán en módulos avanzados.
Un ataque CSRF común para obtener acceso privilegiado a una aplicación web consiste en crear una carga útil en JavaScript que automáticamente cambia la contraseña de la víctima por un valor establecido por el atacante. Cuando la víctima visualiza la carga útil en una página vulnerable (por ejemplo, un comentario malicioso que contiene el payload de JavaScript), el código JavaScript se ejecuta automáticamente. Utiliza la sesión iniciada de la víctima para cambiar su contraseña. Una vez hecho esto, el atacante puede iniciar sesión en la cuenta de la víctima y controlarla.
Validación y sanitización:
Filtrar y limpiar tanto las entradas como las salidas mostradas al usuario.
Esto previene HTML Injection, XSS y CSRF.
Firewall de aplicaciones web (WAF):
Ayuda a prevenir automáticamente intentos de inyección. Sin embargo, pueden ser vulnerables a bypasses, por lo que no deben ser la única línea de defensa.
Medidas anti-CSRF específicas:
Muchos navegadores modernos incluyen protecciones anti-CSRF que evitan la ejecución automática de código JavaScript.
Aplicaciones modernas incluyen:
Tokens anti-CSRF.
Headers HTTP como http-only
o X-XSS-Protection
.
Flags para prevenir solicitudes automatizadas.
Medidas funcionales:
Requerir que el usuario introduzca su contraseña antes de realizar cambios sensibles (como cambiar su contraseña).
Aunque existen medidas avanzadas de prevención, estas pueden ser eludidas. Por lo tanto, los desarrolladores deben seguir las mejores prácticas de codificación y no depender exclusivamente de soluciones automáticas como WAF o protecciones del navegador. La seguridad debe integrarse en todas las capas del desarrollo para mitigar efectivamente las vulnerabilidades como CSRF.
Un servidor back-end es el hardware y el sistema operativo en el lado del servidor que aloja todas las aplicaciones necesarias para ejecutar una aplicación web. Es el sistema real que ejecuta todos los procesos y lleva a cabo las tareas que conforman la aplicación web en su totalidad. El servidor back-end se ubicaría en la capa de acceso a datos (Data Access Layer).
Otros componentes de software en el servidor back-end pueden incluir hipervisores, contenedores y WAFs (firewalls de aplicaciones web).
Existen muchas combinaciones populares de "stacks" para servidores back-end, las cuales contienen un conjunto específico de componentes del back-end.
Hardware en el back-end:
La estabilidad y el rendimiento de la aplicación web dependen del hardware del servidor back-end.
Distribución de carga:
Las arquitecturas modernas distribuyen la carga de trabajo entre múltiples servidores back-end, aumentando la escalabilidad y fiabilidad.
Alojamiento virtual:
Las aplicaciones web pueden aprovechar servicios de centros de datos y la nube para operar en entornos virtualizados, eliminando la dependencia de un solo servidor físico.
Esto resalta la importancia de diseñar infraestructuras robustas y escalables para garantizar un rendimiento óptimo en aplicaciones web de gran tamaño.
Definición de servidor web:
Es una aplicación que opera en el back-end, facilitando la comunicación entre el navegador del cliente y las páginas solicitadas.
Función principal:
Gestionar el tráfico HTTP, redirigir solicitudes y devolver respuestas adecuadas al cliente.
Puertos TCP comunes:
Opera típicamente en los puertos 80 (HTTP) y 443 (HTTPS).
Conexión y gestión:
Conecta a los usuarios con diferentes partes de la aplicación web y maneja las interacciones de manera eficiente.
Este componente es fundamental para garantizar una comunicación fluida y segura entre los usuarios finales y la aplicación web.
Función principal del servidor web:
Gestionar solicitudes HTTP del cliente y proporcionar respuestas adecuadas.
Códigos de respuesta comunes:
200 OK: Solicitud exitosa.
404 NOT FOUND: La página solicitada no existe.
403 FORBIDDEN: Acceso restringido.
Propósito:
Indicar al cliente el estado de su solicitud y proporcionar el contenido o el mensaje adecuado según el contexto.
Estos códigos permiten que los navegadores y usuarios comprendan si las solicitudes fueron procesadas correctamente o si hubo problemas al acceder a recursos específicos.
Popularidad:
Apache es el servidor web más común, albergando más del 40% de los sitios web de internet.
Compatibilidad:
Usado comúnmente con PHP, pero también soporta otros lenguajes como .Net, Python, Perl y Bash.
Módulos y extensibilidad:
Los usuarios pueden instalar módulos adicionales como mod_php para soportar PHP.
Código abierto y mantenimiento:
Es un proyecto de código abierto, bien mantenido y actualizado con regularidad para proteger contra vulnerabilidades.
Facilidad de uso:
Bien documentado y fácil de usar, lo que lo hace adecuado para startups y empresas más pequeñas.
Este servidor web es especialmente popular debido a su facilidad de configuración y mantenimiento, además de ser robusto y flexible para diversas necesidades de desarrollo.
Popularidad:
NGINX es el segundo servidor web más utilizado, con aproximadamente el 30% de los sitios web en internet.
Arquitectura eficiente:
Utiliza una arquitectura asincrónica para manejar múltiples solicitudes web concurrentes con bajo uso de memoria y CPU.
Preferencia en sitios de alto tráfico:
Es el servidor web preferido entre sitios web de alto tráfico, con el 60% de los 100,000 sitios web más populares utilizándolo.
Código abierto y gratuito:
NGINX es gratuito y de código abierto, lo que le proporciona beneficios como seguridad y fiabilidad.
Este servidor es ideal para aplicaciones web que requieren alto rendimiento y eficiencia, especialmente en sitios con grandes volúmenes de tráfico, lo que lo hace una opción popular entre grandes empresas y plataformas con altos requisitos de disponibilidad.
Popularidad:
IIS es el tercer servidor web más común, albergando aproximadamente el 15% de los sitios web en internet.
Desarrollado por Microsoft:
IIS está desarrollado y mantenido por Microsoft, y se ejecuta principalmente en servidores Windows.
Optimización para Active Directory:
Está muy bien optimizado para la integración con Active Directory, permitiendo funcionalidades como la autenticación de usuarios con Windows Auth.
Usos comunes:
Es utilizado para alojar aplicaciones web desarrolladas con el framework .NET, pero también soporta otras tecnologías como PHP o FTP.
Presencia en grandes organizaciones:
Aunque no es el servidor web más popular, muchas grandes organizaciones lo usan, especialmente aquellas que dependen de Windows Server y Active Directory.
IIS es ideal para empresas que ya tienen una infraestructura basada en Windows y Active Directory, y necesitan un servidor web que se integre de manera fluida con estos sistemas.
Apache Tomcat:
Utilizado principalmente para aplicaciones web desarrolladas en Java.
Node.js:
Servidor web para aplicaciones que utilizan JavaScript en el backend, ideal para aplicaciones modernas y de alto rendimiento.
Funciones de las bases de datos:
Almacenan contenido central (imágenes, archivos) y datos de usuarios (nombres de usuario, contraseñas).
Permiten la creación de contenido dinámico personalizado para cada usuario.
Cualidades importantes de las bases de datos:
Velocidad en el manejo de datos.
Capacidad para manejar grandes volúmenes de información.
Escalabilidad para el crecimiento de la aplicación.
Coste según las necesidades del proyecto.
Almacenamiento y estructura:
Las bases de datos relacionales utilizan tablas, filas y columnas para almacenar datos.
Las claves únicas permiten vincular y relacionar tablas entre sí.
Relaciones entre tablas:
Un ejemplo común es vincular la tabla de usuarios con la de publicaciones mediante un id de usuario.
Las relaciones entre tablas conforman un esquema de base de datos.
Ventajas de las bases de datos relacionales:
Permiten realizar consultas rápidas y eficientes sobre grandes volúmenes de datos con estructuras claras.
Mejoran la eficiencia en la gestión y organización de los datos.
Las bases de datos relacionales son fundamentales para gestionar datos de manera eficiente y rápida en aplicaciones web y otros sistemas que requieren una estructura clara y bien definida.
Otras bases de datos SQL comunes incluyen: SQLite, MariaDB, Amazon Aurora y Azure SQL.
SQLite:
Es una base de datos ligera y autónoma que se utiliza principalmente en aplicaciones locales o de dispositivos móviles. No requiere un servidor para funcionar y es fácil de integrar en pequeños proyectos.
MariaDB:
Es una bifurcación de MySQL y se utiliza como una alternativa de código abierto. Es conocida por su rendimiento y fiabilidad en sistemas grandes y escalables.
Amazon Aurora:
Es un servicio de base de datos relacional de alto rendimiento y escalabilidad ofrecido por Amazon Web Services (AWS). Es compatible con MySQL y PostgreSQL, y está diseñado para cargas de trabajo intensivas en datos.
Azure SQL:
Es un servicio de base de datos relacional en la nube ofrecido por Microsoft Azure. Proporciona características de alta disponibilidad, escalabilidad y seguridad, y está optimizado para integrarse con otras soluciones en la nube de Microsoft.
Key-Value:
Este es el modelo más simple de NoSQL, donde los datos se almacenan como un par clave-valor. Es muy rápido y eficiente para almacenar datos sin estructura fija, como sesiones de usuario o configuraciones.
Document-Based:
En este modelo, los datos se almacenan en documentos (por lo general en formato JSON o BSON). Cada documento puede tener una estructura flexible y puede contener diferentes tipos de datos. Es adecuado para almacenar datos semi-estructurados, como contenido de blogs o productos en un catálogo.
Wide-Column:
Las bases de datos de columnas anchas almacenan datos en columnas en lugar de filas. Cada "columna" puede contener múltiples valores y es muy eficiente para consultas analíticas y grandes volúmenes de datos. Es utilizado por bases de datos como Cassandra.
Graph:
Este modelo se usa para almacenar relaciones entre datos en forma de grafos, donde los nodos representan entidades y los bordes representan relaciones. Es ideal para aplicaciones como redes sociales o sistemas de recomendación, donde las relaciones entre elementos son clave.
Se parece a un diccionario/mapa/par clave-valor en lenguajes como Python o PHP (por ejemplo, {'clave':'valor'}
), donde la clave generalmente es una cadena y el valor puede ser una cadena, diccionario o cualquier objeto de clase.
El modelo basado en documentos almacena los datos en objetos JSON complejos, y cada objeto tiene ciertos metadatos mientras almacena el resto de los datos de manera similar al modelo clave-valor.
MongoDB:
Utiliza el modelo basado en documentos, donde los datos se almacenan en formato JSON, lo que permite una gran flexibilidad y escalabilidad. Es ampliamente utilizado en aplicaciones web modernas.
ElasticSearch:
Optimizadas para la búsqueda rápida de grandes volúmenes de datos. Se utiliza principalmente para búsquedas de texto completo y análisis de grandes datasets, como en sistemas de log y monitoreo.
Apache Cassandra:
Conocida por su alta disponibilidad y escalabilidad, especialmente en aplicaciones que requieren manejar grandes volúmenes de datos distribuidos sin interrupciones. Ideal para aplicaciones que necesitan manejar grandes cantidades de datos con alta tolerancia a fallos.
En adición a los servidores web que pueden alojar aplicaciones web en varios lenguajes, existen muchos marcos de desarrollo web comunes que ayudan en el desarrollo de archivos y funcionalidades clave de las aplicaciones web. Con la creciente complejidad de las aplicaciones web, puede ser un desafío crear una aplicación web moderna y sofisticada desde cero. Por esta razón, la mayoría de las aplicaciones web populares se desarrollan utilizando marcos de desarrollo web.
Como la mayoría de las aplicaciones web comparten funcionalidades comunes, como el registro de usuarios, los marcos de desarrollo web facilitan la implementación rápida de estas funcionalidades y su vinculación con los componentes de la interfaz de usuario, creando una aplicación web completamente funcional. Algunos de los marcos de desarrollo web más comunes incluyen:
Laravel (PHP): generalmente utilizado por startups y empresas más pequeñas, ya que es potente pero fácil de desarrollar.
Express (Node.JS): utilizado por empresas como PayPal, Yahoo, Uber, IBM y MySpace.
Django (Python): utilizado por Google, YouTube, Instagram, Mozilla y Pinterest.
Rails (Ruby): utilizado por GitHub, Hulu, Twitch, Airbnb e incluso Twitter en el pasado.
Cabe destacar que los sitios web populares suelen utilizar una variedad de marcos y servidores web, en lugar de uno solo.
Conexión entre front end y back end:
Se logra mediante APIs que permiten intercambiar datos y realizar funciones específicas.
El back end procesa las solicitudes del front end y responde con los resultados necesarios.
Métodos de envío de parámetros:
GET: Los parámetros se envían a través de la URL. Ejemplo: /search.php?item=apples
.
POST: Los parámetros se incluyen en los datos del cuerpo de la solicitud HTTP POST.
Ventajas de los parámetros de consulta:
Permiten manejar diversas entradas con un único endpoint.
En escenarios complejos, las APIs web ofrecen mayor rapidez y eficiencia.
Este conocimiento es clave para manejar correctamente solicitudes HTTP y comprender cómo el front end interactúa con el back end en el desarrollo web.
Tipos de vulnerabilidades comunes:
Autenticación/Control de acceso roto: Permite eludir autenticaciones o acceder a recursos restringidos.
Carga de archivos maliciosos: Uso indebido de funciones de carga de archivos para ejecutar scripts maliciosos.
Inyección de comandos: Manipulación de comandos del sistema operativo a través de entradas mal sanitizadas.
Inyección SQL: Alteración de consultas SQL para comprometer bases de datos.
Ejemplos prácticos:
Uso de cadenas manipuladas (' or 0=0 #
) para autenticar o inyectar comandos (| COMANDO...
).
Subida de archivos con extensiones dobles (.php.jpg
) para ejecutar scripts maliciosos.
Importancia:
Estas vulnerabilidades son recurrentes tanto en el aprendizaje como en evaluaciones del mundo real.
Una comprensión básica de cada vulnerabilidad ofrece una ventaja significativa en el ámbito de la ciberseguridad.
Estas vulnerabilidades son esenciales en pruebas de seguridad y serán abordadas en mayor profundidad en módulos posteriores. Familiarizarse con ellas es fundamental para un pentester o bug bounty hunter en formación.
Vulnerabilidades públicas:
Son prioritarias por ser explotables remotamente.
Exploits públicos: Identificar versiones y buscar PoC en bases como Exploit DB o Rapid7.
Foco en vulnerabilidades críticas (CVSS 8-10) y RCE.
CVSS:
Es el estándar para medir la gravedad de vulnerabilidades.
Utiliza métricas Base, Temporal y Ambiental para calcular puntuaciones.
Escalas CVSS:
V3 introduce la categoría "Crítica" (9.0-10.0).
Calculadores interactivos ayudan a adaptar puntuaciones a entornos específicos.
Componentes del servidor:
Los servidores web son altamente críticos debido a su exposición pública.
Vulnerabilidades internas requieren parches para prevenir compromisos mayores.
Familiarizarse con estas vulnerabilidades y sistemas de puntuación es esencial para identificar, priorizar y mitigar riesgos en pruebas de seguridad y entornos reales.