El otro
día cotilleando los últimos tweets de Rober, vi que había empezado a publicar algún artículo sobre filtros básicos de XSS muy interesantes, y me invitó
escribir una entrada sobre XSS, así que aquí está mi granito de arena.
Vamos con la cuarta entrega de los filtros básicos de XSS.
En PHP
existente algunas funciones que podemos utilizar para prevenir en cierta medida
los ataques XSS.
En general muchas webs suele recomendar la función htmlentities, cuya salida es la conversión de los caracteres de entrada en entidades HTML. Esta función no es la panacea de todos los ataques XSS, simplemente es un pequeño filtro muy básico.
En general muchas webs suele recomendar la función htmlentities, cuya salida es la conversión de los caracteres de entrada en entidades HTML. Esta función no es la panacea de todos los ataques XSS, simplemente es un pequeño filtro muy básico.
Por
defecto la función tiene activado la flag ENT_COMPAT la cual convertirá las
comillas dobles y solo deja las comillas sencillas. Tal vez este pequeño filtro
sea un problema para mucha gente pero sigue siendo vulnerable.
Supongamos que tenemos el siguiente código.
- <?php echo "<img alt='Perfil' src='".htmlentities($_GET["img"])."' />"; ?>
Como ya
sabemos no podemos utilizar comillas dobles, pero sí comillas simples así que vamos a evadir el
filtro aprovechándonos de ellas.
www.webvulnerable.com/miperfil?img= .'onerror='alert(1)
El
resultado es la ejecución del alert(1) sin problemas.
- <img alt=’Perfil’ src=’.’ onerror=’alert(1)’/>
Primero
introducimos el punto para forzar un error en el parámetro src que recibe la
ruta de la imagen, luego utilizamos el evento de javascript onerror (se ejecuta
cuando hay un error en la ruta de la imagen) para lanzar nuestro alert(1) sin
problemas.
Finalmente
para evitar estos problemas debemos utilizar htmlentities pero con la flag
ENT_QUOTES que convertirá tanto las comillas dobles como las simples.
- <?php echo "<img alt='Perfil' src='".htmlentities($_GET["img"], ENT_QUOTES)."' />"; ?>
Recordar
siempre filtrar los datos de entrada del usuario y de salida, tanto en el lado
del cliente como en el lado del servidor.
Por si quereis más información aquí os dejo un whitepaper con 16 ejercicios resueltos y explicados sobre filtros XSS que publiqué junt con Pepe Vila (@vgvwzq) "Alert(1) To Win!"
Por si quereis más información aquí os dejo un whitepaper con 16 ejercicios resueltos y explicados sobre filtros XSS que publiqué junt con Pepe Vila (@vgvwzq) "Alert(1) To Win!"
Espero que
os haya servido de ayuda la entrada y recordar que esto es con
fines educativos, no para andar tirando scripts por ahí a lo loco.
Un saludo,
Daniel (@DaniLabs)