> 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/reflected-xss.md).

# Reflected XSS

Reflected XSS surge cuando una aplicación recibe datos en una solicitud HTTP e incluye esos datos en la respuesta inmediata de forma no segura.

## Impacto del ataque de un Reflected XSS

Si un atacante puede controlar un script que se ejecuta en el navegador de la víctima, normalmente puede comprometer completamente a ese usuario:

* Realizar cualquier acción dentro de la aplicación que el usuario pueda realizar.
* Ver cualquier información que el usuario pueda ver.
* Modificar cualquier información que el usuario pueda modificar.
* Iniciar interacciones con otros usuarios de la aplicación, incluidos ataques maliciosos, que parecerán ser originados desde el usuario víctima.

Existen múltiples métodos para inducir a un usuario a realizar una solicitud que controlamos, como las siguientes:

* Colocar enlaces en un sitio web controlado por el atacante, o en otro sitio que permita generar contenido.
* Enviar un enlace en un correo electrónico, tweet u otro mensaje.

La necesidad de un mecanismo de entrega externo para el ataque significa que el impacto del Reflected XSS es generalmente menos severo que el del Stored XSS.

## Reflected XSS en contexto HTML sin nada codificado

> El siguiente sitio posee un Reflected XSS en la función de búsqueda.

Al ingresar datos en el parámetro de búsqueda, estos son reflejados en el body de la respuesta del sitio:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FoBdVZYFsFEs702a6EiMn%2Fimage.png?alt=media&amp;token=80619d9d-a5b5-4d84-a641-92fc6cc11e80" alt=""><figcaption><p>Site</p></figcaption></figure>

Al enviar datos, estos son enviados mediante un método GET:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FwnSRe0lBo1OH8KCL27vg%2Fimage.png?alt=media&amp;token=6e334146-ea2f-45ef-9043-2803f40fa871" alt=""><figcaption><p>Envío de datos</p></figcaption></figure>

Como se ve a continuación, estos datos son reflejados en el body de la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FRaO7VWsz2OAvDKCdgsso%2Fimage.png?alt=media&amp;token=007c076b-6994-4193-a6be-6ed6dc05670d" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FRlhpcaGzV64QSgDMnag5%2Fimage.png?alt=media&amp;token=39f5a4c6-746b-4153-915c-427cb5380329" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Ahora, validamos si podemos enviar código JavaScript. Se enviará el payload `<script>alert(1)</script>` encodeado en URL:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FSr3YBjsLm0LMAOFUDbpW%2Fimage.png?alt=media&amp;token=76489b58-659c-4f35-82f6-dec2f88714e8" alt=""><figcaption><p>Payload codificado</p></figcaption></figure>

Vemos que el 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%2FOQ253y2uVGobHldjaZ0E%2Fimage.png?alt=media&amp;token=3cf96664-c72e-431a-a856-96a2fa5dd3ed" alt=""><figcaption><p>El payload no se codifica en la respuesta</p></figcaption></figure>

Por lo tanto, si lo revisamos en la web, vemos que salta el pop-up con el mensaje que dejamos en el `alert()` enviado:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FyM16cEZ9pdR1ikdC4Bn7%2Fimage.png?alt=media&amp;token=94eb2585-f7c7-4d89-8da0-e0aadcd76084" alt=""><figcaption><p>Resultado de la función alert()</p></figcaption></figure>

## Reflected XSS en atributo con angle brackets codificado en HTML

> El siguiente sitio posee un Reflected XSS en la función de búsqueda.

Al ingresar datos en el parámetro de búsqueda, estos son reflejados en el body de la respuesta del sitio:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FRKmyRwdBkcKxLCWAw8bS%2Fimage.png?alt=media&amp;token=861856df-2577-4f77-b7c2-9dfb40393c19" alt=""><figcaption><p>Site</p></figcaption></figure>

Al enviar datos, estos son enviados mediante un método GET:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FluesF4CUS9higIMClxXe%2Fimage.png?alt=media&amp;token=1ad31bad-ee62-4adb-a156-fe75db87dc0c" alt=""><figcaption><p>Datos enviados</p></figcaption></figure>

