¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cross-site scripting (XSS) y cómo evitarlo

Después de esta lección: Puedo reconocer un fallo de cross-site scripting y evitarlo escapando el texto.

Lección de 45 min3 comandosLaboratorio de DVWA: practica inyección SQL y XSS en la Damn Vulnerable Web Application

¿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

PalabraQué significaEjemplo
HTMLel lenguaje con el que se escribe una página web
Etiquetauna marca de HTML entre signos menor y mayor<b>
Sesiónlo que recuerda quién eres mientras usas una web
Cross-site scriptingun fallo que ejecuta código ajeno en la página de otro
Escaparcambiar 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 escritoPágina sin escaparPágina escapada
MartaHola, MartaHola, Marta
<b>Marta</b>Hola, Marta en negritaHola, <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

Comando
curl -sI http://dvwa/login.php | head -1

Se 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

Comando
curl -s -o /dev/null -w "%{http_code}\n" http://dvwa/login.php

Se 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

Comando
curl -s -o /dev/null -w "%{http_code}\n" http://dvwa/nada.php

Se 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ácterSe escribe comoPor qué importa
&&amp;Empieza un código; se cambia primero
<&lt;Abre una etiqueta
>&gt;Cierra una etiqueta
"&quot;Cierra un valor entre comillas
'&#x27;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

Código: python
texto = "<b>Marta</b>"
seguro = texto.replace("&", "&amp;")
seguro = seguro.replace("<", "&lt;")
seguro = seguro.replace(">", "&gt;")
print(seguro)
# &lt;b&gt;Marta&lt;/b&gt;

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.

Sobre este laboratorio y su código: Laboratorio de DVWA: practica inyección SQL y XSS en la Damn Vulnerable Web Application

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.