Questo codice è vulnerabile a Reflected XSS?

4

Sto facendo un pentest e sono venuto da questo codice:

   (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);
        }
      })();

Aggiunge un file CSS all'intestazione per il rebranding.
L'URL di destinazione è simile a questo:
http://some.company.com/p1=test&css=custom
Abbiamo controllato il parametro subdomain qui che equivale a query o URL[0] .
query è il risultato di /[?&]css=([^&#]*)/i.exec(window.location.search); che equivale a custom in questo caso.
se query non è disponibile nell'URL, quindi URL[0] equivale a some qui, non posso pensare di fare nulla di utile usando URL[0] perché, per controllarne il valore, devo cambiare some a qualcos'altro che cambia completamente l'URL e punta ad un'altra pagina irrilevante.
In ogni caso, l'URL CSS finale sarebbe "/custom.css" o "/some.css" se il parametro CSS non è disponibile.
Ho provato alcuni payload per sfruttarlo ma tutti sono falliti.
Qualche idea se questo codice è vulnerabile e come può essere sfruttato?

    
posta Sam 10.09.2018 - 17:22
fonte

3 risposte

10

Sì, questo codice è vulnerabile, ma non a XSS. Il valore della variabile subdomain può essere effettivamente controllato da un utente malintenzionato, ma tale variabile viene utilizzata solo per impostare il parametro href di un foglio di stile CSS; che non accetta il codice JavaScript. Tuttavia, il controllo di questo valore consente comunque l'inserimento di CSS.

L'href del foglio di stile è preceduto da / , ma un utente malintenzionato può ancora puntarlo su una pagina arbitraria aggiungendo un'altra barra per formare un protocollo-relativo URL che punta al server dell'aggressore. (Ad esempio //evilsite.com/payload.css .) Ciò consentirebbe all'utente malintenzionato di ottenere il controllo completo dell'aspetto del sito, se non della sua funzionalità, che potrebbe essere utilizzato per indurre gli utenti a intraprendere azioni che altrimenti non avrebbero intrapreso. Ad esempio, aggiungi un banner che informa gli utenti di cui hanno bisogno per reimpostare la password, quindi adatta la pagina delle impostazioni utente per rendere il loro campo di descrizione del profilo pubblico come la casella di input per "password corrente".)

    
risposta data 10.09.2018 - 18:20
fonte
5

Any ideas if this code is vulnerable and how can it be exploited?

Come menzionato nei commenti, questo codice potrebbe essere vulnerabile all'iniezione CSS.

Ad esempio, se l'URL è simile a:

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

Quindi questa javascript creerà un nuovo collegamento nell'intestazione come:

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

Che è un URL valido (anche senza lo schema http / https), che può accedere al file CSS remoto.

    
risposta data 10.09.2018 - 18:19
fonte
1

È vulnerabile ma puoi risolverlo facilmente con la whitelist:

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
}
    
risposta data 11.09.2018 - 17:59
fonte

Leggi altre domande sui tag