Como se ve a continuación, estos datos son reflejados en el body de la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F7fyk5scJkakXnDwh0Qqd%2Fimage.png?alt=media&amp;token=f2696e2c-0ba1-4b93-904a-72baa7a4413b" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FqyIM9SjJ5M7KmevIEAPN%2Fimage.png?alt=media&amp;token=8baaad97-1512-4d18-8544-94e0b2dc106e" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Ahora enviamos el payload `<script>alert(1)</script>`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FEUrTjJ4NtYTXcoH2MHnO%2Fimage.png?alt=media&amp;token=31772ec4-af60-4395-bb94-82da31a99eec" alt=""><figcaption><p>Payload 01</p></figcaption></figure>

En la respuesta, los símbolos `<>` se encuentran codificados, por lo tanto, no podemos usar una nueva etiqueta HTML:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FHfjW0kgdr8JkIrMuVhrH%2Fimage.png?alt=media&amp;token=18487f98-dbdf-4594-9975-78f717a9f877" alt=""><figcaption><p>Angle Brackets codificados</p></figcaption></figure>

Como los datos se encuentran en del atributo `value` del tag `input`, podemos enviar un payload para que trabaje dentro de este mismo tag. Para este caso, usamos el payload `" onmouseover="alert(1)`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FmKXYYcf3rArWfA3otSdT%2Fimage.png?alt=media&amp;token=83733867-f4ab-4d09-a5b0-5d59918a0630" alt=""><figcaption><p>Payload 02</p></figcaption></figure>

Con las primeras comillas del payload, cerramos el atributo `value`, y este dejará el nuevo atributo `onmouseover` dentro del tag input:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fw6THfNWGXCPbnHxoumOw%2Fimage.png?alt=media&amp;token=9877a76c-7c5a-48c2-b4d8-4fa1a6e13137" alt=""><figcaption><p>Payload reflejado</p></figcaption></figure>

Ahora, si mandamos el payload directamente en la web, y pasamos el mouse sobre la barra de búsqueda, salta el pop-up con el mensaje indicado en el payload:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FK89pKC8z92ftXP0gmj6j%2Fimage.png?alt=media&amp;token=6f25aeb0-dec5-4ede-b136-b43ba0da59b1" alt=""><figcaption><p>Payload reflejado</p></figcaption></figure>

## Relfected XSS en un string JavaScript con angle brackets codificados en HTML

> El siguiente sitio posee un Reflected XSS en la función de búsqueda.

Al ingresar datos en el parámetro de búsqueda, estos son reflejados en el body de la respuesta del sitio:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FTHgK7jeT5UopI8gyrPro%2Fimage.png?alt=media&amp;token=79c50b2b-8381-490b-8d03-ab94212d7b32" alt=""><figcaption><p>Sitio</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FIzh5PKQ3XtVx6xjXzBpS%2Fimage.png?alt=media&amp;token=efeba806-b8c4-431f-affd-a94099e9376b" alt=""><figcaption><p>Datos enviados</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FsKf4kpkmdPSXiq6XFBX2%2Fimage.png?alt=media&amp;token=5661ac67-ae4e-42bb-bcf0-e5a76681f964" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FlBcw3Vqr7iNB3AiGauwv%2Fimage.png?alt=media&amp;token=e0c2b69d-5c89-4016-8cf1-27c5c8af139f" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Validamos si podemos ingresar el siguiente payload `'</script><script>alert(1)</script>`, cerrando el tag script:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FHuJvt4534obLc2jjLQZO%2Fimage.png?alt=media&amp;token=9b2099d5-4b0f-4e9c-82d9-0152ef8b6148" alt=""><figcaption><p>Payload 01</p></figcaption></figure>

Los angle brackets se encuentran codificados en la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FXBOz9QrLJJgopyCzhr0K%2Fimage.png?alt=media&amp;token=1c98706d-995d-4795-ab01-60d6a8c3d2a4" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Usamos el siguiente payload `'-alert(1)-'`, donde,  se usan `-` para concatenar e indicar que se tiene tomar en cuenta el valor de `alert()`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FRAVCLHHVw3bCKIqVn146%2Fimage.png?alt=media&amp;token=d3e7eefe-a256-4c0f-b698-aab009d2eb48" alt=""><figcaption><p>Payload 02</p></figcaption></figure>

