usan sirven que para navegador lista funcion eventos etiquetas etiqueta estructura enlazar ejemplo con como boton atributos php javascript html security xss

php - sirven - XSS: ¿Qué etiquetas HTML y atributos pueden activar Javascript Events?



lista de atributos html (4)

Es posible que desee comprobar estos 2 enlaces para una referencia adicional:

http://adamcecc.blogspot.com/2011/01/javascript.html (esto solo es aplicable cuando la entrada ''filtrada'' alguna vez se encontrará entre etiquetas de script en una página)

http://ha.ckers.org/xss.html (que tiene muchos desencadenantes de eventos específicos del navegador)

He usado HTML Purifier, como lo está haciendo, por esta razón también en combinación con un wysiwyg-editor. Lo que hice diferente es usar una lista blanca muy estricta con un par de etiquetas y atributos de marcado básicos disponibles y expandirla cuando surgiera la necesidad. Esto evita que te ataquen vectores muy oscuros (como el primer enlace de arriba) y puedes profundizar en la nueva etiqueta / atributo uno por uno.

Solo mis 2 centavos ..

Estoy intentando codificar un purificador de HTML basado en una lista blanca segura y liviana que usará DOMDocument. Para evitar una complejidad innecesaria, estoy dispuesto a hacer los siguientes compromisos:

  • Los comentarios HTML se eliminan
  • script etiquetas de script y de style se eliminan todas juntas
  • solo los nodos secundarios de la etiqueta body serán devueltos
  • todos los atributos HTML que pueden desencadenar eventos Javascript serán validados o eliminados

He estado leyendo mucho sobre los ataques XSS y la prevención, y espero no ser demasiado ingenuo (si lo soy, por favor, hágamelo saber) al asumir que si sigo todas las reglas que mencioné anteriormente, estaré a salvo de XSS.

El problema es que no estoy seguro de qué otras etiquetas y atributos (en cualquier versión de HTML [X] y / o versiones de navegador / implementaciones) pueden desencadenar eventos de Javascript, además de los atributos de evento de JavaScript predeterminados :

  • onAbort
  • onBlur
  • onChange
  • onClick
  • onDblClick
  • onDragDrop
  • onError
  • onFocus
  • onKeyDown
  • onKeyPress
  • onKeyUp
  • onLoad
  • onMouseDown
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
  • onMove
  • onReset
  • onResize
  • onSelect
  • onSubmit
  • onUnload

¿Hay algún otro atributo de evento no predeterminado o propietario que pueda desencadenar eventos JavaScript o VBScript, etc ... o la ejecución de código? Puedo pensar en href , style y action , por ejemplo:

<a href="javascript:alert(document.location);">XSS</a> // or <b style="width: expression(alert(document.location));">XSS</b> // or <form action="javascript:alert(document.location);"><input type="submit" /></form>

Probablemente elimine cualquier atributo de style en las etiquetas HTML, los atributos de action y href suponen un desafío mayor, pero creo que el siguiente código es suficiente para asegurarse de que su valor sea una URL relativa o absoluta y no un desagradable código JavaScript:

$value = $attribute->value; if ((strpos($value, '':'') !== false) && (preg_match(''~^(?:(?:s?f|ht)tps?|mailto):~i'', $value) == 0)) { $node->removeAttributeNode($attribute); }

Entonces, mis dos preguntas obvias son:

  1. ¿Me faltan etiquetas o atributos que puedan desencadenar eventos?
  2. ¿Hay algún vector de ataque que no esté cubierto por estas reglas?

Después de muchas pruebas, reflexiones e investigaciones, he llegado a la siguiente implementación (bastante simple) que, al parecer, es inmune a cualquier vector de ataque XSS que pueda lanzar.

Aprecio mucho todas sus valiosas respuestas, gracias.


Garuda ya ha dado lo que yo considero la respuesta "correcta", y sus enlaces son muy útiles, ¡pero él me golpeó hasta el golpe!

Doy mi respuesta solo para reforzar.

En este día y época de aumentar las características en las especificaciones html y ecmascript, evitar la inyección de scripts y otras vulnerabilidades similares en html se vuelve cada vez más difícil. Con cada nueva adición, se introduce todo un mundo de posibles inyecciones. Esto se combina con el hecho de que diferentes navegadores probablemente tengan diferentes ideas de cómo van a implementar estas especificaciones, por lo que se obtienen aún más vulnerabilidades posibles.

