¿Este código es vulnerable a Reflected XSS?

4

Estoy haciendo un pentest y obtuve este código:

   (function() {
        var subdomain = (function() {
          var query = /[?&]css=([^&#]*)/i.exec(window.location.search);
          if(query) {
            return query[1];
          }
          var URL = window.location.host.split('.');
          if (URL.length > 1) {
            return URL[0];
          }
        })();
        if (subdomain) {
          var link = document.createElement('link');
          link.rel = "stylesheet";
          link.href = "/" + subdomain + ".css";
          document.getElementsByTagName('head')[0].appendChild(link);
        }
      })();

Agrega un archivo CSS al encabezado de cambio de marca.
La URL de destino se ve así:
http://some.company.com/p1=test&css=custom
Aquí hemos controlado el parámetro subdomain que es igual a query o URL[0] .
query es el resultado de /[?&]css=([^&#]*)/i.exec(window.location.search); que es igual a custom en este caso.
Si query no está disponible en la URL, entonces URL[0] es igual a some aquí, no puedo pensar en hacer nada útil usando URL[0] porque, para controlar su valor, tengo que cambiar some a otra cosa que cambia completamente la URL y apunta a alguna otra página irrelevante.
De todos modos, la URL final de CSS sería "/custom.css" o "/some.css" si el parámetro CSS no está disponible.
Intenté algunas cargas útiles para explotar esto, pero todas fallaron.
¿Alguna idea de si este código es vulnerable y cómo puede ser explotado?

    
pregunta Sam 10.09.2018 - 17:22
fuente

3 respuestas

10

Sí, este código es vulnerable, pero no para XSS. El valor de la variable subdomain puede de hecho ser controlado por un atacante, pero esa variable solo se usa para establecer el parámetro href de una hoja de estilo CSS; que no acepta código JavaScript Sin embargo, controlar este valor todavía permite la inyección de CSS.

El href de la hoja de estilo tiene el prefijo / , pero un atacante aún puede apuntarlo a una página arbitraria agregando otra barra para formar un URL relativa al protocolo que apunta al servidor del atacante. (Por ejemplo, //evilsite.com/payload.css .) Esto le permitiría al atacante obtener un control completo sobre la apariencia del sitio, si no su funcionalidad, que podría usarse para engañar a los usuarios para que tomen acciones que de otra forma no tomarían. (Por ejemplo, agregue un banner que indique a los usuarios que necesitan restablecer su contraseña, luego aplique un estilo a la página de configuración del usuario para que su campo de descripción de perfil público se vea como el cuadro de entrada de la "contraseña actual".)

    
respondido por el Ajedi32 10.09.2018 - 18:20
fuente
5
  

¿Alguna idea si este código es vulnerable y cómo puede ser explotado?

Como se menciona en los comentarios, este código podría ser vulnerable a la inyección de CSS.

Por ejemplo, si la URL parece:

http://some.company.com/p1=test&css=/evil.com/more_evil

Luego, este javascript creará un nuevo enlace en el encabezado como:

link rel="stylesheet" href="//evil.com/more_evil.css"

Que es una URL válida (incluso sin el esquema http / https), que puede acceder al archivo CSS remoto.

    
respondido por el hft 10.09.2018 - 18:19
fuente
1

Es vulnerable, pero puede resolverlo fácilmente con la inclusión en la lista blanca:

var allowedBrands = ['brand1', 'brand2', 'brand3'],
    query = /[?&]css=([A-Za-z0-9]*)/i.exec(window.location.search);

if (query && allowedBrands.indexOf(query[1])) {
    return query[1];
} else {
    return allowedBrands[0]; // this is the default value
}
    
respondido por el Matías P. 11.09.2018 - 17:59
fuente

Lea otras preguntas en las etiquetas