Vemos que el payload no se codifica en la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FKLzrzp65pASehZd0bzIr%2Fimage.png?alt=media&amp;token=05f0674c-6b91-4f07-8ae5-c292323bba15" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Al ingresar este payload directamente en la barra de búsqueda, vemos que salta el pop-up con el mensaje dentro de la función `alert()`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FE1OkuqyXdPuI1IlnJuHk%2Fimage.png?alt=media&amp;token=a9597cd9-300c-4477-ab19-b5c3ad3cd6ec" alt=""><figcaption><p>XSS</p></figcaption></figure>

## Reflected XSS en contexto HTML con la mayoría de las etiquetas y atributos bloqueados

Como indica el título del lab, se presentan múltiples bloqueos de etiquetas y atributos a nivel de HTML, por este motivo, es necesario identificar cuáles podemos usar.

Usando el intruder de Burp Suite, y el Cheat Sheet de PortSwigger, podemos validar las etiquetas/atributos permitidos.

Lo primero es mandar el request de la búsqueda al Intruder:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FyYu6IUEY2qETMvGcBN58%2FPasted%20image%2020230209162907.png?alt=media&amp;token=d24179db-e757-4e25-86fc-ca6e3bf7ed27" alt=""><figcaption><p>Envío a Intruder</p></figcaption></figure>

En este, seleccionamos donde necesitamos agregar el payload:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fi26Zz38VWwsFxJt77f4I%2FPasted%20image%2020230209163054.png?alt=media&amp;token=4811583b-5efd-4fc5-8116-fbbdb6f11692" alt=""><figcaption><p>Payload Positions</p></figcaption></figure>

Ahora, desde la web de [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) copiamos los tags:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fb1yHiSSK7Ssc1Klnf0KG%2FPasted%20image%2020230209163212.png?alt=media&amp;token=4d367bde-0971-4d34-bf3e-e6b5d6556f82" alt=""><figcaption><p>Cheat Sheet</p></figcaption></figure>

Estos los agregamos a la lista de payloads:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FHRF69bgMmKSoshZwUzL4%2FPasted%20image%2020230209163255.png?alt=media&amp;token=2c168d60-5c68-4fb1-bc20-01a780d1fb53" alt=""><figcaption><p>Payloads a usar</p></figcaption></figure>

Ya con esto, le damos clic en `Start attack`, y cuando termine, revisamos las respuestas que tengan mayor largo, que en este caso, es `body`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FJSzQYf9Z6a18P3L8ACE8%2FPasted%20image%2020230209163431.png?alt=media&amp;token=d5b23c3e-5126-4079-a4f8-5a894f943cd4" alt=""><figcaption><p>Responses</p></figcaption></figure>

Con este tag, repetimos lo anterior, pero ahora agregando los `events` del cheat sheet:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FvSq7jdYJyijX0ssNnFqX%2FPasted%20image%2020230209163556.png?alt=media&amp;token=853047ee-2ee1-4ebd-860b-26b1e927c693" alt=""><figcaption><p>Payload Positions</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FkTAMWoMkY1jHahjj1mFP%2FPasted%20image%2020230209163609.png?alt=media&amp;token=14d0a505-2261-4394-8b94-8fb3cab1d4d9" alt=""><figcaption><p>Payloads a usar</p></figcaption></figure>

Acá podemos filtrar por dos opciones, por el status code o por el largo:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F9EcjOCy9ELrNQV50oaPL%2FPasted%20image%2020230209163753.png?alt=media&amp;token=8daf9819-7aa0-4d51-ba03-25b146ac62b3" alt=""><figcaption><p>Responses</p></figcaption></figure>

Con esto, validamos ingresando la función `alert()` dentro del atributo `onresize`, y vemos que salta el pop-up al momento de ajustar el tamaño de la página:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FHYGoikVhoz8kj9zIKLcI%2FPasted%20image%2020230209164321.png?alt=media&amp;token=4adf475c-b33c-4c40-9989-ef17f858884e" alt=""><figcaption><p>XSS</p></figcaption></figure>

