¿Qué es el cross-site scripting?
El cross-site scripting, o XSS, es un fallo de una web. La web escribe en su página un texto ajeno sin escaparlo, y el navegador lo lee como código. Pasa en cuadros de búsqueda, comentarios y perfiles.
Importa porque ese código se ejecuta en el navegador de quien abre la página, con su sesión. Hoy aprenderás a evitarlo escapando los caracteres especiales.
Al terminar esta lección
Nota
Puedo reconocer un fallo de cross-site scripting y evitarlo escapando el texto.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| HTML | el lenguaje con el que se escribe una página web | |
| Etiqueta | una marca de HTML entre signos menor y mayor | <b> |
| Sesión | lo que recuerda quién eres mientras usas una web | |
| Cross-site scripting | un fallo que ejecuta código ajeno en la página de otro | |
| Escapar | cambiar un carácter especial por un código inofensivo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La regla de este laboratorio
Advertencia
Practica solo con la aplicación de tu copia privada, que no tiene salida a internet. Nunca pruebes un fallo en una web real: es un delito. Aprendemos cómo se escribe una página para que no se pueda romper así.
El navegador no sabe qué texto es código
Una página es HTML. Una etiqueta, como <b>, le dice al navegador que haga algo: poner negrita, mostrar una imagen o ejecutar código.
Si una web escribe en su página lo que tú tecleas, y tú tecleas una etiqueta, el navegador la obedece. Esa es la raíz del XSS: se mezclan datos y código.
Ejemplo resuelto: el mismo texto, dos páginas
| Texto escrito | Página sin escapar | Página escapada |
|---|---|---|
| Marta | Hola, Marta | Hola, Marta |
| <b>Marta</b> | Hola, Marta en negrita | Hola, <b>Marta</b> como texto |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Antes de empezar
Nota
Pulsa Iniciar el laboratorio en la barra superior y espera a que la máquina diga que está en marcha. Cada botón Ejecutar escribe su comando en el terminal. La aplicación se llama dvwa.
Pide la cabecera de la página de acceso
curl -sI http://dvwa/login.php | head -1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pide solo el código de respuesta
curl -s -o /dev/null -w "%{http_code}\n" http://dvwa/login.phpSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pide una página que no existe
curl -s -o /dev/null -w "%{http_code}\n" http://dvwa/nada.phpSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira cómo la página repite tu nombre
Pulsa Abrir en la barra del laboratorio y entra como admin con la clave password. En el menú elige el ejercicio de XSS reflejado.
Escribe solo un nombre normal, como Marta, y pulsa enviar. La página te saluda. Después pulsa Ctrl y U para ver el HTML: tu nombre está escrito dentro de la página.
Escapar cambia los caracteres peligrosos
La defensa es escapar el texto antes de escribirlo en la página. Escapar cambia cada carácter especial por un código que el navegador enseña como texto y no obedece.
El primero que hay que cambiar es &. Si no, el código de otro carácter se cambiaría dos veces.
Ejemplo resuelto: los cinco caracteres
| Carácter | Se escribe como | Por qué importa |
|---|---|---|
| & | & | Empieza un código; se cambia primero |
| < | < | Abre una etiqueta |
| > | > | Cierra una etiqueta |
| " | " | Cierra un valor entre comillas |
| ' | ' | Cierra un valor entre comillas simples |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un texto antes y después de escaparlo
texto = "<b>Marta</b>"
seguro = texto.replace("&", "&")
seguro = seguro.replace("<", "<")
seguro = seguro.replace(">", ">")
print(seguro)
# <b>Marta</b>Un error frecuente
Advertencia
Mucha gente cree que el XSS solo estropea la página del propio atacante. No es así: el código se ejecuta en el navegador de quien abre la página, con su sesión. Por eso se escapa siempre el texto ajeno cuando se escribe en una página.
Para ir más lejos: los niveles de DVWA
DVWA tiene una página de seguridad con varios niveles. En cada nivel el mismo ejercicio está protegido de otra forma.
Cuando hagas el trabajo del laboratorio, compara el nivel bajo con el alto. Anota qué hace el código del nivel alto con el texto que recibe.