¿Qué condiciones se deben dar para que el siguiente código sea vulnerable a XSS?
<head>
<title>Test</title>
</head>
<body>
<?php echo htmlentities($_GET['mensaje'], ENT_COMPAT, 'utf-8'); ?>
</body>
</html>
Nota: la codificación del documento que contiene el código mostrado es UTF-8.
Actualización: Explotar el código mostrado
Se deben cumplir las siguientes condiciones para que la vulnerabilidad se haga evidente:
- El atacante envía como valor de la variable
mensaje
un texto en formato UTF-7 u otro. - El servidor web donde se aloja la página no envía una codificación por defecto (Ej. que no haya una directiva AddDefaultCharset en Apache)
- Que el navegador use la misma codificación que el texto enviado. En Firefox se debe cambiar manualmente, con lo cual se complica el ataque, sin embargo, si en Internet Explorer la selección automática de codificación está habilitada, entonces la página que contiene el código ya es vulnerable, caso contrario, estamos en el mismo caso que Firefox.
He puesto el código en http://test.buayacorp.com/xss.php para efectos de prueba (para ver el mensaje, usen IE con la mencionada opción habilitada - Ver->Codificación->Selección Automática
).
Solución
Poner de manera explícita la codificación adecuada, a través de cabeceras HTTP o del elemento meta
.