Para poder enviar este payload a un usuario, podemos usar el siguiente `iframe`:

```html
<iframe src="https://target.com/?search=%22%3E%3Cbody%20onresize=alert(document.cookie)%3E" onload=this.style.width='100px'>
```

## Reflected XSS en contexto HTML con todas las etiquetas bloqueadas excepto las personalizadas

Como se especifica en el título del lab, los tags normales de HTML no pueden ser usados en este caso, debido que, estos se encuentran filtrados, por este motivo, es que se validará con el envío de un tag personalizado.

En la barra de búsqueda, ingresamos un tag no personalizado, y vemos que tenemos un error `400`, indicando que el tag no se encuentra permitido:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F57tBcQBN5eur6W0jdsMY%2FPasted%20image%2020230209170734.png?alt=media&amp;token=4c96965f-712c-4c99-bccd-9aee1555f0ac" alt=""><figcaption><p>Status Code 400</p></figcaption></figure>

Ahora modificamos el tag a uno custom, con atributos que nos permitan inyectar JavaScript `<wolf id=x tabindex=1 onfocus=alert(1)>`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F12jGGZwbLt3yoP726Qjt%2FPasted%20image%2020230209171708.png?alt=media&amp;token=f0580c05-3050-461b-8194-2572fb941cce" alt=""><figcaption><p>Tag personalizado</p></figcaption></figure>

Este tag es reflejado de forma correcta en la respuesta, pero al momento de querer hacer saltar el pop-up no salta, así que para generar el `alert()`, se llama el `id` con el siguiente string (`#x`) al final del payload:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FMm0F8mkxz0VI887Acm3U%2FPasted%20image%2020230209171838.png?alt=media&amp;token=e17df683-9558-4ac6-942d-c36f0ee76d70" alt=""><figcaption><p>XSS</p></figcaption></figure>

## Reflected XSS con algunas marcas SVG permitidas

Al inyectar un payload en la opción de búsqueda, vemos que nos da un error `400` especificando que el tag ingresado no se encuentra permitido:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F78arlNrv0aQ95a9E3zjb%2FPasted%20image%2020230210125735.png?alt=media&amp;token=27a50d38-072e-4646-ba8c-37ad824eb2f1" alt=""><figcaption><p>Sitio Web</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FKD74MSJgho9T8bOYF8Ln%2FPasted%20image%2020230210125742.png?alt=media&amp;token=3dcede81-65d6-4f2e-b99f-d10989edb383" alt=""><figcaption><p>Payload de prueba</p></figcaption></figure>

Por este motivo, realizamos fuzzing usando la herramienta Intruder para identificar que tags se encuentran permitidos:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FLAtab00spRrjPjAr27O6%2FPasted%20image%2020230210125756.png?alt=media&amp;token=a50af71c-c7aa-4aa3-bfa6-e0df23d4a6ca" alt=""><figcaption><p>Payload positions</p></figcaption></figure>

Como payloads, usamos los tags que se encuentran en el Cheat Sheet de XSS de PortSwigger:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FnjQhcjPapJaih2TzHWAs%2FPasted%20image%2020230210125809.png?alt=media&amp;token=152fedc6-1955-4bca-959c-b67d1e76203e" alt=""><figcaption><p>Payload settings</p></figcaption></figure>

Podemos observar que los tags permitidos son: `<svg>`, `<title>`, `<image>` y `<animatetransform>`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FPK4XJVL4bLCYz1cq0pny%2FPasted%20image%2020230210125906.png?alt=media&amp;token=25615282-37a5-4243-9a91-a0215f58f238" alt=""><figcaption><p>Tags permitidos</p></figcaption></figure>

