diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 4c7d77d24..ff94a56ed 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -487,6 +487,7 @@
- [88tcp/udp - Pentesting Kerberos](network-services-pentesting/pentesting-kerberos-88/README.md)
- [Harvesting tickets from Windows](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-windows.md)
- [Harvesting tickets from Linux](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-linux.md)
+ - [Wsgi](network-services-pentesting/pentesting-web/wsgi.md)
- [110,995 - Pentesting POP](network-services-pentesting/pentesting-pop.md)
- [111/TCP/UDP - Pentesting Portmapper](network-services-pentesting/pentesting-rpcbind.md)
- [113 - Pentesting Ident](network-services-pentesting/113-pentesting-ident.md)
diff --git a/src/pentesting-web/csrf-cross-site-request-forgery.md b/src/pentesting-web/csrf-cross-site-request-forgery.md
index bdf0deb38..f18ce031f 100644
--- a/src/pentesting-web/csrf-cross-site-request-forgery.md
+++ b/src/pentesting-web/csrf-cross-site-request-forgery.md
@@ -2,55 +2,62 @@
{{#include ../banners/hacktricks-training.md}}
-## Cross-Site Request Forgery (CSRF) Explained
+## Cross-Site Request Forgery (CSRF) Explicado
-**Cross-Site Request Forgery (CSRF)** es un tipo de vulnerabilidad de seguridad encontrada en aplicaciones web. Permite a los atacantes realizar acciones en nombre de usuarios desprevenidos aprovechando sus sesiones autenticadas. El ataque se ejecuta cuando un usuario, que ha iniciado sesión en la plataforma de la víctima, visita un sitio malicioso. Este sitio entonces desencadena peticiones hacia la cuenta de la víctima mediante métodos como ejecutar JavaScript, enviar formularios o cargar imágenes.
+**Cross-Site Request Forgery (CSRF)** es un tipo de vulnerabilidad de seguridad que se encuentra en aplicaciones web. Permite a atacantes ejecutar acciones en nombre de usuarios desprevenidos aprovechando sus sesiones autenticadas. El ataque se ejecuta cuando un usuario, que está logueado en la plataforma de la víctima, visita un sitio malicioso. Este sitio entonces dispara solicitudes contra la cuenta de la víctima mediante la ejecución de JavaScript, el envío de formularios o la carga de imágenes.
-### Prerequisites for a CSRF Attack
+### Requisitos previos para un ataque CSRF
Para explotar una vulnerabilidad CSRF, se deben cumplir varias condiciones:
-1. **Identify a Valuable Action**: El atacante necesita encontrar una acción que valga la pena explotar, como cambiar la contraseña del usuario, el correo electrónico o elevar privilegios.
-2. **Session Management**: La sesión del usuario debe gestionarse únicamente mediante cookies o el encabezado HTTP Basic Authentication, ya que otros encabezados no pueden manipularse para este propósito.
-3. **Absence of Unpredictable Parameters**: La petición no debe contener parámetros impredecibles, ya que pueden impedir el ataque.
+1. **Identify a Valuable Action**: El atacante necesita encontrar una acción que valga la pena explotar, como cambiar la contraseña del usuario, el email o elevar privilegios.
+2. **Session Management**: La sesión del usuario debería gestionarse únicamente mediante cookies o la cabecera HTTP Basic Authentication, ya que otras cabeceras no pueden manipularse para este propósito.
+3. **Absence of Unpredictable Parameters**: La petición no debe contener parámetros impredecibles, ya que éstos pueden impedir el ataque.
### Quick Check
-Puedes **capturar la petición en Burp** y comprobar las protecciones CSRF y, para probar desde el navegador, puedes hacer clic en **Copy as fetch** y revisar la petición:
+Puedes **capture the request in Burp** y comprobar las protecciones CSRF; para probar desde el navegador puedes hacer clic en **Copy as fetch** y revisar la petición:
### Defending Against CSRF
-Se pueden implementar varias contramedidas para protegerse contra ataques CSRF:
+Se pueden implementar varias contramedidas para proteger contra ataques CSRF:
-- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): Este atributo impide que el navegador envíe cookies junto con peticiones cross-site. [More about SameSite cookies](hacking-with-cookies/index.html#samesite).
-- [**Cross-origin resource sharing**](cors-bypass.md): La política CORS del sitio víctima puede influir en la viabilidad del ataque, especialmente si el ataque requiere leer la respuesta del sitio víctima. [Learn about CORS bypass](cors-bypass.md).
+- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): Este atributo impide que el navegador envíe cookies junto con solicitudes cross-site. [More about SameSite cookies](hacking-with-cookies/index.html#samesite).
+- [**Cross-origin resource sharing**](cors-bypass.md): La política CORS del sitio víctima puede influir en la factibilidad del ataque, especialmente si el ataque requiere leer la respuesta del sitio víctima. [Learn about CORS bypass](cors-bypass.md).
- **User Verification**: Solicitar la contraseña del usuario o resolver un captcha puede confirmar la intención del usuario.
-- **Checking Referrer or Origin Headers**: Validar estos encabezados puede ayudar a asegurar que las peticiones provienen de fuentes confiables. Sin embargo, una construcción cuidadosa de URLs puede eludir comprobaciones mal implementadas, como:
- - Using `http://mal.net?orig=http://example.com` (URL ends with the trusted URL)
- - Using `http://example.com.mal.net` (URL starts with the trusted URL)
+- **Checking Referrer or Origin Headers**: Validar estas cabeceras puede ayudar a asegurar que las solicitudes provienen de orígenes de confianza. Sin embargo, una construcción cuidadosa de URLs puede eludir chequeos mal implementados, por ejemplo:
+ - Usar `http://mal.net?orig=http://example.com` (la URL termina con la URL de confianza)
+ - Usar `http://example.com.mal.net` (la URL empieza con la URL de confianza)
- **Modifying Parameter Names**: Alterar los nombres de los parámetros en peticiones POST o GET puede ayudar a prevenir ataques automatizados.
-- **CSRF Tokens**: Incorporar un token CSRF único en cada sesión y requerir este token en solicitudes posteriores puede mitigar significativamente el riesgo de CSRF. La efectividad del token puede aumentarse aplicando CORS.
+- **CSRF Tokens**: Incorporar un token CSRF único en cada sesión y requerir este token en peticiones subsecuentes puede mitigar significativamente el riesgo de CSRF. La efectividad del token se puede mejorar aplicando CORS.
-Entender e implementar estas defensas es crucial para mantener la seguridad y la integridad de las aplicaciones web.
+Entender e implementar estas defensas es crucial para mantener la seguridad e integridad de las aplicaciones web.
+
+#### Common pitfalls of defenses
+
+- SameSite pitfalls: `SameSite=Lax` aún permite navegaciones top-level cross-site como enlaces y formularios GET, por lo que muchos CSRF basados en GET siguen siendo posibles. Consulta la matriz de cookies en [Hacking with Cookies > SameSite](hacking-with-cookies/index.html#samesite).
+- Header checks: Valida `Origin` cuando esté presente; si tanto `Origin` como `Referer` están ausentes, falla de forma cerrada. No te fíes de coincidencias por substring/regex de `Referer` que pueden ser eludidas con dominios lookalike o URLs manipuladas, y ten en cuenta el truco de supresión `meta name="referrer" content="never"`.
+- Method overrides: Trata los métodos sobreescritos (`_method` u override headers) como cambios de estado y aplica CSRF sobre el método efectivo, no solo sobre POST.
+- Login flows: Aplica protecciones CSRF también al login; de lo contrario, el login CSRF permite re-autenticación forzada en cuentas controladas por el atacante, lo que puede encadenarse con XSS almacenado.
## Defences Bypass
### From POST to GET (method-conditioned CSRF validation bypass)
-Some applications only enforce CSRF validation on POST while skipping it for other verbs. A common anti-pattern in PHP looks like:
+Algunas aplicaciones solo aplican la validación CSRF en POST mientras la omiten para otros verbos. Un anti-patrón común en PHP se ve así:
```php
public function csrf_check($fatal = true) {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') return true; // GET, HEAD, etc. bypass CSRF
// ... validate __csrf_token here ...
}
```
-Si el endpoint vulnerable también acepta parámetros desde $_REQUEST, puedes volver a emitir la misma acción como una petición GET y omitir el token CSRF por completo. Esto convierte una acción que era solo POST en una acción GET que tiene éxito sin un token.
+Si el endpoint vulnerable también acepta parámetros desde $_REQUEST, puedes volver a emitir la misma acción como una petición GET y omitir el CSRF token por completo. Esto convierte una acción POST-only en una acción GET que tiene éxito sin token.
Ejemplo:
-- POST original con token (previsto):
+- Original POST with token (intended):
```http
POST /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList HTTP/1.1
@@ -59,54 +66,94 @@ Content-Type: application/x-www-form-urlencoded
__csrf_token=sid:...&widgetInfoList=[{"widgetId":"https://attacker","widgetType":"URL"}]
```
-- Bypass cambiando a GET (sin token):
+- Bypass by switching to GET (no token):
```http
GET /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList&widgetInfoList=[{"widgetId":"https://attacker","widgetType":"URL"}] HTTP/1.1
```
Notas:
-- Este patrón aparece frecuentemente junto con reflected XSS cuando las respuestas se sirven incorrectamente como text/html en lugar de application/json.
-- Combinar esto con XSS reduce enormemente las barreras de explotación porque puedes entregar un único enlace GET que tanto activa la vía de código vulnerable como evita por completo las comprobaciones CSRF.
+- Este patrón aparece frecuentemente junto con reflected XSS donde las respuestas se sirven incorrectamente como text/html en lugar de application/json.
+- Combinar esto con XSS reduce mucho las barreras de explotación porque puedes entregar un único enlace GET que tanto activa la ruta de código vulnerable como evita completamente las comprobaciones de CSRF.
### Falta de token
-Las aplicaciones pueden implementar un mecanismo para **validar tokens** cuando están presentes. Sin embargo, se produce una vulnerabilidad si la validación se omite por completo cuando el token está ausente. Los atacantes pueden explotar esto **eliminando el parámetro** que contiene el token, no solo su valor. Esto les permite eludir el proceso de validación y llevar a cabo eficazmente un ataque Cross-Site Request Forgery (CSRF).
+Las aplicaciones pueden implementar un mecanismo para **validar tokens** cuando están presentes. Sin embargo, surge una vulnerabilidad si la validación se omite por completo cuando el token está ausente. Los atacantes pueden explotar esto **eliminando el parámetro** que lleva el token, no solo su valor. Esto les permite eludir el proceso de validación y llevar a cabo efectivamente un Cross-Site Request Forgery (CSRF).
-### El token CSRF no está vinculado a la sesión del usuario
+Además, algunas implementaciones solo comprueban que el parámetro exista pero no validan su contenido, por lo que se acepta un **valor de token vacío**. En ese caso, simplemente enviar la petición con `csrf=` es suficiente:
+```http
+POST /admin/users/role HTTP/2
+Host: example.com
+Content-Type: application/x-www-form-urlencoded
-Las aplicaciones que **no vinculan los tokens CSRF a las sesiones de usuario** representan un **riesgo de seguridad** significativo. Estos sistemas verifican los tokens frente a un **conjunto global** en lugar de asegurar que cada token esté ligado a la sesión iniciadora.
+username=guest&role=admin&csrf=
+```
+PoC mínimo que se autoenvía (ocultando la navegación con history.pushState):
+```html
+
+
+
+
+
+
+```
+### CSRF token is not tied to the user session
-Así es como los atacantes explotan esto:
+Las aplicaciones **no vincular los CSRF tokens a las sesiones de usuario** representan un **riesgo de seguridad** significativo. Estos sistemas verifican los tokens contra un **conjunto global** en lugar de asegurarse de que cada token esté ligado a la sesión que lo inició.
-1. **Autenticarse** usando su propia cuenta.
-2. **Obtener un token CSRF válido** del conjunto global.
-3. **Usar este token** en un ataque CSRF contra una víctima.
+Aquí se muestra cómo los atacantes explotan esto:
-Esta vulnerabilidad permite a los atacantes realizar solicitudes no autorizadas en nombre de la víctima, explotando el **mecanismo de validación de tokens inadecuado** de la aplicación.
+1. **Autentican** usando su propia cuenta.
+2. **Obtienen un CSRF token válido** del conjunto global.
+3. **Usan este token** en un ataque CSRF contra una víctima.
+
+Esta vulnerabilidad permite a los atacantes realizar solicitudes no autorizadas en nombre de la víctima, explotando el **mecanismo inadecuado de validación de tokens** de la aplicación.
### Method bypass
-Si la petición está usando un método "**raro**" **method**, verifica si la **method override functionality** está funcionando. Por ejemplo, si está **using a PUT** method puedes intentar **use a POST** method y **send**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_
+Si la solicitud está usando un método "**raro**", comprueba si la funcionalidad de **method override** está funcionando. Por ejemplo, si está usando un método **PUT/DELETE/PATCH** puedes intentar usar **POST** y enviar un override, p.ej. `https://example.com/my/dear/api/val/num?_method=PUT`.
-Esto también puede funcionar enviando el **\_method parameter inside the a POST request** o usando las **cabeceras**:
+Esto también puede funcionar enviando el parámetro **`_method` dentro del body de un POST** o usando headers de override:
-- _X-HTTP-Method_
-- _X-HTTP-Method-Override_
-- _X-Method-Override_
+- `X-HTTP-Method`
+- `X-HTTP-Method-Override`
+- `X-Method-Override`
-### Bypass de token en encabezado personalizado
+Común en frameworks como **Laravel**, **Symfony**, **Express**, y otros. Los desarrolladores a veces omiten CSRF en verbos no-POST asumiendo que los navegadores no pueden emitirlos; con overrides, aún puedes alcanzar esos handlers vía POST.
-Si la solicitud añade un **custom header** con un **token** a la petición como **CSRF protection method**, entonces:
+Example request and HTML PoC:
+```http
+POST /users/delete HTTP/1.1
+Host: example.com
+Content-Type: application/x-www-form-urlencoded
-- Prueba la solicitud sin el **Customized Token y tampoco el header.**
-- Prueba la solicitud con exactamente la **misma longitud pero token diferente**.
+username=admin&_method=DELETE
+```
-### El token CSRF se verifica mediante una cookie
+```html
+
+```
+### Custom header token bypass
-Las aplicaciones pueden implementar protección CSRF duplicando el token tanto en una cookie como en un parámetro de la solicitud o estableciendo una cookie CSRF y verificando si el token enviado al backend corresponde con la cookie. La aplicación valida las peticiones comprobando si el token en el parámetro de la solicitud coincide con el valor de la cookie.
+Si la petición agrega un **custom header** con un **token** a la petición como **CSRF protection method**, entonces:
-Sin embargo, este método es vulnerable a ataques CSRF si el sitio web tiene fallos que permiten a un atacante establecer una cookie CSRF en el navegador de la víctima, como una vulnerabilidad CRLF. El atacante puede explotarlo cargando una imagen engañosa que establece la cookie, seguida de iniciar el ataque CSRF.
+- Prueba la petición sin el **Customized Token** y sin el **header**.
+- Prueba la petición con exactamente la **misma longitud pero token diferente**.
+
+### CSRF token is verified by a cookie
+
+Las aplicaciones pueden implementar la protección CSRF duplicando el token tanto en una cookie como en un request parameter, o configurando una CSRF cookie y verificando si el token enviado en el backend corresponde a la cookie. La aplicación valida las solicitudes comprobando si el token en el request parameter coincide con el valor en la cookie.
+
+Sin embargo, este método es vulnerable a ataques CSRF si el sitio web tiene fallos que permiten a un atacante establecer una CSRF cookie en el navegador de la víctima, como una vulnerabilidad CRLF. El atacante puede explotar esto cargando una imagen engañosa que establece la cookie y, a continuación, iniciar el ataque CSRF.
A continuación hay un ejemplo de cómo podría estructurarse un ataque:
```html
@@ -131,19 +178,19 @@ onerror="document.forms[0].submit();" />