في الأسبوع الماضي قمت بإنشاء موقع ويب لشخص آخر، واكتشفت بالصدفة أن هناك العديد من الثغرات في عملي وفي 20 ثانية فقط، استخدمت حقن SQL لإصلاحها. لذلك قمت بالتحقق من بعض المعلومات حول حقن SQL وحصلت على بعض الأفكار وآمل أن أتمكن من مشاركتها مع المبتدئين. الخبراء يضحكون!
الفكرة العامة لهجوم حقن SQL:
اكتشف مواقع حقن SQL؛
تحديد نوع الخادم ونوع قاعدة البيانات الخلفية؛
لتحديد قابلية التنفيذ
، يستخدم بعض المهاجمين بشكل عام حقن SQL. بعد ذلك، سأتحدث أيضًا عن رؤيتي الخاصة حول طريقة حقن SQL.
طريقة الحقن:
من الناحية النظرية، ستبدو صفحة الويب الخاصة بالمصادقة كما يلي:
حدد * من المشرف حيث اسم المستخدم = 'XXX' وكلمة المرور = بيان 'YYY'، إذا لم يتم إجراء تصفية الأحرف الضرورية قبل تشغيل هذا البيان رسميًا، فمن السهل تنفيذ حقن SQL.
على سبيل المثال، أدخل في مربع نص اسم المستخدم: abc' أو 1=1-- أدخل في مربع كلمة المرور: 123، فتصبح عبارة SQL:
حدد * من المشرف حيث اسم المستخدم='abc' أو 1=1 وكلمة المرور='123' بغض النظر عن اسم المستخدم وكلمة المرور التي يدخلها المستخدم، سيتم دائمًا تنفيذ هذا البيان بشكل صحيح، ويمكن للمستخدم بسهولة خداع النظام والحصول على تصريح قانوني هوية.
تخمين الحل:
الفكرة الأساسية هي: تخمين جميع أسماء قواعد البيانات، وتخمين كل اسم جدول في قاعدة البيانات، وتحليل أسماء الجداول التي قد تخزن أسماء المستخدمين وكلمات المرور، وتخمين كل اسم حقل في الجدول، وتخمين كل سجل في محتوى الجدول.
هناك أيضًا طريقة للحصول على اسم قاعدة البيانات الخاصة بك واسم كل جدول.
ما عليك سوى الحصول على اسم قاعدة البيانات واسم الجدول عن طريق الإبلاغ عن خطأ في النموذج: http://www .cn/news?id=10'!
بالنسبة لـ jsp، نعتمد عمومًا الاستراتيجيات التالية للتعامل معها:
1.البيان المعد
إذا كنت بالفعل مطورًا متقدمًا إلى حد ما، فيجب عليك دائمًا استخدام PreparationStatement بدلاً من البيان.
وهنا بعض الأسباب
1. سهولة قراءة التعليمات البرمجية وقابلية صيانتها.
2. PreparedStatement يحسن الأداء قدر الإمكان.
3. النقطة الأكثر أهمية هي أن الأمان قد تحسن بشكل كبير.
حتى الآن، بعض الأشخاص (بما فيهم أنا) لا يعرفون حتى قواعد SQL الشريرة الأساسية.
String sql = "select * from tb_name Where name= '"+varname+"' and passwd='"+varpasswd+"'";
إذا مررنا [' أو '1' = '1] كاسم، فلنرى كيف ستكون شبكة إدارة الشبكة bitsCN.com
* من tb_name = 'or '1' = '1' و passwd = 'غير رسمي'؛
نظرًا لأن '1'='1' صحيح بالتأكيد، فيمكنه اجتياز أي عملية تحقق.
قم بتمرير ['; إسقاط الجدول tb_name ] كـ varpasswd، ثم:
حدد * من tb_name = 'any' وpasswd = ''; drop table tb_name; لن تسمح لك بعض قواعد البيانات بالنجاح، ولكن هناك أيضًا العديد من قواعد البيانات التي يمكنها تنفيذ هذه العبارات.
وإذا كنت تستخدم عبارات مجمعة مسبقًا، فلن يكون لأي محتوى تقوم بتمريره أي علاقة مطابقة مع البيانات الأصلية (الفرضية هي أن قاعدة البيانات نفسها تدعم التجميع المسبق، ولكن قد لا تكون هناك قواعد بيانات من جانب الخادم لا تدعم التجميع. هناك. ليست سوى عدد قليل من قواعد بيانات سطح المكتب، أي تلك التي تتمتع بإمكانية الوصول المباشر إلى الملفات، وطالما أنها تستخدم جميعها بيانات مجمعة مسبقًا، فلن تحتاج إلى إجراء أي تصفية للبيانات الواردة. إذا كنت تستخدم بيانات عادية، فقد تضطر إلى الإنفاق الكثير من الوقت في حالة السقوط،،، وما إلى ذلك. التخطيط للحكم والتفكير الزائد.
2. التعبيرات العادية
2.1. التعبير العادي لاكتشاف أحرف SQL التعريفية/(%27)|(')|(--)|(%23)|(#)/ix
2.2. قم بتصحيح التعبير العادي لاكتشاف أحرف SQL التعريفية /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. كوم
|(%3B)|(:))/i
2.3. التعبير العادي لهجوم حقن SQL/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |(. تحالف إدارة الشبكة الصينية www.bitscn.com
%52))/ix
2.4. كشف إدخال SQL، والتعبير العادي للكلمة الرئيسية لاستعلام UNION /((%27)|('))union/ix(%27)|(') - مفرد
الاقتباسات والاتحاد المكافئ لها - الكلمة الأساسية للاتحاد.
2.5 التعبير العادي/exec(s|+)+(s|x)pw+/ix للكشف عن هجمات حقن MS SQL Server SQL
3. تصفية السلسلة.
محتوى السلسلة الثابتة العامة (محتوى السلسلة) {
سلسلة flt = ""|و|exec|إدراج|تحديد|حذف|تحديث|عدد|*|%
|chr|mid|master|truncate|char|declare|;
Stringfilter[] = flt.split("|");
ل(int i=0;i {
content.replace(filter[i], "");
}
عودة المحتوى؛
}
4. إخفاء الأحرف غير الآمنة
يستخدم هذا الجزء Js للحظر، والذي يلعب دورًا صغيرًا جدًا. على الرغم من أن طريقة حظر الكلمات الرئيسية لها تأثير معين، في التطبيقات الفعلية، قد تصبح كلمات SQL الرئيسية هذه أيضًا كلمات رئيسية للاستعلام الحقيقي، ثم سيتم حظرها بواسطتك لن يتمكن المستخدم من استخدامه بشكل طبيعي. فقط بذل بعض الجهد في معايير الترميز.
عندما تكون هناك متغيرات في SQL المنفذة، ما عليك سوى استخدام PreparationStatement المقدم من JDBC (أو طبقة ثبات البيانات الأخرى). تذكر عدم استخدام طريقة ربط السلاسل.
مقدمة الوظيفة: التحقق مما إذا كانت تحتوي على "'"، \"،/ "
وصف المعلمة: السلسلة المراد التحقق منها قيمة الإرجاع: 0: نعم 1: ليس اسم الوظيفة نعم
فحص الوظيفة (أ)
{
العودة 1؛
fibdn = مصفوفة جديدة ("'" ، " \"،/ ")؛
i=fibdn. length;
ي=أ. الطول;
لـ (ii=0; ii { لـ (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
إذا (تيم'؛ p1==temp2)
{ عودة 0 }
}
}
العودة 1
}