Diventa Autore per CoreTech | Scopri di più
24/03/20 CoreTech Blog
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.
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:
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.
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);
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)
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);