El payload es el código JavaScript que queremos ejecutar en el navegador de otro usuario o como prueba para demostrar una vulnerabilidad en una página web.

El payload puede tener varias intenciones, desde sólo mostrar una alerta en una caja a probar que podemos ejecutar código JavaScript en la página del usuario para extraer información de la página o de la sesión del usuario.

Cómo se refleja el payload JavaScript en la web del objetivo, determina el payload que debes usar.


Nivel 1

Se te presenta un formulario pidiéndote que introduzcas tu nombre y una vez lo haces se te mostrará en una línea abajo, por ejemplo:

Perfecting Your Payload

Si ves el código fuente de la página verás tu nombre reflejado allí:

Perfecting Your Payload

En vez de introducir tu nombre vamos a introducir una alerta JavaScript: <script>alert('THM');</script>.

Ahora cuando hacemos click en subir, recibiremos un pop up de alerta. Con la string THM.

Perfecting Your Payload

Y el código fuente reflejará lo siguiente:

Perfecting Your Payload


Nivel 2

Como el primer nivel se nos pide que metamos un nombre, pero ahora ya no sale reflejado en el HTML de la misma manera, sino dentro de una etiqueta de input:

Perfecting Your Payload

Miramos el código fuente y vemos que aparece dentro del atributo "value":

Perfecting Your Payload

Si intentáramos meter aquí el mismo payload no funcionaría debido a que no se puede ejecutar desde dentro de una etiqueta de input, pero lo que podemos hacer es algo parecido a lo que hacemos en la SQL Injection, cerrar el atributo: "><script>alert('THM');</script>

Perfecting Your Payload

Si miramos el código fuente veremos cómo hemos modificado la página:

Perfecting Your Payload


Nivel 3

Se te muestra otro formulario para meter tu nombre, pero ahora se refleja dentro de una etiqueta de área de texto:

Perfecting Your Payload

Si miramos el código fuente vemos cómo está introducido:

Perfecting Your Payload

Debemos hacer algo muy parecido al nivel anterior, salir manualmente de la etiqueta: </textarea><script>alert('THM');</script>

Perfecting Your Payload

Si ahora miramos el código fuente:

Perfecting Your Payload


Nivel 4

Metiendo tu nombre en el formulario, verás cómo se refleja en la página. Parece similar, pero al inspeccionar la página, ves que tu nombre sale reflejado en algún código JavaScript.

Perfecting Your Payload

Perfecting Your Payload

Tendremos que escapar el comando de JavaScript actual para poder correr nuestro código, podemos hacer esto con el payload siguiente: ';alert('THM');//. EL ' cierra el campo especificando el nombre, ; termina el comando actual de JavaScript, luego viene nuestro comando, y luego // indica que lo que venga después será un comentario.

Perfecting Your Payload

Si miramos el código fuente:

Perfecting Your Payload


Nivel 5

Este nivel se ve igual que el nivel 1 y tu nombre también se refleja en el mismo sitio, pero si pruebas el payload <script>alert('THM');</script> no funcionará. Cuando vemos el código fuente sale lo siguiente:

Perfecting Your Payload

Vemos que se está filtrando la palabra "script". Para bypassear esto, introduciremos un payload que cuando se quite la palabra "script" quede "script" donde lo necesitamos, por ejemplo:

<sscriptcript>alert('THM');</sscriptcript>

Perfecting Your Payload

Si ahora miramos el código fuente:

Perfecting Your Payload


Nivel 6

Similar al nivel 2, donde teníamos que escapar de un atributo "value" de una etiqueta de input, podemos probar "><script>alert('THM');</script>, pero no parece funcionar. Miremos el código fuente:

Perfecting Your Payload

Vemos que está filtrando los símbolos < y >. Podemos aprovechar el atributo "onload" de la etiqueta "img". El evento "onload" ejecuta código de tu elección una vez la imagen especificada en el atributo "src" se haya cargado en la página.

Cambiemos el payload a esto: /images/cat.jpg" onload="alert('THM'); y miramos el código fuente:

Perfecting Your Payload

Perfecting Your Payload


Polyglots

Un polyglot XSS es una string de texto que puede escapar atributos, etiquetas y bypassear filtros de una sentada. Podrías haber usado el polyglot de aquí abajo en todos los 6 niveles que acabamos de ver y habría ejecutado el código exitosamente.

jaVasCript:/*-/*`/*\ `/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e