
Prova de conceito para upload arbitrário de arquivo autenticado no Sitecore 10.3, permitindo implantação de webshell e execução remota de código via funcionalidade de importação de idiomas.
Autor: Thomas Stern
Data: 26/01-2023
É possível, através da funcionalidade de importação de idiomas, fazer upload de um arquivo arbitrário. Este arquivo pode ser um webshell que permitiria a execução de código no servidor.
Para testar essa vulnerabilidade, uma instância do Sitecore 10.3 foi iniciada em uma máquina local através do Docker. Esta vulnerabilidade não foi testada em versões anteriores do Sitecore, mas versões mais antigas podem ser vulneráveis à mesma técnica.
Host: Windows 11 Executando Docker for Desktop Sitecore 10.3
Como esta é uma vulnerabilidade autenticada, é necessário um conjunto válido de credenciais. Para esta instância de teste, foi usado admin/b
A caixa de ferramentas é encontrada no painel de controle do Sitecore

Agora escolha importar idiomas

Comece escolhendo Procurar

Em seguida, selecione a pasta temporária 'esta também será o destino do shell.

O código usado para teste é um webshell simples baixado de https://github.com/tennc/webshell/blob/master/fuzzdb-webshell/asp/cmdasp.aspx. Observe que uma pequena modificação foi feita para executar o PowerShell em vez do cmd padrão.
Escolha o botão de upload, selecione seu shell e pressione próximo

Seu shell agora deve estar carregado

Comece navegando para o shell carregado "https://sitename/temp/shell.aspx" Com o shell carregado, agora é possível ter execução total de código no sistema

O código para fazer upload dos arquivos de idioma deve validar os arquivos sendo enviados e permitir apenas arquivos executáveis como aspx, exe e outros. Além disso, os arquivos de idioma devem ser carregados apenas em um diretório que não permita execução de código. Uma maneira de fazer isso é adicionar uma regra de bloqueio ao web.config como abaixo. Observe que isso bloqueará todas as solicitações para os dois arquivos.
<rule name="BlockFileUpload" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions logicalGrouping="MatchAny">
<add input="{URL}" pattern="*sitecore/shell/Applications/Files/FileBrowser.aspx" />
<add input="{URL}" pattern="*sitecore/shell/Applications/Dialogs/Upload/Upload2.aspx" />
</conditions>
<action type="CustomResponse" statusCode="404" statusReason="File or directory not found." statusDescription="The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable." />
</rule>