diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md
index a968779af..c62acebec 100644
--- a/src/pentesting-web/xss-cross-site-scripting/README.md
+++ b/src/pentesting-web/xss-cross-site-scripting/README.md
@@ -2,66 +2,67 @@
{{#include ../../banners/hacktricks-training.md}}
-## Metodología
+## Methodology
-1. Verifica si **cualquier valor que controlas** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **utilizado** por código **JS**.
-2. **Encuentra el contexto** donde se refleja/utiliza.
+1. Comprueba si **algún valor que controlas** (_parameters_, _path_, _headers_?, _cookies_?) está siendo **reflejado** en el HTML o **usado** por **JS**.
+2. **Encuentra el contexto** donde se refleja/usa.
3. Si está **reflejado**
-1. Verifica **qué símbolos puedes usar** y dependiendo de eso, prepara la carga útil:
-1. En **HTML crudo**:
+1. Comprueba **qué símbolos puedes usar** y, dependiendo de eso, prepara el payload:
+1. En **raw HTML**:
1. ¿Puedes crear nuevas etiquetas HTML?
2. ¿Puedes usar eventos o atributos que soporten el protocolo `javascript:`?
-3. ¿Puedes eludir protecciones?
-4. ¿El contenido HTML está siendo interpretado por algún motor JS del lado del cliente (_AngularJS_, _VueJS_, _Mavo_...), podrías abusar de una [**Inyección de Plantilla del Lado del Cliente**](../client-side-template-injection-csti.md).
-5. Si no puedes crear etiquetas HTML que ejecuten código JS, ¿podrías abusar de una [**Inyección de Marcado Colgante - HTML sin script**](../dangling-markup-html-scriptless-injection/index.html)?
+3. ¿Puedes bypassar protecciones?
+4. ¿El contenido HTML está siendo interpretado por algún engine JS del lado cliente (_AngularJS_, _VueJS_, _Mavo_...)? podrías abusar de un [**Client Side Template Injection**](../client-side-template-injection-csti.md).
+5. Si no puedes crear etiquetas HTML que ejecuten código JS, ¿podrías abusar de un [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
2. Dentro de una **etiqueta HTML**:
-1. ¿Puedes salir al contexto de HTML crudo?
+1. ¿Puedes salir al contexto raw HTML?
2. ¿Puedes crear nuevos eventos/atributos para ejecutar código JS?
-3. ¿El atributo donde estás atrapado soporta la ejecución de JS?
-4. ¿Puedes eludir protecciones?
-3. Dentro del **código JavaScript**:
-1. ¿Puedes escapar de la etiqueta ``** de una página HTML, dentro de un archivo `.js` o dentro de un atributo utilizando el protocolo **`javascript:`**:
+En este caso tu input se refleja entre **``** tags de una página HTML, dentro de un archivo `.js` o dentro de un atributo que usa el protocolo **`javascript:`**:
-- Si se refleja entre las etiquetas **``**, incluso si tu entrada está dentro de cualquier tipo de comillas, puedes intentar inyectar `` y escapar de este contexto. Esto funciona porque el **navegador primero analizará las etiquetas HTML** y luego el contenido, por lo tanto, no notará que tu etiqueta inyectada `` está dentro del código HTML.
-- Si se refleja **dentro de una cadena JS** y el último truco no está funcionando, necesitarías **salir** de la cadena, **ejecutar** tu código y **reconstruir** el código JS (si hay algún error, no se ejecutará):
+- Si se refleja entre **``** tags, incluso si tu entrada está dentro de cualquier tipo de comillas, puedes intentar inyectar `` y escapar de este contexto. Esto funciona porque el **navegador primero analizará las etiquetas HTML** y luego el contenido, por lo tanto, no detectará que tu etiqueta `` inyectada está dentro del código HTML.
+- Si se refleja **dentro de una cadena JS** y el truco anterior no funciona necesitarás **salir** de la cadena, **ejecutar** tu código y **reconstruir** el código JS (si hay algún error, no se ejecutará:
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
-- Si se refleja dentro de literales de plantilla, puedes **incrustar expresiones JS** utilizando la sintaxis `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
-- **La codificación Unicode** funciona para escribir **código javascript válido**:
+- Si se refleja dentro de template literals puedes **incrustar expresiones JS** usando la sintaxis `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
+- **Unicode encode** works to write **valid javascript code**:
```javascript
alert(1)
alert(1)
@@ -85,8 +86,8 @@ alert(1)
```
#### Javascript Hoisting
-Javascript Hoisting se refiere a la oportunidad de **declarar funciones, variables o clases después de que se utilizan, por lo que puedes abusar de escenarios donde un XSS está utilizando variables o funciones no declaradas.**\
-**Consulta la siguiente página para más información:**
+Javascript Hoisting hace referencia a la oportunidad de **declarar funciones, variables o clases después de que se usan, para poder explotar escenarios donde una XSS está usando variables o funciones no declaradas.**\
+**Check the following page for more info:**
{{#ref}}
@@ -97,13 +98,13 @@ js-hoisting.md
Varias páginas web tienen endpoints que **aceptan como parámetro el nombre de la función a ejecutar**. Un ejemplo común que se ve en la práctica es algo como: `?callback=callbackFunc`.
-Una buena manera de averiguar si algo proporcionado directamente por el usuario está intentando ser ejecutado es **modificando el valor del parámetro** (por ejemplo, a 'Vulnerable') y buscando en la consola errores como:
+Una buena forma de averiguar si algo dado directamente por el usuario está intentando ejecutarse es **modificar el valor del parámetro** (por ejemplo a 'Vulnerable') y buscar en la consola errores como:
.png>)
-En caso de que sea vulnerable, podrías ser capaz de **disparar una alerta** simplemente enviando el valor: **`?callback=alert(1)`**. Sin embargo, es muy común que estos endpoints **validen el contenido** para permitir solo letras, números, puntos y guiones bajos (**`[\w\._]`**).
+En caso de que sea vulnerable, podrías ser capaz de **disparar un alert** simplemente enviando el valor: **`?callback=alert(1)`**. Sin embargo, es muy común que estos endpoints **validen el contenido** para permitir solo letras, números, puntos y guiones bajos (**`[\w\._]`**).
-Sin embargo, incluso con esa limitación, todavía es posible realizar algunas acciones. Esto se debe a que puedes usar esos caracteres válidos para **acceder a cualquier elemento en el DOM**:
+No obstante, aun con esa limitación sigue siendo posible realizar algunas acciones. Esto se debe a que puedes usar esos caracteres válidos para **acceder a cualquier elemento en el DOM**:
.png>)
@@ -115,11 +116,11 @@ nextElementSibiling
lastElementSibiling
parentElement
```
-También puedes intentar **activar funciones de Javascript** directamente: `obj.sales.delOrders`.
+También puedes intentar **ejecutar funciones Javascript** directamente: `obj.sales.delOrders`.
-Sin embargo, generalmente los endpoints que ejecutan la función indicada son endpoints sin un DOM muy interesante, **otras páginas en el mismo origen** tendrán un **DOM más interesante** para realizar más acciones.
+However, usually the endpoints executing the indicated function are endpoints without much interesting DOM, **other pages in the same origin** will have a **more interesting DOM** to perform more actions.
-Por lo tanto, para **abusar de esta vulnerabilidad en un DOM diferente** se desarrolló la explotación de **Same Origin Method Execution (SOME)**:
+Therefore, in order to **abuse this vulnerability in a different DOM** the **Same Origin Method Execution (SOME)** exploitation was developed:
{{#ref}}
@@ -128,7 +129,7 @@ some-same-origin-method-execution.md
### DOM
-Hay **código JS** que está utilizando **de manera insegura** algunos **datos controlados por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.
+There is **JS code** that is using **unsafely** some **data controlled by an attacker** like `location.href` . An attacker, could abuse this to execute arbitrary JS code.
{{#ref}}
@@ -137,8 +138,8 @@ dom-xss.md
### **Universal XSS**
-Este tipo de XSS se puede encontrar **en cualquier lugar**. No dependen solo de la explotación del cliente de una aplicación web, sino de **cualquier** **contexto**. Este tipo de **ejecución arbitraria de JavaScript** incluso puede ser abusada para obtener **RCE**, **leer** **archivos** **arbitrarios** en clientes y servidores, y más.\
-Algunos **ejemplos**:
+These kind of XSS can be found **anywhere**. They not depend just on the client exploitation of a web application but on **any** **context**. These kind of **arbitrary JavaScript execution** can even be abuse to obtain **RCE**, **read** **arbitrary** **files** in clients and servers, and more.\
+Some **examples**:
{{#ref}}
@@ -150,17 +151,17 @@ server-side-xss-dynamic-pdf.md
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
{{#endref}}
-## Bypass de WAF codificando imagen
+## Imagen de WAF bypass encoding
.jpg>)
-## Inyectando dentro de HTML crudo
+## Inyección dentro del HTML crudo
-Cuando tu entrada se refleja **dentro de la página HTML** o puedes escapar e inyectar código HTML en este contexto, lo **primero** que necesitas hacer es verificar si puedes abusar de `<` para crear nuevas etiquetas: Solo intenta **reflejar** ese **carácter** y verifica si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar este caso**.\
-Para estos casos también **ten en cuenta** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
-_**Nota: Un comentario HTML se puede cerrar usando\*\***\***\*`-->`\*\***\***\*o \*\***`--!>`\*\*_
+When your input is reflected **inside the HTML page** or you can escape and inject HTML code in this context the **first** thing you need to do if check if you can abuse `<` to create new tags: Just try to **reflect** that **char** and check if it's being **HTML encoded** or **deleted** of if it is **reflected without changes**. **Only in the last case you will be able to exploit this case**.\
+For this cases also **keep in mind** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
+_**Note: A HTML comment can be closed using `-->` or `--!>`**_
-En este caso y si no se utiliza ninguna lista negra/blanca, podrías usar cargas útiles como:
+In this case and if no black/whitelisting is used, you could use payloads like:
```html
` o entre eventos HTML que pueden ejecutar código JS o entre atributos que aceptan el protocolo `javascript:`.
+En este caso tu **input** será **reflejado dentro del código JS** de un archivo `.js` o entre etiquetas `` o entre eventos HTML que pueden ejecutar código JS o entre atributos que aceptan el protocolo `javascript:`.
### Escapando la etiqueta \` podrías fácilmente **escapar cerrando la etiqueta `` podrías fácilmente **escapar cerrando la etiqueta `
```
-Tenga en cuenta que en este ejemplo **ni siquiera hemos cerrado la comilla simple**. Esto se debe a que **el análisis de HTML se realiza primero por el navegador**, lo que implica identificar los elementos de la página, incluidos los bloques de script. El análisis de JavaScript para entender y ejecutar los scripts incrustados solo se lleva a cabo después.
+Ten en cuenta que en este ejemplo **ni siquiera hemos cerrado la comilla simple**. Esto se debe a que **el análisis de HTML se realiza primero por el navegador**, lo que implica identificar los elementos de la página, incluidos los bloques de script. El análisis de JavaScript para entender y ejecutar los scripts embebidos se realiza solo después.
### Dentro del código JS
-Si `<>` están siendo sanitizados, aún puedes **escapar la cadena** donde se encuentra tu entrada y **ejecutar JS arbitrario**. Es importante **corregir la sintaxis de JS**, porque si hay algún error, el código JS no se ejecutará:
+Si `<>` se están sanitizando, aún puedes **escapar la cadena** donde tu input está **ubicado** y **ejecutar JS arbitrario**. Es importante **corregir la sintaxis de JS**, porque si hay errores, el código JS no se ejecutará:
```
'-alert(document.domain)-'
';alert(document.domain)//
\';alert(document.domain)//
```
-### Literales de plantilla \`\`
+#### JS-in-JS string break → inject → repair pattern
-Para construir **cadenas** además de comillas simples y dobles, JS también acepta **comillas invertidas** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\
-Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que utiliza comillas invertidas, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**:
+Cuando la entrada del usuario cae dentro de una quoted JavaScript string (p. ej., server-side echo dentro de un inline script), puedes terminar la string, inject code y reparar la sintaxis para mantener el parsing válido. Esqueleto genérico:
+```
+" // end original string
+; // safely terminate the statement
+ // attacker-controlled JS
+; a = " // repair and resume expected string/statement
+```
+Ejemplo de patrón de URL cuando el parámetro vulnerable se refleja en una cadena JS:
+```
+?param=test";;a="
+```
+Esto ejecuta attacker JS sin necesidad de tocar el contexto HTML (puro JS-in-JS). Combínalo con blacklist bypasses más abajo cuando los filtros bloqueen keywords.
-Esto se puede **abusar** usando:
+### Template literals ``
+
+Para construir **strings**, además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como template literals ya que permiten **embedded JS expressions** usando `${ ... }` syntax.\
+Por lo tanto, si encuentras que tu input está siendo **reflected** dentro de una JS string que está usando backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **arbitrary JS code**:
+
+Esto puede ser **abused** using:
```javascript
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
```
@@ -511,22 +527,35 @@ return loop
}
loop``
```
-### Ejecución de código codificado
+### Ejecución de code codificado
```html
This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
-**Saltos de línea de JavaScript (del** [**truco de salto de línea de JavaScript**](#javascript-new-lines) **)**
+**JavaScript new lines (del** [**JavaScript new line**](#javascript-new-lines) **truco)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@@ -582,7 +611,7 @@ alert("//\u2028alert(1)") //0xe2 0x80 0xa8
String.fromCharCode(8233)
alert("//\u2029alert(1)") //0xe2 0x80 0xa9
```
-**Espacios en blanco de JavaScript**
+**Espacios en blanco en JavaScript**
```javascript
log=[];
function funct(){}
@@ -747,22 +776,21 @@ top[8680439..toString(30)](1)
```
## **Vulnerabilidades DOM**
-Hay **código JS** que está utilizando **datos controlados de manera insegura por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.\
-**Debido a la extensión de la explicación de** [**vulnerabilidades DOM, se trasladó a esta página**](dom-xss.md)**:**
-
+Hay **código JS** que usa **datos controlados de forma insegura por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.\
+**Debido a la extensión de la explicación sobre** [**las vulnerabilidades DOM se movieron a esta página**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
Allí encontrarás una **explicación detallada de qué son las vulnerabilidades DOM, cómo se provocan y cómo explotarlas**.\
-Además, no olvides que **al final del post mencionado** puedes encontrar una explicación sobre [**ataques de DOM Clobbering**](dom-xss.md#dom-clobbering).
+Además, no olvides que **al final del post mencionado** puedes encontrar una explicación sobre [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
-### Mejora de Self-XSS
+### Escalando Self-XSS
### Cookie XSS
-Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing:
+Si puedes disparar un XSS enviando el payload dentro de una cookie, esto suele ser un Self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de ese XSS para inyectar una cookie en todo el dominio logrando disparar el cookie XSS en el dominio principal u otros subdominios (aquellos vulnerables a cookie XSS). Para esto puedes usar el cookie tossing attack:
{{#ref}}
@@ -771,30 +799,30 @@ Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto
Puedes encontrar un gran abuso de esta técnica en [**este post del blog**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
-### Enviando tu sesión al administrador
+### Enviar tu sesión al admin
-Quizás un usuario pueda compartir su perfil con el administrador y si el self XSS está dentro del perfil del usuario y el administrador accede a él, desencadenará la vulnerabilidad.
+Quizá un usuario pueda compartir su perfil con el admin y si el Self-XSS está dentro del perfil del usuario y el admin lo accede, éste activará la vulnerabilidad.
-### Reflejo de Sesión
+### Session Mirroring
-Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda, para que el administrador te ayude, verá lo que tú estás viendo en tu sesión pero desde su sesión.
+Si encuentras algún Self XSS y la web tiene **session mirroring para administradores**, por ejemplo permitiendo a los clientes pedir ayuda y para que el admin te ayude él verá lo que tú ves en tu sesión pero desde su sesión.
-Podrías hacer que el **administrador desencadene tu self XSS** y robar sus cookies/sesión.
+Podrías hacer que el **administrador dispare tu Self XSS** y robar sus cookies/sesión.
## Otros Bypasses
-### Unicode Normalizado
+### Normalised Unicode
-Podrías verificar si los **valores reflejados** están siendo **normalizados en unicode** en el servidor (o en el lado del cliente) y abusar de esta funcionalidad para eludir protecciones. [**Encuentra un ejemplo aquí**](../unicode-injection/index.html#xss-cross-site-scripting).
+Podrías comprobar si los **valores reflejados** están siendo **unicode normalized** en el servidor (o en el cliente) y abusar de esta funcionalidad para eludir protecciones. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting).
-### Bypass de la bandera PHP FILTER_VALIDATE_EMAIL
+### PHP FILTER_VALIDATE_EMAIL flag Bypass
```javascript
">