اذهب إلى المحتوى
  • 0

منع Cross site scripting من الحدوث في الموقع؟

_Mehdi

السؤال

السلام عليكم

كيف يتم منع ثغرة ال(Cross site Scripting (XSS من الحدوث في الموقع بلغة السي شارب وهي موجودة فيه  في صفحة التعليقات بنوعية الStored xss في خانة التعليقات و الReflected xss في رابط الصفحة يحدث في  الQuery stringانا جربت هذا الكود في صفحة التعليقات

string Inputname = TextBox1.Text;

    string encodedinputname = Server.HtmlEncode(Inputname);

   lblname.Text= "Not allow to enter Code " + encodedinputname;
   string inputcom = TextBox2.Text;
   string encodedinputcom = Server.HtmlEncode(inputcom);

   lblcom.Text = "Not allow to enter Code " + encodedinputcom;

ولكن هذة الطريقة منعت فقط نوع Reflected xss والذي يدخل عبر Textbox فقط (اقصد لم تمنع الٌReflected Xss في حال حصل برابط الصفحة الذي حدث عبر Query String ) وايضا لم تمنع النوع الاخر Stored XSS لانها خزنت بقاعدة البيانات وعند عمل تحديث الصفحة او اعادة تنفيذها في حالة عملت الصفحة Loading ظهرت الثغرة ارجوكم احتاج كود سي شارب وليس تفعيل لبعض الخصائص

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 4

هل يمكنك كتابة الشيفرة الخاصة بالـ Query string؟ حتى أستطيع مساعدتك

أحد الحلول أن تنشئ تابع يقوم بعمل فلترة للقيم الخارجية الموجودة في رابط الصفحة والتي يتم تخزينها في قاعدة البيانات وتقوم باستدعاء هذا التابع عند كل عملية استعلام.

طريقة الفلترة تعتمد على إيجاد جميع القيم (النصوص) التي يمكن كتابتها لعمل الإختراق من نوع Reflected Xss بما فيها أسماء الجداول في قاعدة البيانات الخاصة بالموقع وجمل الاستعلام وشروطها.

 فيما يلي تابع يُرجع قائمة List من نوع String تحوي جميع القيم المحتملة لعمل Reflected Xss:

  private static List<string> blackList()
    {
        var result = new List<string>()
        {
            "where",
            "Step2_Process",
            "Step2_ProcessRoomRate",
            "Step2_ProcessRoom",
            "CurrencyRate",
            "TopDist",
            "UAction",
            "H_Book",
            "H_Amenity",
            "M_Hotel",
            "Agent",
            "H_Description",
            "AgentMove",
            "M_Room",
            "H_Destination",
            "H_Hotel",
            "Nationality",
            "M_DateRange",
            "Msg",
            "TempResult",
            "FROM master",
            "select",
            "select *",
            "drop",
            "update",
            "insert into",
            "delete from",
            "where",
            "/'",
            "'",
            "--",
            "1 OR 1=1",
            "1' OR '1'='1",
            "1'1",
            "1 EXEC SP_ (or EXEC XP_)",
            "1 AND 1=1",
            "1' AND 1=(SELECT COUNT(*) FROM",
            "1 AND USER_NAME() = 'dbo'",
            "\'; DESC",
            "1\'1", 
            "@@",
            "SELECT @@version",
            "SELECT user",
            "SELECT system_user",
            "northwind",
            "model",
            "msdb",
            "tempdb",
            "pubs",
            "EXEC",
            " sp_",
            "SELECT HOST_NAME()",
            "CREATE TABLE",
            "BULK INSERT",
            "DROP TABLE",
            "xp_cmdshell",
            "sysobjects",
            "dbo",
            "where",
            "select"
        };

        return result;
    }

بعد ذلك كتابة التابع  FilterText والذي يستخدم التابع blackList لفحص النص إن كان يحوي أي من تلك القيم كما في المثال التالي:

  public static String FiltterText(String text)
    {
        String tempText = text;
        bool isOk = true;
        foreach (string item in blackList())
        {
            if (text.ToLower().Contains(item.ToLower()))
            {
                int index = text.ToLower().IndexOf(item.ToLower());
                text = text.Remove(index, item.Length);
                isOk = false;
            }
        }
        if (!isOk)
        {
            RSecurity.logAction("SQL Fillter", "HZTR-000001", HttpContext.Current.Session[SessionStatic.UserName] + " try to hack with this sql: (" + tempText.Replace("'", "''") + ")", "", "", "", HttpContext.Current.Request.Url.AbsolutePath, RSecurity.LogAction_danger_activity, RSecurity.LogType_SQLHaker);
        }
        return text.Trim();
    }

أرجو أن أكون قد وُفقت في تقديم الحل.

بالتوفيق

تم التعديل في بواسطة Lujain
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 2

أخي الكريم بالنسبة للنوع Reflected وحسب ما هو واضح في الشيفرة الخاصة بك فالأمر بسيط فقط استخدم HtmlEncode أو UrlEncode لمنع أي سكربت أو مدخلات غير صحيحة قد تحدث في رابط الصفحة غبر Query String هكذا:

string x = Request.QueryString["id"] as string;
        if (x != null)
        {
            Response.Write(Server.HtmlEncode(x));
        }

- باستخدام UrlEncode:

protected void Page_Load(object sender, EventArgs e)
    {
        string destinationURL = "http://www.contoso.com/default.aspx?user=test";

        NextPage.NavigateUrl = "~/Finish?url=" + Server.UrlEncode(destinationURL);
    }    

أما بالنسبة للنوع Stored نعم ما شرحته في الجواب الأول هو عن النوع Stored حيث تقوم باستدعاء التابع FilterText عند استخدام أي من قيم المدخلات -التي تم إدخالها في الحقول- ضمن جمل الاستعلام الخاصة بقاعدة البيانات كما في المثال التالي:

 sql = "SELECT ID, AgentID, AgenBossID, CreationDate FROM  MyTable WHERE ID = " + ((FiltterText(txtID.Text) == "") ? "0" : FiltterText(txtID.Text));

 

تم التعديل في بواسطة Lujain
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 39 دقائق مضت قال java:

 

@javaهذا السطر فقط لأخزن عملية الاختراق التي قام بها المستخدم وهي من نوع SQLHaker

حيث RSecurity هو صنف class قمت بإنشاءه ويحوي على الدوال المسؤولة عن أمور الأمان في الموقع ومنها التابع logAction  الذي يسجل جميع العمليات التي تحدث على الموقع.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

اختي القديرة انا عامل الثغرة في الموقع من النوعين Reflected& Stored

حسب  اجابتك شرحتي فلترة لرابط الصفحة الذي يكون يحتوي النوع Reflected  وهذا النوع لايخزن بقاعدة البيانات وهذا كود الquery string المستخدم
       

 string x = Request.QueryString["id"] as string;
        if (x != null)
        {
            Response.Write(x);
        }

 اما النوع Stored  هو الذي يخزن في قاعدة البيانات هل يمكنني استخدام هذا الكود في اجابتكي لعمل فلترة للمدخلات في ال Textbox لمنع الStored xss وهل يمكنني اضافة رموز برمجية لتابع blackList مثلا كودات الجافا سكربت الذي يتم عبرها الحقن  للموقع انا اشكرك جدا لمساعدتي  وهذه صور توضح الثغرة في موقعي بالنوعين  واحتاج ان امنعها 

1.PNG

2.PNG

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 2/17/2016 at 01:30 قال Lujain:

ست @Lujain  ان امكن توضيح بسيط لهذا الفقرة من الكود السابق مالمقصود منه

 وخاصة هذه الشيفرة RSecurity.logAction

وشكرا لك 


 
        if (!isOk)
        {
            RSecurity.logAction("SQL Fillter", "HZTR-000001", HttpContext.Current.Session[SessionStatic.UserName] + " try to hack with this sql: (" + tempText.Replace("'", "''") + ")", "", "", "", HttpContext.Current.Request.Url.AbsolutePath, RSecurity.LogAction_danger_activity, RSecurity.LogType_SQLHaker);
        }
 

 

 

 
 
 

 

تم التعديل في بواسطة java
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...