إثارة المتصفح تعطل مع الغموض السلوكي

صورة

في هذه المقالة ، سوف أخبرك كيف اعتدت على الغموض للعثور على عدة حوادث في Firefox. عادةً ما يكون الغرض من الدمج هو العثور على فشل يشير إلى تلف الذاكرة ، لكن هدفي مختلف: أريد اكتشاف رد فعل غير متوقع للمستعرض. يمكن أن تكون هذه أحرفًا تفتح أو تغلق علامة غير عادية ، أو ربما أحرف يتم تجاهلها بواسطة محلل JavaScript. غالبًا ما يمكن استخدام رد الفعل غير المتوقع للقيام بهجمات XSS وتجاوز عوامل تصفية الأمان وتجنب وضع جافا سكريبت JavaScript.

الخطأ الأول الذي أريد التحدث عنه هو كيفية إغلاق تعليق HTML بطريقة مختلفة. إذا قرأت مواصفات HTML ، فأنت تعلم أنه يمكن إغلاق التعليق باستخدام -> أو -!>. ولكن كيف نفعل ذلك بشكل مختلف؟ سؤال كبير لبدء الغمغمة! تحتاج فقط إلى إنشاء الكود الذي سيعطي الجواب.

مرة أخرى في عام 2008 ، عندما قمت بتجميع Shazzer لتحجيم سلوك المتصفح ، اقتصرت على ما يقرب من 10000 اتجاه لكل صفحة. اليوم ، في عام 2019 ، كل شيء يعمل بشكل أسرع ، حتى نتمكن من الغموض في كثير من الأحيان. بالإضافة إلى ذلك ، يؤدي استخدام DOM إلى تسريع عملية الدمج لأنك لم تعد بحاجة إلى إضافة كل اتجاه إلى المستند الحالي. تجدر الإشارة إلى أن هذا النهج غير موثوق به ، حيث يمكنك الحصول على نتائج مختلفة. في الواقع ، لقد وجدت حالات حيث يسمح DOM بقيم خالية في وسائط السمة مثل href ، لكن محلل HTML لا يسمح بذلك. لا تزال هذه الإخفاقات غير حرجة ، ولكن لا يمكنك الوثوق دائمًا بالنتائج للحصول على صورة كاملة لما سيقوم به محلل HTML. ومع ذلك ، يعمل في معظم الحالات ، وهو أسرع بكثير من إخراج HTML من جانب الخادم.

لقد تم بالفعل اتخاذ الخطوة الأولى - لدينا سؤال: "ما الأحرف التي يمكنها إغلاق تعليق HTML؟". للإجابة عليه ، نحتاج إلى استخدام الأحرف الموجودة التي ستغلق تعليق HTML والأحرف المزيفة التي لا نعرفها. والخطوة التالية هي استخدام برنامج مدمج مناسب. في حالتي ، أستخدم أداة Hackvertor الخاصة بي ، لكن باستخدام خادم الويب المحلي يمكنني تحقيق نفس النتائج. فكرة هذه الأداة هي وضع الإدخال في حقل الإدخال ، وتحويل العلامات قليلاً ، والقيام بشيء ما مع الإخراج. نظرًا لأنه لا يوجد لدينا شيء يمكن تحويله ، يمكننا وضع الشفرة الخاصة بنا مباشرةً في حقل الإخراج. لذلك ، انقر فوق منطقة إخراج النص وقم بإنشاء مصفوفة لتخزين الأحرف الغامضة وعنصر div لاختبار HTML:

log = []; div=document.createElement('div'); 

ثم نحتاج إلى إزالة أكثر من 1،000،000 حرف من رموز Unicode أو بدقة أكبر 0x10ffff. بسيطة للحلقة هي كل ما نحتاجه:

 for(i=0;i<=0x10ffff;i++){ 

ثم نعيد استخدام عنصر div الذي أنشأناه لكل حرف. في هذه الحالة ، أختبر الموضع بعد! حتى يتم إدخال الحرف بعد! .. ثم استخدم عنصر img لمعرفة ما إذا كان الاندماج ناجحًا. إذا كان هذا العنصر موجودًا ، فسيتم إغلاق تعليق HTML ، ولدينا بعض الشخصيات المثيرة للاهتمام!

 div.innerHTML = '<!-- --!'+String.fromCodePoint(i)+'><img>-->'; 

أخيرًا ، مع querySelector نتحقق مما إذا كان img موجودًا ونضيف أحرفًا إلى السجلات. ثم أغلق العبارة if و for loop. أخيرًا ، أدخِل النتائج في حقل الإدخال على اليسار:

 if(div.querySelector('img')){ log.push(i); } } input.value=log 

هنا هو النسخة الكاملة من الكود. تحتاج إلى فتح عنوان URL في Firefox ، ثم وضع أحرف الإدخال في حقل الإخراج والنقر فوق الزر "Execute JS" لإدماج الأحرف. بعد الانتهاء من الدمج ، يجب أن تشاهد الأرقام في حقل الإدخال ، فهي تتوافق مع رموز الأحرف التي نجحت. في وقت كتابة هذا التقرير ، كان Firefox (الإصدار 67) لا يزال يسمح لشخصيات السطر الجديد - \ n و \ r - بعد! بإغلاق التعليق. تم إخباري أن هذا تم إصلاحه في الإصدارات المستقبلية من Firefox. لذا ، فإن المرحلة الأخيرة من التشويش هي بناء الحمولة الصافية الخاصة بك ، إنها بسيطة جدًا. تحتاج إلى استبدال رمز الحرف بالحرف وإضافة حمولة XSS:

 <!-- --! ><img src=1 onerror=alert(1)> --> 

