¿Qué condiciones se deben dar para que el siguiente código sea vulnerable a XSS?
html:
<html>
<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
.
6 replies on “Implicancias de la codificación del documento – Parte 2”
Creo que es importante que la cabecera del documento indique que estamos trabajando en UTF-8.
Con estos 2 ejemplos que podéis probas, se puede ver la importancia:
alert('BUYACORP');";
$cadena = mb_convert_encoding($cadena, 'UTF-7');
echo htmlentities($cadena, ENT_COMPAT, 'UTF-8');
?>
alert('BUYACORP');";
$cadena = mb_convert_encoding($cadena, 'UTF-7');
echo htmlentities($cadena, ENT_COMPAT, 'UTF-8');
?>
En parte tienes razón, porque tiene que ver con los encodings, pero ¿cómo insertarías HTML en el código mostrado? ¿en qué casos funcionaría?
Quizás usando codificacion ascii a decimal??
cadena = alert(String.fromCharCode(66,85,89,65,67,79,82,80));
Si pones ese valor, el html resultante sería:
<head>
<title>Test</title>
</head>
<body>
alert(String.fromCharCode(66,85,89,65,67,79,82,80));
</body>
</html>
Como puedes ver, no representa ningún peligro ese valor.