¿Cuáles son las diferentes cargas útiles utilizadas para la vulnerabilidad de XSS? [cerrado]

1

Soy nuevo en el campo de la seguridad de la información. Estoy buscando vulnerabilidades XSS.

En XSS, la mayoría de ellos usan <script>alert('XSS')</script> payload para atacar sitios web.

En el caso de omitir los filtros XSS, es posible que codifiquen la carga útil y utilicen UpperCases <SCriPT> .

En una búsqueda reciente, he encontrado una carga útil diferente para XSS \";alert('XSS');// . ¿Por qué esta carga útil puede explotar el sitio web?

No puedo entender esta carga útil. ¿Alguien puede explicarme cómo funciona esto? ¿Hay alguna otra carga útil diferente utilizada para explotar los sitios web utilizando XSS? Si hay alguno, por favor, comparta la carga útil. ¿En qué casos se pueden utilizar las cargas útiles?

    
pregunta Bhuvanesh 15.07.2015 - 14:53
fuente

3 respuestas

2

Al observar solo esta carga útil, sin el resto del código, es probable que sea difícil de entender.

Digamos que hay un código JS y PHP en un sitio web:

<script>
var jsvar;
jsvar = "<?php echo $phpvar;?>";
</script> 

Lo que hace este código es que simplemente asigna una variable controlada por el usuario desde PHP a la variable JS jsvar. Si la variable PHP contiene el texto test , entonces la variable JS se convertirá en:

jsvar="test";

Si el usuario ingresara solo alert() en la variable PHP, la variable JS se convertiría en:

jsvar="alert()";

... que no causaría XSS porque alert () sería solo una cadena.

Pero si el usuario / atacante ingresa \";alert('XSS');// , el código JS se convertiría en:

jsvar = "";alert('XSS');//";

Aquí puede ver que el atacante ha asignado "" a la variable jsvar y, como siguiente comando, ha ingresado alert('XSS'); . El // al final es solo para comentar el resto de la línea. Y el signo de \ al principio de la carga útil fue solo para escapar del signo de " en PHP, de modo que se considera solo como texto en PHP.

    
respondido por el pineappleman 15.07.2015 - 15:28
fuente
1

Depende del contexto. Cuales son de 5 tipos básicos:

  1. 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)>

  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)"

  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)
  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)>

  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).

    
respondido por el Shritam Bhowmick 15.07.2015 - 19:43
fuente
0

Estaría ligeramente en desacuerdo con la respuesta de @pineapplemans.

Si usamos su código de ejemplo con la entrada del usuario:

<?php $phpvar = $_GET['f']; ?>
<script>
var jsvar;
jsvar = "<?php echo $phpvar;?>";
</script> 

Entonces la carga útil \";alert('XSS');// no se ejecutaría. Esto se debe a que la cadena de ataque no se encuentra directamente dentro del código PHP, por lo que no es necesario escapar. Más bien, el escape escapa al " , que se supone que cierra la cadena, lo que significa que la carga útil se interpretará como una cadena, no como un código JavaScript.

Una carga útil de trabajo para este ejemplo de código sería ";alert('XSS');// , sin el \ .

Escapando el escape

Supongo que la carga útil \";alert('XSS');// está destinada a situaciones en las que " se escapa como \" , pero \ en sí no se escapa.

El código de ejemplo sería el código anterior, con $phpvar = str_replace("\"", "\\"", $phpvar); insertado.

Esto le daría a un atacante jsvar = "\";alert('XSS');//"; , que se ejecutaría, ya que \ inyectado escapa al \ que se agrega para escapar al " inyectado.

    
respondido por el tim 15.07.2015 - 16:52
fuente

Lea otras preguntas en las etiquetas