يمكنك استخدام Hackvertor مرة أخرى لاختبار عملها من خلال لصق ما سبق في حقل الإخراج ثم النقر فوق "اختبار HTML". يجب أن تظهر نافذة تحذير لأن Firefox (الإصدار 67) يحل السطر الجديد كجزء من التعليق النهائي.

لذا سمح لنا ذلك بالعثور على خطأ غير حاسم في محلل Firefox HTML. دعونا نجد واحدة أخرى! نحتاج إلى سؤال جديد: "ما هي الشخصيات التي يمكنها فتح تعليق HTML؟". بدلاً من تجاوز تعليق HTML الموجود ، سنستخدم الآن تعليق HTML لتجاوز سمة HTML الموجودة. كما أنا متأكد ، تعلمون جميعًا أنه يمكنك فتح تعليق HTML باستخدام <! - هل هذا صحيح؟ سوف نستخدم نفس الكود مرة أخرى ، لكن هذه المرة غيّر المقصود من innerHTML للتحقق مما إذا كان التعليق مفتوحًا:



وبالتالي ، فإن الرمز الذي نشربه سيكون بعد الواصلة الأولى. إذا نجحت الشخصية في إنشاء تعليق HTML مفتوح ، فسوف تقوم بالتعليق على عنصر div وبالتالي الخروج من سمة العنوان. هذه المرة ، عندما نقوم بتشغيل "Execute JS" ، نحصل على نتيجتين في Firefox (الإصدار 67): "0.45". رمز 45 متوقع لأنه واصلة ، ولكن 0 حرف NULL! هذا يعني أن Firefox يفسر التسلسل <! - NULL- كتعليق مفتوح. نوع من اللعبة! (أعتقد أن مزودي المتصفح يحتاجون إلى المزيد من التشويش السلوكي =)). لإنهاء حالة الاختبار هذه ، نحتاج الآن إلى إنشاء اتجاهنا. دعونا نفعل الشيء نفسه: مرة أخرى ، استبدل الدالة String.fromCodePoint برمز NULL و XSS بالاتجاه:

 document.body.innerHTML = '<!-\x00- ><div title="--><img src=1 onerror=alert(1)>"></div>'; 

دعنا ننتقل إلى JavaScript بدلاً من HTML. لقد اختبرت كل مستعرض وأنا آسف Mozilla ، لكن Firefox يقوم ببعض الألعاب مرة أخرى. لقد استلهمت من حقيقة أن التداخل من tweet jinmo123 يستخدم ميزات ES6 جديدة ومثيرة للاهتمام للاتصال بوظائف دون أقواس. كان السؤال الذي طرحته للتعبير هو: "ما هي الشخصيات المسموح بها بعد المشغلين في أو مثيل؟" ثم ننشئ الرمز مرة أخرى في Hackvertor ، وهو يتبع نمطًا مشابهًا ، لكن هذه المرة لا يستخدم DOM. أولاً ، قم بإنشاء صفيف و حلقة:

 log = []; for(i=0;i<=0x10ffff;i++){ 

ثم سنستخدم eval بدلاً من innerHTML لإخفاء قيمنا. أولاً ، نحتاج إلى استخدام كتلة try catch للكشف عن أي استثناءات تسببها أحرف غير صالحة.

 try{ eval("/a/"+String.fromCodePoint(i)+"instanceof function(){}"); 

يتم استخدام وظيفة eval لمعرفة ما إذا كانت JavaScript صالحة أم لا. إذا كان الأمر كذلك ، فسيتم الانتقال إلى السطر التالي ؛ وإذا لم يكن الأمر كذلك ، فسوف يلقي استثناءً سيتم ملاحظته ، ثم ينتقل إلى الحرف التالي. يسجل السطر التالي ببساطة الحرف ، ثم يغلق كتلة try catch و for for loop. تعرض الوظيفة النتائج في حقل الإدخال.

 log.push(i); }catch(e){} } input.value=log 

إذا قمت بتشغيل هذا الرمز باستخدام "Execute JS" ، فستحصل على مجموعة من النتائج! يتجاهل Firefox العديد من الشخصيات. إذا جربت الشفرة على Chrome ، فستحصل على المزيد من النتائج المعقولة. ابحث عن رمز الحرف في حقل الإدخال الذي تريد استخدامه ، في حالتي كان "1114110" أو "0x10fffe" بالسداسي عشرية. الآن سنقوم بإنشاء متجه JavaScript:

 eval("1337"+String.fromCodePoint(1114110)+"in"+String.fromCodePoint(1114110)+"alert(1337)"); 

يمكنك أيضًا تخيل ذلك داخل برنامج SVG نصي:



تتوفر أحدث تكوينات المعالج المزدوج للخوادم المخصصة مع معالجات Intel Scalable 2019 على DEDIC.SH :
  • 2x زيون سيلفر 4214 - ما مجموعه 24 النوى
  • 2x زيون الذهب 5218 - ما مجموعه 32 النوى
  • 2x زيون الذهب 6240 - التكوين مع 36 النوى.

تكلفة الخادم مع اثنين من زيون سيلفر 4214 - من 15210 روبل / شهر
نحن مستعدون أيضًا لجمع أي تكوين من أجلك - اكتب لنا !

إذا لم تكن هناك حاجة لقوى كبيرة من خادم مخصص - VDS من 150 روبل / شهر هو ما تحتاجه!

Source: https://habr.com/ru/post/ar455602/


All Articles