El tag `<animatetransform>` es un tag que se puede usar en conjunto con `<svg>`, el cual, permite usar atributos que ejecutan scripts:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F2W9ZwNn6CJpRodrrWLQ0%2FPasted%20image%2020230210130121.png?alt=media&amp;token=8e2ecc17-3e30-4c34-a205-ce70670b7301" alt=""><figcaption><p>Validación de atributos</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FhNZrFMFeg4gzb05ix4FW%2FPasted%20image%2020230210130233.png?alt=media&amp;token=80f8ac66-d1b6-4bd3-8fd4-0c5c955ea03e" alt=""><figcaption><p>Atributos permitidos</p></figcaption></figure>

Usando el payload `<svg><animatetransform onbegin=alert(1)>` podemos explotar el XSS:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FPXNtnNEriG8ytBRROBhW%2FPasted%20image%2020230210130340.png?alt=media&amp;token=cb994c15-0b94-4092-bacb-bfa66dcf558d" alt=""><figcaption><p>Envío del payload</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FdkRKRWQe1MPruc8jMTLE%2FPasted%20image%2020230210130408.png?alt=media&amp;token=dac57eaa-a3b0-4472-b8c1-18ac55100c3d" alt=""><figcaption><p>XSS</p></figcaption></figure>

## Reflected XSS en la etiqueta de enlace canónico

