¿La codificación HTML evitará todo tipo de ataques XSS?


No me preocupan otros tipos de ataques. Solo quiero saber si la codificación HTML puede prevenir todo tipo de ataques XSS.

¿Hay alguna forma de hacer un ataque XSS incluso si se usa codificación HTML?

Author: Niyaz, 2008-09-10

9 answers

No.

Dejando de lado el tema de permitir algunas etiquetas (no es realmente el punto de la pregunta), HtmlEncode simplemente NO cubre todos los ataques XSS.

Por ejemplo, considere javascript del lado del cliente generado por el servidor: el servidor genera dinámicamente valores htmlencoded directamente en el javascript del lado del cliente, htmlencode no detendrá la ejecución del script inyectado.

A continuación, considere el siguiente pseudocódigo:

<input value=<%= HtmlEncode(somevar) %> id=textbox>

Ahora, en caso de que no sea inmediatamente obvio, si somevar (enviado por el usuario, por supuesto) se establece por ejemplo a

a onclick=alert(document.cookie)

La salida resultante es

<input value=a onclick=alert(document.cookie) id=textbox>

Que claramente funcionaría. Obviamente, esto puede ser (casi) cualquier otro script... y HtmlEncode no ayudaría mucho.

Hay algunos vectores adicionales a considerar... incluye el tercer tipo de XSS, llamado XSS basado en DOM (en el que el script malicioso se genera dinámicamente en el cliente, por ejemplo, basado en valores#).

También no te olvides de Ataques de tipo UTF-7-donde el ataque parece

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

No hay mucho que codificar allí...

La solución, por supuesto (además de la validación de entrada de lista blanca adecuada y restrictiva), es realizar una codificación sensible al contexto: HtmlEncoding es excelente SI el contexto de salida ES HTML, o tal vez necesite JavaScriptEncoding, o VBScriptEncoding, o attributevaluueencoding, o... sucesivamente.

Si está usando MS ASP.NET, puede utilizar su biblioteca Anti-XSS, que proporciona todos los métodos de codificación de contexto necesarios.

Tenga en cuenta que toda la codificación no debe restringirse a la entrada del usuario, sino también a los valores almacenados de la base de datos, archivos de texto, etc.

Ah, y no se olvide de establecer explícitamente el conjunto de caracteres, tanto en el encabezado HTTP COMO en la etiqueta META, de lo contrario todavía tendrá vulnerabilidades UTF-7...

Un poco más de información, y una lista bastante definitiva (constantemente actualizada), echa un vistazo a la Hoja de trucos de RSnake: http://ha.ckers.org/xss.html

 86
Author: AviD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 07:57:39

Si codifica sistemáticamente toda la entrada del usuario antes de mostrar entonces sí, está seguro todavía no está 100% seguro.
(Ver el post de @Avid para más detalles)

Además, surgen problemas cuando necesita dejar que algunas etiquetas no estén codificadas para permitir que los usuarios publiquen imágenes o texto en negrita o cualquier característica que requiera la entrada del usuario se procese como (o se convierta a) marcado no codificado.

Tendrá que configurar un sistema de toma de decisiones para decidir qué etiquetas son permitidos y que no lo son, y siempre es posible que alguien encuentre una manera de dejar pasar una etiqueta no permitida.

Ayuda si sigues el consejo de Joel de Hacer que el Código Incorrecto Parezca Incorrecto o si tu lenguaje te ayuda advirtiendo/no compilando cuando estás emitiendo datos de usuario no procesados (escritura estática).

 9
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 09:44:34

Si codificas todo, lo hará. (dependiendo de su plataforma y la implementación de htmlencode) Pero cualquier aplicación web útil es tan compleja que es fácil olvidarse de revisar cada parte de ella. O tal vez un componente de tercera parte no es seguro. O tal vez alguna ruta de código que aunque hizo codificación no lo hizo por lo que se olvidó en otro lugar.

Así que es posible que desee comprobar las cosas en el lado de entrada también. Y es posible que desee comprobar las cosas que lee de la base de datos.

 3
Author: Mendelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-10 10:16:14

Como han mencionado todos los demás, estás a salvo siempre y cuando codifiques toda la entrada del usuario antes de mostrarla. Esto incluye todos los parámetros de solicitud y los datos recuperados de la base de datos que se pueden cambiar mediante la entrada del usuario.

Como mencionado por Pat a veces querrás mostrar algunas etiquetas, pero no todas. Una forma común de hacer esto es usar un lenguaje de marcado como Textile, Markdown , o BBCode. Sin embargo, incluso los lenguajes de marcado pueden ser vulnerable a XSS, solo ten cuidado.

# Markup example
[foo](javascript:alert\('bar'\);)

Si decide dejar pasar las etiquetas "seguras", le recomendaría encontrar alguna biblioteca existente para analizar y desinfectar su código antes de la salida. Hay muchos vectores XSS que tendría que detectar antes de que su desinfectante sea bastante seguro.

 1
Author: metavida,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:18

Secundo el consejo de metavida para encontrar una biblioteca de terceros para manejar el filtrado de salida. Neutralizar caracteres HTML es un buen enfoque para detener ataques XSS. Sin embargo, el código que usa para transformar metacaracteres puede ser vulnerable a ataques de evasión; por ejemplo, si no maneja adecuadamente Unicode e internacionalización.

Un error clásico simple que hacen los filtros de salida de homebrew es atrapar solo , pero perder cosas como", que puede romper la salida controlada por el usuario en el espacio de atributos de una etiqueta HTML, donde Javascript se puede adjuntar al DOM.

 1
Author: tqbf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-11 19:40:38

No, simplemente codificar tokens HTML comunes NO protege completamente su sitio de ataques XSS. Ver, por ejemplo, esta vulnerabilidad XSS se encuentra en google.com:

Http://www.securiteam.com/securitynews/6Z00L0AEUE.html

Lo importante de este tipo de vulnerabilidad es que el atacante es capaz de codificar su carga útil XSS usando UTF-7, y si no ha especificado una codificación de caracteres diferente en su página, el navegador de un usuario podría interpretar la carga útil UTF-7 y ejecuta el script de ataque.

 1
Author: Chris Kite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 16:19:14

Otra cosa que debe verificar es de dónde proviene su entrada. Puede utilizar la cadena de referencia (la mayoría de las veces) para comprobar que es de su propia página, pero poner un número aleatorio oculto o algo en su formulario y luego comprobarlo (con una variable de sesión establecida tal vez) también ayuda a saber que la entrada proviene de su propio sitio y no de algún sitio de phishing.

 0
Author: Mladen Mihajlovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 10:15:27

Me gustaría sugerir HTML Purifier (http://htmlpurifier.org/) no acaba de filtrar el html, que básicamente se acorta y re-compilación. Es verdaderamente industrial-fuerza.

Tiene la ventaja adicional de permitirle asegurar una salida html/xhtml válida.

También n'thing textile, es una gran herramienta y la uso todo el tiempo, pero también la ejecutaría a través de html purifier.

No creo que entendiste lo que quise decir re tokens. HTML Purifier no solo 'filtro', en realidad reconstruye el html. http://htmlpurifier.org/comparison.html

 0
Author: Buzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 15:06:14

No lo creo. Html Encode convierte todos los caracteres funcionales (caracteres que podrían ser interpretados por el navegador como código) en referencias de entidades que no pueden ser analizadas por el navegador y, por lo tanto, no pueden ser ejecutadas.

&lt;script/&gt;

No hay forma de que el navegador pueda ejecutar lo anterior.

**A menos que sea un error en el navegador, por supuesto.*

 -1
Author: GateKiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-10 10:14:47