
Доказательство концепции для аутентифицированной произвольной загрузки файла в Sitecore 10.3, позволяющая развернуть веб-шелл и выполнить удаленный код через функционал импорта языков.
Автор: Thomas Stern
Дата: 26/01-2023
Через функционал импорта языков можно загрузить произвольный файл. Этот файл может быть веб-шеллом, который позволит выполнять код на сервере.
Для тестирования этой уязвимости экземпляр Sitecore 10.3 был развернут на локальной машине через Docker. Эта уязвимость не тестировалась на предыдущих версиях Sitecore, но более ранние версии могут быть уязвимы для той же техники.
Хост: Windows 11 Запущен Docker for Desktop Sitecore 10.3
Поскольку это аутентифицированная уязвимость, требуются действительные учетные данные. Для этого тестового экземпляра использовались admin/b
Панель инструментов находится в панели управления Sitecore

Теперь выберите импорт языков

Начните с выбора "Обзор"

Затем выберите папку temp — она также будет местом назначения для шелла.

Код, использованный для тестирования, представляет собой простой веб-шелл, скачанный с https://github.com/tennc/webshell/blob/master/fuzzdb-webshell/asp/cmdasp.aspx. Примечание: было сделано небольшое изменение для запуска PowerShell вместо стандартного cmd.
Нажмите кнопку загрузки, выберите ваш шелл и нажмите "Далее"

Ваш шелл должен быть загружен

Начните с перехода к загруженному шеллу "https://sitename/temp/shell.aspx" После загрузки шелла становится возможным полное выполнение кода в системе

Код для загрузки языковых файлов должен проверять загружаемые файлы и разрешать только исполняемые файлы, такие как aspx, exe и т.д. Также языковые файлы должны загружаться только в каталог, который не допускает выполнения кода. Один из способов сделать это — добавить правило блокировки в web.config, как показано ниже. Обратите внимание: это заблокирует все запросы к указанным двум файлам.
<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>