Cross-site scripting contexts

 




Cross-site scripting contexts

 


عند اختبار XSS المنعكس والمخزن ، تتمثل المهمة الرئيسية في تحديد سياق XSS:

 

1.      الموقع داخل الاستجابة حيث تظهر البيانات التي يمكن للمهاجمين التحكم فيها.

2.      أي تحقق من صحة الإدخال أو معالجة أخرى يتم إجراؤها على تلك البيانات بواسطة التطبيق.

بناءً على هذه التفاصيل ، يمكنك بعد ذلك تحديد واحدة أو أكثر من حمولات XSS المرشحة ، واختبار ما إذا كانت فعالة.

 

 

XSS بين علامات HTML

 

 

عندما يكون سياق XSS عبارة عن نص بين علامات HTML ، فأنت بحاجة إلى تقديم بعض علامات HTML الجديدة المصممة لتشغيل تنفيذ JavaScript.

 

بعض الطرق المفيدة لتنفيذ JavaScript هي:

 

<script>alert(document.domain)</script>
<img src=1 onerror=alert(1)>

 

 

 

 

 

 

XSS في سمات علامة HTML

 

عندما يكون سياق XSS في قيمة سمة علامة HTML ، فقد تتمكن أحيانًا من إنهاء قيمة السمة وإغلاق العلامة وتقديم واحدة جديدة. فمثلا:

"><script>alert(document.domain)</script>

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

 

" autofocus onfocus=alert(document.domain) x="

تنشئ الحمولة أعلاه حدثًا عند التركيز سينفذ JavaScript عندما يتلقى autofocus، ويضيف أيضًا سمة التركيز التلقائي لمحاولة تشغيل حدث onfocus تلقائيًا دون أي تدخل من المستخدم. أخيرًا ، يضيف x = "لإصلاح العلامات التالية بأمان.

 

 

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

 

<a href="javascript:alert(document.domain)">

 

 

قد تصادف مواقع ويب تقوم بتشفير أقواس زاوية ولكنها لا تزال تسمح لك بحقن السمات. في بعض الأحيان ، تكون هذه الحقن ممكنة حتى داخل العلامات التي لا تطلق عادةً الأحداث تلقائيًا ، مثل العلامة الأساسية. يمكنك استغلال هذا السلوك باستخدام مفاتيح الوصول وتفاعل المستخدم على Chrome. تتيح لك مفاتيح الوصول توفير اختصارات لوحة المفاتيح التي تشير إلى عنصر معين. تتيح لك سمة مفتاح الوصول تحديد حرف يؤدي ، عند الضغط عليه مع مفاتيح أخرى (تختلف باختلاف الأنظمة الأساسية) ، إلى اندلاع الأحداث.

 

 

 

 

XSS في JavaScript

 

عندما يكون سياق XSS عبارة عن بعض JavaScript موجود ضمن الاستجابة ، يمكن أن تنشأ مجموعة متنوعة من المواقف ، مع تقنيات مختلفة ضرورية لأداء استغلال ناجح.

 

 

 

إنهاء البرنامج النصي الحالي

 

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

 

<script>
...
var input = 'controllable data here';
...
</script>

 

ثم يمكنك استخدام الحمولة التالية للتخلص من JavaScript الحالي وتنفيذ الخاص بك:

 

</script><img src=1 onerror=alert(document.domain)>

 

والسبب في نجاح هذا هو أن المستعرض يقوم أولاً بإجراء تحليل HTML لتحديد عناصر الصفحة بما في ذلك كتل البرامج النصية ، ويقوم لاحقًا فقط بإجراء تحليل JavaScript لفهم البرامج النصية المضمنة وتنفيذها. تترك الحمولة المذكورة أعلاه النص الأصلي معطلاً ، مع سلسلة حرفية لم يتم إنهاؤها. لكن هذا لا يمنع تحليل النص اللاحق وتنفيذه بالطريقة العادية.

 

 

 تطبيق عملي : 

ثغرات XSS (Reflected, Stored and DOM based XSS)

 

 

 

 

الخروج من سلسلة JavaScript

 

 

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

 

بعض الطرق المفيدة للتخلص من سلسلة حرفية هي:

 

'-alert(document.domain)-'
';alert(document.domain)//

 

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

 

على سبيل المثال ، افترض أن الإدخال:

';alert(document.domain)//

يتحول إلى:

 

\';alert(document.domain)//