Al revisar el código fuente, apreciamos que se tiene un [enlace canónico](https://ahrefs.com/blog/es/etiquetas-canonical/):

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FWhck168PC4KagRjuzjh1%2FPasted%20image%2020230211010247.png?alt=media&amp;token=6b09a2e6-839f-454a-b9e0-b42006e8654a" alt=""><figcaption><p>Enlace canónico</p></figcaption></figure>

Si al enlace le agregamos algún string, este se ve reflejado en el enlace canónico:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FH5irItknNWtrU4cSaYsz%2FPasted%20image%2020230211010404.png?alt=media&amp;token=9e8bd291-e3a9-4d9e-9be6-5b67fefe5d51" alt=""><figcaption><p>Modificación del enlace canónico</p></figcaption></figure>

Al agregar el payload `?'onload='alert(1)`, este se ve reflejado en el enlace, pero no se ejecuta la función `alert()`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FOggF0LXa7cbGCgKbUrRm%2FPasted%20image%2020230211010501.png?alt=media&amp;token=486e7c0f-ff44-4a97-a13f-65345dcd0066" alt=""><figcaption><p>Payload 01</p></figcaption></figure>

Revisando la información de los research que posee PortSwigger, encontramos que tienen un [post](https://portswigger.net/research/xss-in-hidden-input-fields) donde indican con qué payload podemos explotar los enlaces canónicos, por lo tanto, usando el payload `?'accesskey='x'onclick='alert(1)`, y la combinación de teclas `ALT+SHIFT+X`, salta el pop-up con el mensaje de la función `alert()`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FLZQyVOq5AaJiEGqmeIiO%2FPasted%20image%2020230211010615.png?alt=media&amp;token=c3c2880b-1013-45fb-b3b9-434ee4ac652a" alt=""><figcaption><p>Payload 02</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FolYQQaEdc7SkAl1wxOe5%2FPasted%20image%2020230211010712.png?alt=media&amp;token=aa467743-3a9a-46cb-af2e-3ae8eafbedb3" alt=""><figcaption><p>XSS</p></figcaption></figure>

> La combinación de teclas en los diferentes OS son:
>
> * On Windows: `ALT+SHIFT+X`
> * On MacOS: `CTRL+ALT+X`
> * On Linux: `Alt+X`

## Reflected XSS en una cadena de JavaScript con comillas simples y backslash escapado

Al ingresar un string en la barra de búsqueda, este se refleja en la variable `searchTerms` dentro del código JavaScript de la respuesta:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FUbT7yZbhti8wNKVLHL1p%2FPasted%20image%2020230211014217.png?alt=media&amp;token=02add6b2-307f-4080-9586-448e4f9c02ef" alt=""><figcaption><p>Sitio web</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FADrnXxv4etJXu0T8gHpF%2FPasted%20image%2020230211014329.png?alt=media&amp;token=5278916d-df50-4df2-82ed-9db2f21bf9d9" alt=""><figcaption><p>Datos reflejados</p></figcaption></figure>

Si a este payload le agregamos una comilla simple (`'`), este carácter es escapado mediante un backslash (`\`):

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FtMwRFJRvxuduBlfGa8Rb%2FPasted%20image%2020230211014433.png?alt=media&amp;token=d1d815b6-28de-4be3-bf3e-62c7457fad3d" alt=""><figcaption><p>Carácter escapado</p></figcaption></figure>

Por este motivo, cerramos la etiqueta `script` para insertar una nueva con la función `alert()`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FpJ1GT7XB92qaMyeVHdMc%2FPasted%20image%2020230211014547.png?alt=media&amp;token=d7afe129-f73b-4da5-b20e-074a3e361d85" alt=""><figcaption><p>Payload</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F4QvLFJ4ylUeM9tj8x5RF%2FPasted%20image%2020230211014609.png?alt=media&amp;token=e405bd52-b1c1-4cd3-8982-a296f1d190da" alt=""><figcaption><p>XSS</p></figcaption></figure>

## Reflected XSS en una cadena de JavaScript con paréntesis angulares y comillas dobles codificado en HTML y comillas simples escapadas

Validamos como el sitio procesa los caracteres enviados en la barra de búsqueda enviando el siguiente string `a'b"c/d\e:f;g-h`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FhD719LWkT1DvLOtkrrZo%2FPasted%20image%2020230216102842.png?alt=media&amp;token=e522db92-07df-4882-910b-baac95ca124c" alt=""><figcaption><p>Web Site</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2Fe81ICP6sXP3jnKgijydB%2FPasted%20image%2020230216103041.png?alt=media&amp;token=f99ecc5f-6cb8-4a6d-8482-4de73f1b3f80" alt=""><figcaption><p>Caracteres escapados</p></figcaption></figure>

Como se puede apreciar, las `'` son escapadas, mientras que, las `"` son codificadas usando HTML. Por este motivo, se manda un `\` para escapar el símbolo de escape, y así poder usar la comilla simple, además, se mandan dos `/` para generar un comentario al final de nuestro string de JavaScript. El payload enviado es `\-alert(1)//`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FSG75lAdu4jemlMnCNvsH%2FPasted%20image%2020230216103332.png?alt=media&amp;token=431a4267-0268-4500-92e1-caa4bc126859" alt=""><figcaption><p>Payload</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FSFwTZj1gRn1NjzEa0GBA%2FPasted%20image%2020230216103421.png?alt=media&amp;token=f8a44c41-bfca-4242-b819-a623cfe54b1e" alt=""><figcaption><p>XSS</p></figcaption></figure>

## Reflected XSS en un template literal con escape Unicode en angle brackets, comillas simples, dobles, backslash y backticks

Se ingresan los siguientes caracteres ``0`a'b"c/d\e:f;g-h{i}j$k<1>2`` 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%2FZ10EvYDlMOMrRU5CPOpk%2FPasted%20image%2020230216112118.png?alt=media&amp;token=02a1ad98-67fa-42f4-bbec-b90a03fcbbb7" alt=""><figcaption><p>Web Site</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FSYhgoWV4aOfBIg9BdWJb%2FPasted%20image%2020230216112518.png?alt=media&amp;token=65818919-10c6-47d4-915e-222b7237764d" alt=""><figcaption><p>Caracteres escapados</p></figcaption></figure>

Como no escapa los caracteres `$` y `{}`, podemos usar [templates literales](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Template_literals) enviando el siguiente payload `${alert(1)}`:

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2FN1SVVYN2l10c1eVUf0U2%2FPasted%20image%2020230216112653.png?alt=media&amp;token=f9770ed9-f496-4122-9190-b43a577ac33d" alt=""><figcaption><p>Payload</p></figcaption></figure>

<figure><img src="https://3346346775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9WPZWMj3VTydjWNPSBfA%2Fuploads%2F4I013RVIUUY6VLXQX7rb%2FPasted%20image%2020230216112712.png?alt=media&amp;token=ddbf1d09-45f5-443f-9c94-8b3532a6153f" alt=""><figcaption><p>XSS</p></figcaption></figure>
