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
وتنفيذ البرنامج النصي الخاص بك:
'-alert(document.domain)-'
إن '
التسلسل هو كيان 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. وهذا يمثل
حواجز إضافية أمام الاستغلال ، والتي
غالبًا ما يمكن التحايل عليها ببراعة كافية.
0 Comments:
إرسال تعليق