1. نظرة عامة
في العامين الماضيين، ينبغي لخبراء الأمن إيلاء المزيد من الاهتمام للهجمات على طبقة تطبيقات الشبكة. لأنه بغض النظر عن مدى قوة قواعد جدار الحماية لديك أو مدى اجتهادك في تصحيحها، إذا لم يتبع مطورو تطبيقات الويب تعليمات برمجية آمنة، فسيدخل المهاجمون إلى نظامك عبر المنفذ 80. أسلوبا الهجوم الرئيسيان المستخدمان على نطاق واسع هما هجمات حقن SQL [ref1] وهجمات CSS [ref2]. يشير حقن SQL إلى تقنية إدراج أحرف SQL الوصفية (أحرف خاصة تمثل بعض البيانات) والتعليمات من خلال منطقة إدخال الإنترنت لمعالجة تنفيذ استعلامات SQL الخلفية. تستهدف هذه الهجمات بشكل أساسي خوادم الويب الخاصة بالمؤسسات الأخرى. تضمن هجمات CSS تشغيل تعليمات Javascript البرمجية الضارة على جهاز الضحية عن طريق إدراج علامات البرامج النصية في عناوين URL ثم إقناع المستخدمين الذين يثقون بها بالنقر عليها. تستفيد هذه الهجمات من علاقة الثقة بين المستخدم والخادم. في الواقع، لا يكتشف الخادم المدخلات والمخرجات، وبالتالي لا يرفض كود JavaScript.
تتناول هذه المقالة تقنيات الكشف عن الثغرات الأمنية الخاصة بحقن SQL وهجوم CSS. لقد كان هناك الكثير من النقاش على الإنترنت حول هذين النوعين من الهجمات المستندة إلى الويب، مثل كيفية تنفيذ الهجمات وتأثيرها وكيفية إعداد وتصميم البرامج بشكل أفضل لمنع هذه الهجمات. ومع ذلك، لا توجد مناقشة كافية حول كيفية اكتشاف هذه الهجمات. نحن نستخدم المصدر المفتوح الشهير IDS Snort [المرجع 3] لصياغة التعبيرات العادية بناءً على قواعد اكتشاف هذه الهجمات. وبالمناسبة، تتضمن إعدادات القاعدة الافتراضية لـ Snort طرقًا لاكتشاف CSS، ولكن يمكن تجنبها بسهولة. على سبيل المثال، تستخدم معظمها ترميزًا سداسيًا عشريًا، مثل %3C%73%63%72%69%70% 74%3E بدلاً من <script> لتجنب اكتشافها.
اعتمادا على قدرات المنظمة على مستوى جنون العظمة، قمنا بكتابة قواعد متعددة للكشف عن نفس الهجوم. إذا كنت ترغب في اكتشاف جميع هجمات حقن SQL المحتملة، فأنت بحاجة ببساطة إلى الانتباه إلى أي أحرف تعريف SQL موجودة، مثل علامات الاقتباس المفردة والفواصل المنقوطة والشرطات المزدوجة. هناك طريقة أخرى متطرفة لاكتشاف هجمات CSS وهي ببساطة الانتباه إلى الأقواس الزاوية في علامات HTML. ولكن هذا سوف يكشف الكثير من الأخطاء. لتجنب ذلك، يجب تعديل القواعد لجعل اكتشافها أكثر دقة، مع عدم تجنب الأخطاء.
استخدم الكلمة الأساسية pcre (التعبيرات العادية المتوافقة مع Perl) [المرجع 4] في قواعد Snort، ويمكن تنفيذ كل قاعدة مع أو بدون إجراءات القاعدة الأخرى. يمكن أيضًا استخدام هذه القواعد بواسطة البرامج العامة مثل grep (أداة بحث عن المستندات) لمراجعة سجلات خادم الشبكة. ومع ذلك، يجب أن تكون حذرًا من أن خادم الويب سوف يسجل مدخلات المستخدم في اليوميات فقط عندما يتم إرسال الطلب كـ GET. إذا تم إرسال الطلب كـ POST، فلن يتم تسجيله في اليوميات.
2. التعبيرات العادية لحقن SQL
عند اختيار تعبير عادي لهجوم حقن SQL، من المهم أن تتذكر أنه يمكن للمهاجم إجراء حقن SQL عن طريق إرسال نموذج، أو من خلال حقل ملف تعريف الارتباط. يجب أن يأخذ منطق اكتشاف المدخلات في الاعتبار أنواعًا مختلفة من المدخلات التي ينظمها المستخدم (مثل معلومات النموذج أو ملف تعريف الارتباط). وإذا وجدت الكثير من التحذيرات الواردة من إحدى القواعد، فراقب علامات الاقتباس المفردة أو الفواصل المنقوطة، حيث قد تكون هذه الأحرف مدخلات صالحة في ملفات تعريف الارتباط التي أنشأها تطبيق الويب الخاص بك. لذلك، تحتاج إلى تقييم كل قاعدة مقابل تطبيق الويب الخاص بك.
كما ذكرنا سابقًا، يجب أن ينتبه التعبير العادي التفصيلي للكشف عن هجمات حقن SQL إلى الأحرف الوصفية الخاصة لـ SQL، مثل علامات الاقتباس المفردة (') وعلامات التوسيع المزدوجة (--)، وذلك لمعرفة هذه الأحرف وخصائصها. رقم مكافئ سداسي عشري، تنطبق التعبيرات العادية التالية:
2.1 التعبيرات العادية للكشف عن أحرف تعريف SQL
/(%27)|(')|(--)|(%23)|(#)/ix
:
نتحقق أولاً من العلامة السداسية لمكافئ الاقتباس المفرد، أو الاقتباس المفرد نفسه أو المزدوج علامة التوسع . هذه هي أحرف MS SQL Server أو Oracle، مما يشير إلى أن ما يلي عبارة عن تعليقات، وسيتم تجاهل جميع التعليقات اللاحقة. بالإضافة إلى ذلك، إذا كنت تستخدم MySQL، فأنت بحاجة إلى الانتباه إلى ظهور "#" وما يعادله من ست عشريات. لاحظ أننا لا نحتاج إلى التحقق من الرقم السداسي لمكافئ الشرطة المزدوجة، نظرًا لأن هذا ليس حرفًا تعريفيًا بتنسيق HTML ولن يتم ترميزه بواسطة المتصفح. وأيضًا، إذا تمكن أحد المهاجمين من تعديل الشرطة المزدوجة يدويًا إلى قيمتها السداسية %2D (باستخدام وكيل مثل Achilles [المرجع 5])، فسوف يفشل إدخال SQL.
قاعدة Snort الجديدة المضافة إلى التعبير العادي أعلاه هي كما يلي:
تنبيه tcp $EXTERNAL_NET Any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL حقن - Paranoid";flow:to_server,installed;uricontent:".pl";pcre:
"/ (%27)|(')|(--
)|(%23)|(#)/i";
هذه المقالة في المناقشة، قيمة الكلمة الأساسية uricontent هي ".pl" لأنه في بيئة الاختبار الخاصة بنا، تتم كتابة برنامج CGI بلغة Perl. تعتمد قيمة الكلمة الأساسية uricontent على تطبيقك المحدد. قد تكون هذه القيمة ".php" أو ".asp" أو ".jsp" وما إلى ذلك. ومن وجهة النظر هذه، فإننا لا نعرض قواعد Snort المقابلة، لكننا سنقدم التعبيرات العادية التي تنشئ هذه القواعد. يمكنك بسهولة إنشاء العديد من قواعد Snort من خلال هذه التعبيرات العادية، اكتشفنا شرطات مزدوجة لأنه قد تكون هناك نقاط حقن SQL حتى لو لم تكن هناك علامات اقتباس مفردة [المرجع 6]. على سبيل المثال، يحتوي إدخال استعلام SQL على قيم رقمية فقط، كما يلي:
حدد value1، value2، num_value3 من قاعدة البيانات
حيث num_value3=some_user_supplied_number
في هذه الحالة، يمكن للمهاجم تنفيذ استعلامات SQL إضافية. يرسل العرض التوضيحي الإدخال التالي:
3
؛
تجاهل على التوالي. يمكن أيضًا توسيع القواعد المذكورة أعلاه للتحقق من وجود الفواصل المنقوطة. ومع ذلك، قد تكون الفاصلة المنقوطة جزءًا من استجابة HTTP عادية. من أجل تقليل هذا الخطأ، ومنع أي حدوث طبيعي لعلامات الاقتباس المفردة وعلامات التوسيع المزدوجة، يجب تعديل القواعد المذكورة أعلاه لاكتشاف وجود علامات = أولاً. سوف يستجيب إدخال المستخدم لطلب GET أو POST بشكل عام، يتم إرسال الإدخال على النحو التالي:
username=some_user_supplied_value&password=some_user_supplied_value
لذلك، ستؤدي محاولات إدخال SQL إلى ظهور إدخال المستخدم بعد علامة = أو قيمتها السداسية المكافئة.
2.2 قم بتصحيح التعبير العادي لاكتشاف أحرف SQL التعريفية
/((%3D)|(=))[^n]*((%27)|(')|(--)|( %3B)|(:))/i
توضيح:
تهتم هذه القاعدة أولاً بالعلامة = أو قيمتها السداسية (%3D)، ثم تأخذ في الاعتبار الصفر أو أكثر لأي أحرف باستثناء الأسطر الجديدة، وأخيرًا تكتشف علامات الاقتباس المفردة والشرطات المزدوجة أو فاصلة منقوطة.
سيحاول حقن SQL النموذجي معالجة الاستعلام الأصلي حول استخدام علامات الاقتباس المفردة للحصول على قيمة مفيدة. تتم مناقشة هذا الهجوم عمومًا باستخدام السلسلة 1'or'1'='1، ومع ذلك، يمكن بسهولة تجنب اكتشاف هذه السلسلة، مثل استخدام 1'or2>1 -- الحرف الأول، اتبع اقتباسًا واحدًا وأضف "أو". قد يختلف المنطق المنطقي التالي عبر مجموعة من الأنماط، من العادي إلى المعقد للغاية. يمكن اكتشاف هذه الهجمات بدقة تامة باستخدام التعبير العادي التالي. يوضح الفصل 2.3.
2.3 التعبير العادي لهجوم حقن SQL النموذجي
/w*((%27)|('))((%6F)|o|(%4F))((%72)|r| (% 52))/التاسع
شرح:
w* - صفر أو أكثر من الأحرف أو الشرطات السفلية.
(%27)|' - علامة اقتباس فردية أو ما يعادلها.
(%6 F)|o|(%4 F))((%72)|r|-(%52) - حالة الحالة 'or' ومكافئها السداسي.
استعلام SQL union' في حقن SQL تعد الهجمات أيضًا شائعة جدًا في قواعد البيانات المختلفة. إذا اكتشف التعبير العادي علامات الاقتباس المفردة أو أحرف تعريف SQL الأخرى، فسيتعين عليك تعديل الاستعلام بشكل أكبر لاكتشاف علامات الاقتباس والمفاتيح المفردة يمكن أيضًا توسيعها باستخدام كلمات SQL رئيسية أخرى، مثل 'select'، و'insert'، و'update'، و'delete'، وما إلى ذلك.
2.4 اكتشاف حقن SQL، والتعبير العادي للكلمة الرئيسية لاستعلام UNION
/ ((%27)|(') )union/ix
(%27)|(') - علامة اقتباس مفردة ومكافئها السداسي
union - يمكن أيضًا استخدام الكلمة الأساسية union
لتخصيص التعبيرات لاستعلامات SQL الأخرى، مثل >select، وinsert، وupdate، وdelete، وdrop، وما إلى ذلك.
إذا اكتشف المهاجم، في هذه المرحلة، أن تطبيق الويب يحتوي على حقنة SQL الضعف، فإنه سيحاول الاستفادة منه. إذا أدرك أن خادم الواجهة الخلفية هو خادم MS SQL، فسيحاول عادةً تشغيل بعض عمليات التخزين الخطيرة والإجراءات المخزنة الموسعة. تبدأ هذه الإجراءات عمومًا بالحرفين "sp" أو "xp". عادةً، قد يحاول تشغيل الإجراء المخزن الموسع 'xp_cmdshell' (الذي ينفذ أوامر Windows من خلال SQL Server). تتمتع سلطة SA الخاصة بخادم SQL بسلطة تنفيذ هذه الأوامر. وبالمثل، يمكنهم تعديل السجل من خلال xp_regread وxp_regwrite والإجراءات المخزنة الأخرى.
2.5 شرح التعبير العادي
/exec(s|+)+(s|x)pw+/ix
للكشف عن هجمات حقن MS SQL Server SQL:
exec - الكلمة الأساسية التي تطلب تنفيذ إجراء مخزن أو موسع
(s|+)+ - مسافة بيضاء واحدة أو أكثر أو ما يعادلها من http
(s|x) p- يتم استخدام الحروف 'sp' أو 'xp' لتحديد إجراءات التخزين أو التخزين الممتد
w+ - حرف أو شرطات سفلية واحدة أو أكثر لمطابقة اسم الإجراء
3. التعبير العادي للبرمجة النصية عبر المواقع (CSS)
عند إطلاق هجوم CSS أو اكتشاف ثغرة أمنية في موقع الويب، قد يقوم المهاجم أولاً بإنشاء علامة HTML بسيطة مثل < b> (غامق)، <i> (مائل) أو <u> (تسطير)، أو قد يجرب علامة نصية بسيطة مثل <script>alert("OK")</script> لأن معظم المنشورات و يُستخدم كمثال لاكتشاف ما إذا كان موقع الويب يحتوي على ثغرات أمنية في CSS منتشرة عبر الإنترنت. يمكن اكتشاف هذه المحاولات بسهولة. ومع ذلك، يمكن للمهاجم الذكي استبدال السلسلة بأكملها بقيمتها السداسية. بهذه الطريقة، ستظهر علامة <script> بالشكل %3C%73%63%72%69%70%74%3E. من ناحية أخرى، قد يستخدم المهاجم خادم وكيل ويب مثل Achilles لتحويل بعض الأحرف الخاصة تلقائيًا مثل < إلى %3C، > إلى %3E. عند حدوث مثل هذا الهجوم، يتم عادةً استبدال الأقواس الزاوية بقيم سداسية في عنوان URL.
سيكتشف التعبير العادي التالي أي نص يحتوي على <، > في html. سوف يلتقط محاولات استخدام <b> أو <u> أو <script>. يجب أن يتجاهل هذا التعبير العادي الحالة. نحن بحاجة إلى اكتشاف كل من قوس الزاوية ومكافئه السداسي (% 3C|<). لاكتشاف السلسلة بأكملها المحولة إلى ست عشرية، يجب علينا اكتشاف الأرقام وعلامات % التي أدخلها المستخدم، أي استخدام [a-z0-9%]. قد يتسبب هذا في ظهور بعض الأخطاء، ولكن لن يتمكن معظمها من اكتشاف الهجمات الحقيقية.
3.1 التعبير العادي لهجمات CSS العامة
/((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)/ix
شرح :
((%3C)|<) - يتحقق من < ومكافئه السداسي
((%2F)|/)* - علامة الإغلاق/ أو ما يعادلها
[a-z0-9%]+ - تحقق من الحرف الموجود في العلامة أو ما يعادله
((%3E)|>) - تحقق من > أو قاعدة Snort المكافئة لها
:
تنبيه tcp $EXTERNAL_NET Any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII Cross-site scriptingمحاولة";flow:to_server,installed; pcre:"/((%3C)|<)((%2F)| /)*[a-z0-9%]+((%3E)|>)/i"; classtype:Web-application-attack; sid:9000; rev:5;)
يمكن أيضًا استخدام البرمجة النصية عبر المواقع المستخدمة< img src=>التكنولوجيا. يمكن التحايل بسهولة على قواعد الشخير الافتراضية الحالية.
يوفر القسم 3.2 طرقًا لمنع هذه التقنية.
3.2 "<img src" CSS يهاجم التعبير العادي
/((%3C)|<)((%69)|i|(%49))((%6D)|m|(%4D)) ) ((%67)|g|(%47))[^n]+((%3E)|>)/
الشرح:
(%3 C)|<) -<أو ما يعادله
(%69)|i|(%49))((%6D)|m|(%4D))((%67)|g|(%47) - حرف 'img' أو هو مجموعات متنوعة من مكافئات الأحرف الكبيرة والصغيرة
[^n]+ - أي حرف يتبع <img باستثناء السطر الجديد
(%3E)|>) -> أو ما يعادله
3.3 CSS Attack Extreme Regular Expression
/((%3C)|<)[^n]+((%3E)|>) /I
الشرح:
هذا تبحث القاعدة ببساطة عن <+أي حرف باستثناء حرف السطر الجديد+>. اعتمادًا على بنية خادم الويب وتطبيق الويب لديك، قد تنتج هذه القاعدة بعض الأخطاء. ولكن من المضمون التقاط أي هجمات CCS أو هجمات شبيهة بـ CSS.
ملخص:
في هذه المقالة، اقترحنا أنواعًا مختلفة من قواعد التعبير العادي للكشف عن هجمات حقن SQL والبرمجة النصية عبر المواقع. بعض القواعد بسيطة ومتطرفة، وأي هجوم محتمل سيدق ناقوس الخطر. لكن هذه القواعد المتطرفة يمكن أن تؤدي إلى بعض الأخطاء الاستباقية. ومع أخذ ذلك في الاعتبار، قمنا بتعديل هذه القواعد البسيطة لاستخدام أنماط إضافية بحيث يمكن التحقق منها بدقة أكبر. عند اكتشاف الهجمات على تطبيقات الشبكة هذه، نوصي باستخدامها كنقطة بداية لتصحيح أخطاء IDS أو أساليب تحليل السجل. بعد إجراء بعض المراجعات الإضافية، يجب أن تكون جاهزًا لاكتشاف تلك الهجمات بعد تقييم الاستجابات غير الضارة لجزء معاملات الشبكة العادية.
المرجع
1. حقن SQL
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
2. الأسئلة الشائعة حول البرمجة النصية عبر المواقع http://www.cgisecurity.com/articles/xss -
faq.shtml
3. معرف Snort http://www.snort.org
4. التعبيرات العادية المتوافقة مع لغة Perl (pcre) http://www.pcre.org
5. وكيل تطبيق الويب، Achilles http://achilles.mavensecurity.com
3. حقن SQL المتقدم
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
7. كيفية البرمجة الآمنة، ديفيد ويلر www.dwheeler.com
8. التهديدات والتدابير المضادة، MSDN، مايكروسوفت