Echa un vistazo a una breve lista de vectores introducidos por html 5

La mejor solución es elegir lo que permitirá en lugar de lo que negará. Es mucho más fácil decir: "Estas etiquetas y estos atributos solo están permitidos para esas etiquetas. Todo lo demás se desinfectará en consecuencia o se descartará".

Sería muy irresponsable para mí compilar una lista y decir "está bien, aquí tienes: aquí hay una lista de todos los vectores de inyección que te perdiste. Puedes dormir tranquilo". De hecho, probablemente haya muchos vectores de inyección que ni siquiera se conocen con sombreros negros o sombreros blancos. Como dice el sitio web de hackers, la inyección de scripts está realmente limitada por la mente.

Me gustaría responder a su pregunta específica al menos un poco, así que aquí hay algunas omisiones flagrantes de su lista negra:

  • atributo img src . Creo que es importante tener en cuenta que src es un atributo válido en otros elementos y podría ser potencialmente dañino. img también dynsrc y lowsrc , tal vez incluso más.
  • atributos de type e language
  • CDATA además de solo comentarios html.
  • Valores de entrada incorrectamente desinfectados. Esto puede no ser un problema dependiendo de qué tan estricto sea su análisis html.
  • Cualquier personaje especial ambiguo. En mi opinión, incluso los no ambiguos probablemente deberían estar codificados.
  • Frases faltantes o incorrectas sobre los atributos (como citas graves).
  • Cierre prematuro de etiquetas textarea.
  • UTF-8 (y 7) caracteres codificados en scripts
  • Aunque solo devolverá nodos secundarios de la etiqueta corporal, muchos navegadores aún evaluarán la head y los elementos html dentro del body , y la mayoría de los elementos head elementos dentro del body todos modos, por lo que probablemente no ayude demasiado.
  • Además de expresiones css, expresiones de imágenes de fondo
  • frame e iframe
  • embed y probablemente object y applet
  • El lado del servidor incluye
  • Etiquetas PHP
  • Cualquier otra inyección (Inyección SQL, inyección ejecutable, etc.)

Por cierto, estoy seguro de que esto no tiene importancia, pero los atributos camelCased no son válidos xhtml y deberían tener una carcasa inferior. Estoy seguro de que esto no te afecta.


Mencionas href y action como lugares javascript: URL pueden aparecer, pero te falta el atributo src entre muchos otros atributos de carga de URL.

La línea 399 de OWASP Java HTMLPolicyBuilder es la definición de los atributos de URL en un desinfectante HTML de lista blanca.

private static final Set<String> URL_ATTRIBUTE_NAMES = ImmutableSet.of( "action", "archive", "background", "cite", "classid", "codebase", "data", "dsync", "formaction", "href", "icon", "longdesc", "manifest", "poster", "profile", "src", "usemap");

El índice HTML5 contiene un resumen de los tipos de atributos. No menciona algunas cosas condicionales como <input type=URL value=...> pero si escanea esa lista para obtener una URL válida y amigos, debe tener una idea decente de lo que HTML5 agrega. El conjunto de atributos HTML 4 con tipo %URI también es informativo.

Su lista blanca de protocolo es muy similar a la del sanitizador OWASP . La adición de ftp y sftp parece lo suficientemente inocuo.

Una buena fuente de información de esquema relacionada con la seguridad para elementos y atributos HTML son las listas blancas de Caja JSON que utiliza el sanitizador HTML de Caja JS .

¿Cómo planeas renderizar el DOM resultante? Si no tiene cuidado, incluso si elimina todos los elementos de <script> , un atacante podría obtener un procesador de errores para producir contenido que un navegador interpreta que contiene un elemento <script> . Considere el HTML válido que no contiene un elemento de script.

<textarea><&#47;textarea><script>alert(1337)</script></textarea>

Un procesador con fallas puede generar el contenido de esto como:

<textarea></textarea><script>alert(1337)</script></textarea>

que contiene un elemento script.

(Divulgación completa: escribí trozos de ambos sanitizadores HTML mencionados anteriormente).