يمكنك الآن استخدام الحمولة البديلة:

 

\';alert(document.domain)//

الذي يتم تحويله إلى:

 

\\';alert(document.domain)//

هنا ، تعني الشرطة المائلة العكسية الأولى الشرطة المائلة للخلف الثانية يتم تفسيره حرفيًا ، وليس كحرف خاص. هذا يعني أن الاقتباس يتم تفسيره الآن على أنه فاصل سلسلة ، وبالتالي ينجح الهجوم. 

 

 

تجعل بعض مواقع الويب XSS أكثر صعوبة من خلال تقييد الأحرف المسموح لك باستخدامها. يمكن أن يكون هذا على مستوى موقع الويب أو عن طريق نشر WAF الذي يمنع طلباتك من الوصول إلى موقع الويب على الإطلاق. في هذه المواقف ، تحتاج إلى تجربة طرق أخرى لاستدعاء الوظائف التي تتجاوز هذه الإجراءات الأمنية. طريقة واحدة للقيام بذلك هي استخدام تعليمة الرمي مع معالج الاستثناء. يمكّنك هذا من تمرير الوسيطات إلى دالة دون استخدام الأقواس. يقوم الكود التالي بـــــــ:-

 assigns the alert() function to the global exception handler and the throw statement passes the 1 to the exception handler (in this case alert). The end result is that the alert() function is called with 1 as an argument.

onerror=alert;throw 1

 

 

 

 

الاستفادة من ترميز HTML

 

عندما يكون سياق XSS عبارة عن بعض JavaScript موجود ضمن سمة علامة مقتبسة ، مثل معالج الأحداث ، فمن الممكن استخدام ترميز HTML للتغلب على بعض عوامل تصفية الإدخال.

 

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

 

 

على سبيل المثال ، إذا كان سياق XSS كما يلي:

 

<a href="#" onclick="... var input='controllable data here'; ...">

 

وحظر التطبيق أو تجاوز أحرف الاقتباس الفردية ، يمكنك استخدام الحمولة التالية للتخلص من سلسلة JavaScript وتنفيذ البرنامج النصي الخاص بك:

 

&apos;-alert(document.domain)-&apos;

 

إن &apos;  التسلسل هو كيان HTML يمثل فاصلة عليا أو اقتباس مفرد. نظرًا لأن المتصفح HTML يفك ترميز قيمة سمة onclick قبل تفسير JavaScript ، يتم فك تشفير الكيانات على أنها علامات اقتباس ، والتي تصبح محددات سلسلة ، وبالتالي ينجح الهجوم.

 

 تطبيق عملي : 

ثغرات XSS (Reflected, Stored and DOM based XSS)

 

XSS في قوالب جافا سكريبت الحرفية

 

القيم الحرفية لقالب JavaScript هي سلسلة حرفية تسمح بتعبيرات JavaScript مضمنة. يتم تقييم التعبيرات المضمنة وعادة ما يتم ربطها في النص المحيط. يتم تغليف القوالب الحرفية في backticks بدلاً من علامات الاقتباس العادية ، ويتم تحديد التعبيرات المضمنة باستخدام بناء الجملة $ {...}.

 

على سبيل المثال ، سيقوم البرنامج النصي التالي بطباعة رسالة ترحيب تتضمن اسم عرض المستخدم:

 

document.getElementById('message').innerText = `Welcome, ${user.displayName}.`;

عندما يكون سياق XSS في قالب حرفي في JavaScript ، فلا داعي لإنهاء الحرف. بدلاً من ذلك ، تحتاج ببساطة إلى استخدام بناء الجملة $ {...} لتضمين تعبير جافا سكريبت الذي سيتم تنفيذه عند معالجة الحرف. على سبيل المثال ، إذا كان سياق XSS كما يلي:

 

 

 

<script>
...
var input = `controllable data here`;
...
</script>

 

 

ثم يمكنك استخدام الحمولة التالية لتنفيذ JavaScript دون إنهاء القالب الحرفي:

 

${alert(document.domain)}

 

 

XSS في سياق وضع الحماية AngularJS

 

في بعض الأحيان ، تظهر ثغرات XSS في سياق وضع الحماية AngularJS. وهذا يمثل حواجز إضافية أمام الاستغلال ، والتي غالبًا ما يمكن التحايل عليها ببراعة كافية.

About Toulay

    Blogger Comment
    Facebook Comment

0 Comments:

إرسال تعليق