Depende del contexto. Cuales son de 5 tipos básicos:
- contexto HTML
En el cuerpo de una etiqueta HTML existente o al principio y al final de la página fuera de la etiqueta.
<some_html_tag> user_input </some_html_tag>
En este contexto, puede ingresar cualquier tipo de HTML válido en la entrada del usuario y el navegador lo procesará de inmediato, es un contexto ejecutable.
Por ejemplo: <img src=x onerror=alert(1)>
- Contexto del nombre del atributo
Dentro de la etiqueta HTML de apertura, después del nombre de la etiqueta o después de un valor de atributo.
<some_html_tag user_input some_attribute_name="some_attribute_value"/>
En este contexto, puede ingresar el nombre del controlador de eventos y el código JavaScript después de un símbolo = y podemos ejecutar código, se puede considerar como un contexto ejecutable.
Por ejemplo: onclick="alert(1)"
- Contexto del valor del atributo
Dentro de la etiqueta HTML de apertura, después de un nombre de atributo separado por un símbolo =.
<some_html_tag some_attribute_name="user_input" />
<some_html_tag some_attribute_name='user_input' />
<some_html_tag some_attribute_name=user_input />
Hay tres variaciones de este contexto:
- Atributo doble comilla
- Único atributo de cotización
- Citar menos atributo
La ejecución del código en este contexto dependerá del tipo de atributo en el que aparezca la entrada. Hay diferentes tipos de atributos:
a) Atributos del evento
Estos son atributos como onclick, onload, etc. y los valores de estos atributos se ejecutan como JavaScript. Así que cualquier cosa aquí es lo mismo que el contexto de JavaScript.
b) Atributos de URL
Estos son atributos que toman la URL como un valor, por ejemplo, el atributo src de diferentes etiquetas. La introducción de una URL de JavaScript aquí podría llevar a la ejecución de JavaScript
Por ejemplo: javascript:some_javascript()
c) Atributos de URL especiales
Estos son atributos de URL en los que ingresar una URL normal puede provocar problemas de seguridad.
Algunos ejemplos son:
<script src="user_input"
<iframe src="user_input"
<frame src="user_input"
<link href="user_input"
<object data="user_input"
<embed src="user_input"
<form action="user_input"
<button formaction="user_input"
<base href="user_input"
<a href="user_input"
Ingresar solo una URL http o https absoluta en estos casos podría afectar la seguridad del sitio web. En algunos casos, si es posible cargar datos controlados por el usuario en el servidor, entonces incluso ingresar URLs relativas aquí podría llevar a un problema. Es posible que algunos sitios eliminen http: // y https: // de los valores ingresados en estos atributos para evitar que se ingresen las URL absolutas, pero hay muchas maneras de especificar una URL absoluta.
d) atributos de etiqueta META
Las etiquetas meta como Charset pueden influir en la forma en que el navegador interpreta los contenidos de la página. Y luego está el atributo http-equiv, que puede emular el comportamiento de los encabezados de respuesta HTTP. Influir en los valores de los encabezados como Content-Type, Set-Cookie, etc. tendrá un impacto en la seguridad de la página.
e) Atributos normales
Si la entrada aparece en un valor de atributo normal, este contexto debe escaparse para llevar a la ejecución del código. Si se cita el atributo, se debe utilizar la cita correspondiente para escapar del contexto. En caso de atributos sin comillas, el espacio o la barra invertida deben hacer el trabajo. Una vez fuera de este contexto, se puede agregar un nuevo controlador de eventos para llevar a la ejecución del código.
Por ejemplo:
" onclick=alert(1)
' onclick=alert(1)
onclick=alert(1)
- Contexto de comentarios HTML
Dentro de la sección de comentarios de HTML
<!-- some_comment user_input some_comment -->
Este es un contexto no ejecutable y se requiere que salga de este contexto para ejecutar el código. Ingresando un - > Terminaría este contexto y cambiaría cualquier texto posterior al contexto HTML.
Por ejemplo: --><img src=x onerror=alert(1)>
- Contexto de JavaScript
Dentro de las porciones de código JavaScript de la página.
<script>
some_javascript
user_input
some_javascript
</script>
Esto se aplica a la sección incluida en las etiquetas SCRIPT, en los valores de los atributos del controlador de eventos y en las URL que preceden a javascript:.
La entrada de usuario de JavaScript interna podría aparecer en los siguientes contextos:
a) Contexto del código
b) Contexto de cadena entre comillas simples
c) Contexto de cadena entre comillas dobles
d) contexto de comentario de una sola línea
e) contexto de comentarios multilínea
f) Cadenas asignadas a Fregaderos Ejecutables
Si la entrada del usuario es entre etiquetas SCRIPT, no importa en qué contextos anteriores aparezca, puede cambiar al contexto HTML simplemente incluyendo una etiqueta SCRIPT de cierre y luego insertar cualquier HTML.
Por ejemplo: </script><img src=x onerror=alert(1)>
Otros miscelleneous son VBScript y CSS contextos que no son muy utilizados. Pero estos podrían ser utilizados por scripts conscientes del contexto (escáneres, tanto estáticos como dinámicos) para detectar posibles XSS (utilizados en Burp Engine).