عند الحديث عن ترميز URL، قد تفكر في ثغرة أمنية في ترميز URL منذ N سنوات. ومن المؤسف أنني ولدت في الوقت الخطأ. عندما اتصلت بالإنترنت، اختفت الثغرة منذ فترة طويلة.
أقرب إلى المنزل، ما هو ترميز URL؟ ألقِ نظرة على التعريف الذي قمت بنسخه من الإنترنت:
اقتباس: ترميز URL هو تنسيق تستخدمه المتصفحات لتعبئة إدخال النموذج. يحصل المتصفح على جميع الأسماء والقيم من النموذج ويرسلها إلى الخادم كجزء من عنوان URL أو بشكل منفصل، باستخدام ترميز معلمة الاسم/القيمة (إزالة الأحرف غير القابلة للنقل، وفرز البيانات، وما إلى ذلك). في كلتا الحالتين، يبدو تنسيق إدخال النموذج على جانب الخادم كما يلي:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
يتبع ترميز URL القواعد التالية: يتم فصل كل زوج من الاسم/القيمة بعلامة الضم؛ يأتي من النموذج مفصولاً بـ = الأحرف. إذا لم يُدخل المستخدم قيمة للاسم، فسيظل الاسم ظاهرًا، ولكن بدون قيمة. سيتم ترميز أي أحرف خاصة (أي تلك التي ليست بسيطة من نوع ASCII بسبعة بتات، مثل الأحرف الصينية) بالنظام السداسي العشري مع علامة النسبة المئوية %، بما في ذلك بالطبع الأحرف الخاصة مثل = و& و%.
هاها، أنت تفهم، في الواقع، ترميز عنوان URL هو رمز ASCII السداسي العشري للشخصية. ومع ذلك، هناك تغيير طفيف تحتاج إلى إضافة "%" في المقدمة. على سبيل المثال، ""، رمز ASCII الخاص به هو 92، والقيمة السداسية العشرية 92 هي 5c، وبالتالي فإن ترميز URL لـ "" هو . فماذا عن ترميز URL للأحرف الصينية؟ الأمر بسيط للغاية، انظر إلى المثال: رمز ascii لـ "Hu" هو -17670، والنظام السداسي العشري هو BAFA، وترميز عنوان url هو "%BA%FA". هههههههههههههههههههههههههههههههههههههههههههههههههههههههه عرفت كيف تحول
لا نستخدم عادةً ترميز URL، لأن IE سيقوم تلقائيًا بتحويل الأحرف غير الرقمية التي تدخلها في شريط العناوين إلى ترميز URL. لذلك بالنسبة للمتصفح http://blog.csdn.net/l%61ke2 يعادل http://blog.csdn.net/lake2 (لاحظ أنني استبدلت a بـ %61 في عنوان URL الأول) . هاها، ربما كنت قد تذكرت أن شخصًا ما اقترح إضافة "#" في اسم قاعدة البيانات لمنع تنزيلها، لأن IE سيتجاهل الأحرف التالية عند مواجهة #. طريقة الاختراق بسيطة للغاية - استبدل # بتشفير عنوان url #. لقد حاولت في الأصل استخدام ترميز URL لتجنب عمليات التحقق من الإدخال، لكنها فشلت لأن الخادم سيقوم بتحويل ترميز URL إلى أحرف.
انتظر، يبدو أنني خارج الموضوع، هاها، آسف :)
أصبح حقن SQL شائعًا جدًا الآن، لذلك كتب بعض الأشخاص بعض البرامج النصية المضادة للحقن. وبطبيعة الحال، الأفكار مختلفة والنتائج مختلفة جدا. أعزائي القراء، يرجى إلقاء نظرة على جزء من الكود الخاص بإصدار ASP العالمي المضاد للحقن ××SQL أدناه.
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url،"&")
استرداد Fy_Cs(ubound(Fy_a))
على خطأ استئناف التالي
من أجل Fy_x=0 إلى ubound(Fy_a)
Fy_Cs(Fy_x) = اليسار(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
التالي
بالنسبة إلى Fy_x=0 إلى ubound(Fy_Cs)
إذا كان Fy_Cs(Fy_x)<>"" إذن
إذا كان Instr(LCase(Request(Fy_Cs(Fy_x)))،"and")<>0 ثم
Response.اكتب "حدث خطأ!"
الاستجابة.النهاية
نهاية إذا
نهاية إذا
التالي
تتمثل الفكرة في الحصول أولاً على البيانات المقدمة، واستخدام "&" كفاصل للحصول على مجموعة الاسم/القيمة ومعالجتها، ثم تحديد ما إذا كانت القيمة تحتوي على الكلمات الرئيسية المحددة (للتبسيط هنا، أترك "و" فقط). إذا كان الأمر كذلك، فهي حقنة.
للوهلة الأولى، يتم التحقق من القيمة ويبدو أنه لا توجد مشكلة. هههه نعم ليس هناك مشكلة في القيمة ولكن ماذا عن الاسم؟
تأتي قيمة مجموعة الاسم/القيمة من Request.ServerVariables("QUERY_STRING")، هاها، آسف، حدث خطأ ما هنا. يتم استخدام Request.ServerVariables("QUERY_STRING") للحصول على السلسلة التي يرسلها العميل. لن يتم تحويل ترميز URL تلقائيًا هنا. إذا قمنا بتشفير الاسم عبر عنوان URL ثم أرسلناه، فيمكن تجاوز التحقق. على سبيل المثال، إذا كانت المعلمة ph4nt0m=lake2 وlis0، فيمكن للبرنامج اكتشافها في هذا الوقت إذا قمت بإرسال %50h4nt0m=lake2 وlis0 (ترميز URL p)، فسيحكم البرنامج على قيمة %50h4nt0m و%50h4nt0m؛ سيتم تحويله إلى ph4nt0m، لذا فإن قيمة %50h4nt0m فارغة، وبالتالي يتم تجاوز الكشف.
انتظر، لماذا يمكن تجاوز الشيك إذا لم يتم فك تشفير الاسم ولكن لا يمكن تجاوز القيمة؟ نظرًا لأن قيمة القيمة مأخوذة من Request(Fy_Cs(Fy_x))، فسيقوم الخادم بفك تشفيرها.
كيف يمكن تحسين البرنامج؟ طالما يمكنك الحصول على البيانات التي تم فك تشفيرها والتي أرسلها العميل، فما عليك سوى تغيير العبارة للحصول على الاسم إلى For Each SubmitName In Request.QueryString.
هاها، شكرًا لك على سعة صدرك في قراءة مقالتي ^_^
Lake2