Lesson 2 : WebAppPen Cross Site Scripting XSS ( Code Review )
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
الدرس السابق :
محتويات الدرس :
Lab :
1-Lab-XSS-PHP (By @infosec_90 )
2-Lab-XSS-JavaScript (By @infosec_90 )
3-Lab-XSS-RubyonRails (By @infosec_90 )
4-LabXSSDjango (By @infosec_90 )
5-Lab-XSS-.NET-Core ( By @wolfgang_ofner )
Script :
1- Lifestyle Store (PHP)
2- College Management System (PHP)
3- Restaurant Reservation System (PHP)
4- AlchemyCMS (RubyOnRails)
جميع المرفقات تجدونها هنا :
الهدف من هذا الدرس :
الهدف الاساسي من هذا الكورس هو ليس عرض اكبر عدد من اللغات البرمجية وتحليلها
الهدف هو ايضاح فكرة انه مهما اختلفت اللغة البرمجية تعرفك على اسباب حدوث
الثغرة يمكنك من اكتشافها في اي لغة برمجية مستقبلا.
وعرض عدد اكبر من اللغات لايصال فكرة ان جميع اللغات البرمجية متشابهة الى
حد كبير جدا تعلمك المنطق الخاص بسبب حدوث هذه الثغرة
تعني اكتشافك لثغرات في الكود المصدري في اي لغة لانك تعلمت سبب حدوثها
مقدمة :
عند بداية كل شخص في البرمجة اول درس تعليمي يتحدث عن كيفية طباعة
Hello World
لذلك درس اليوم ايضا عن الطباعة ولكن ليس لطباعة نفس الجملة فلدينا جملة خاصة بنا
XSS
سنتعرف اليوم على اسباب حدوث هذه الثغرة عن قرب بداية بمختبرات بسيطة وانتهاء
بسكربتات معقدة تحتاج الى تتبع لمحاولة تخطى بعض الفلاتر
في البداية وقبل الخوض في تفاصيل برمجية سيتم شرح الاساسيات
بشكل مختصر
Cross Site Scripting (XSS)
تعريف الثغرة :
هي بكل بساطة امكانية طباعة اكواد جافاسكربت وعرضها للمستخدم
مثال اسمي عبدالرحمن وعند الدخول للموقع تظهر رسالة ترحيبية
مرحبا بك عبدالرحمن في موقعنا
اذا استطعت استبدال اسمي بكود جافاسكربت اذا هي ثغرة
شروط مهمة لنجاح الاستغلال :
1- امكانية تحكم المستخدم بالمدخلات مثل الصورة اعلاه
2- قبول الموقع لاكواد جافا سكربت
انواعها :
1-Reflected XSS
ببساطة هي عندما نحقن كود جافا سكربت لايتم تخزينها في الموقع
ويجب على المهاجم ارسال الرابط الذي يحتوي على كود الخبيث مثال :
http://127.0.0.1/labxss.php?name=<script>alert(1)</script>
حيث اذا تم ارسال الرابط التالي :
http://127.0.0.1/labxss.php?name=
لن تعمل الهجمة بسبب ان الموقع لايخزن محتويات الرابط
في الصورة اعلاه تجد ان المهاجم ارسل رابط فيه كود خبيث للمستخدم
وفي الخطوة الثانية فتح المستخدم رابط الموقع الذي يحتوي على
الكود الخبيث وبعدها متصفح المستخدم ترجم الكود الخبيث واستطاع
المهاجم الوصول لمحتويات او معلومات حساسة عن المستخدم
2-Stored XSS
عكس النوع الذي في الاعلى عندما نحقن كود يتم تخزينه في قاعدة البيانات وغيرها
ولايجب على المهاجم ارسال الكود الى المستخدم لانه تم تخزينه في الموقع
لذلك اي شخص يدخل على الموقع :
http://127.0.0.1
الكود الخاص بالمهاجم يعمل بشكل الي لانه تم تخزينه
مثال المهاجم حقن كود خبيث داخل تعليق في الموقع التالي :
http://127.0.0.1
بمجرد دخول المستخدم للموقع وبالتحديد عندما يتم تحميل التعليق الخاص بالمهاجم
من قبل المتصفح بشكل الي والذي يحتوي على كود خبيث يتم تنفيذ الكود
3-DOM-based XSS
نفس النوع الاول لايتم تخزينها ولكن الفرق انها تحدث في لغة الجافاسكربت
بشكل اوضح هذا النوع لا يحدث فقط الا في لغة الجافاسكربت
لذلك كبداية يجب ان نتفق ان النوعين
Stored XSS,Reflected XSS
تحدث في اللغة البرمجية الخاصة بالموقع مثل
php/rubyonrails/.net/django …etc
لكن الدوم في الجافا سكربت فقط في ملفات
js
دائما تحدث مشاكل في فهم هذا النوع لذلك ساحاول توضيحها بشكل اكبر
الصورة التي في الاعلى تحتوي على اشهر خدمات الويب سيرفر ماهي وظيفة الويب سيرفر
ببساطة اذا لديك موقع بلغة بي اتش بي تحتاج الى ويب سيرفر لتتمكن من تشغيل ملفات بي اتش بي
بدون الويب سيرفر لايمكنك تشغيل ملفات بي اتش بي وبشكل ادق مترجم اللغة ولكن لا اريد تعقيد الامور
الان لنتفق انه لتشغيل ويب ابلكيشن تحتاج الى خدمة الويب سيرفر
مثلا اذا كان لديك هيكل سيارة وليس في السيارة مكينة لايمكنك تشغيلها لانها لاتحتوي على مكينة
فوظيفة الويب سيرفر مثل المكينة يقوم بتشغيل اللغة البرمجية الخاصة بالويب ابلكيشن
لكن لايمكن للويب سيرفر تشغيل ملفات الجافاسكربت !!
حيث من يشغل ملفات الجافاسكربت هو متصفحك وليس الويب سيرفر الخاص
بالموقع الذي تزوره لذلك تم فصل هذا النوع لوحده
طبعا توجد تفاصيل اكثر ولكن نحتاج حاليا الى فهم هذه الفروقات فقط بدون الدخول
في تفاصيل مملة
اتمنى وضحت الصورة
واذا لم تتضح عليك استخدام الرابط ادناه
لنكمل موضوع الطباعة عندما تبدا تعلم البرمجة اول درس تتعلمه هو طباعة
Hello World
عندما تبدا تتعلم طباعة هذه الجملة من هنا تبدأ ثغرات
XSS
في الصورة اعلاه امثلة ثابتة حيث ان المدخل لايتحكم به الا المبرمج
ولكن عند برمجة موقع حقيقي نحتاج من المستخدم ادخال بياناته لحفظها في الموقع
لذلك عندما نحتاج الى عرض اسم المستخدم او اي بيانات داخل الموقع نحتاج
الى استخدام امر الطباعة في اي لغة كان مبرمج بها الموقع
لكن ماذا اذا ادخل المستخدم بيانات تحتوي على كود خبيث في الموقع الخاص بنا
لغة البرمجة لاتعلم هل هذا اسم مستخدم او كود خبيث تم حقنه من قبل مهاجم
كل ما ستفعله لغة البرمجة هو طباعة المحتوى لانه بالاساس تم برمجتها لطباعة
اي مدخل من المستخدم ونظن ان كل المستخدمين سيكتفون بتسجيل اسمهم
لنضرب الان مثال بسيط بلغة
php
<?php
echo “Hello World” ;
هنا تعلمنا طباعة كلمة اهلا بالعالم لكن بالمواقع الحقيقية نحتاج الى طباعة اسم
مستخدم وبياناته لذلك اما ان ناخذ المعلومات من المستخدم عن طريق
GET OR POST
وقد توجد حالات اخرى بالهيدر او تسميم الكاش..الخ لن يتم ذكرها الان
لنضرب الان مثال اذا اردنا ان ناخذ المدخلات من المستخدم ثم عرضها
<?php
echo $_GET[‘name’] ;
النتيجة
لنحقن كود خبيث يطبع لنا داخل الكونسول لوق الخاص بالمتصفح :
الان لدينا لاب بسيط بلغة البي اتش بي تستطيع تنزيله من هذا الرابط
لنبحث الان عن اكواد البي اتش بي داخل الملف وهل يوجد امر طباعة ويمكن للمستخدم التحكم به او لا
في السطر رقم 44 نجد التالي :
اولا يجب علينا تحقيق الشرط لامكانية استغلال الثغرة باضافة البارمتر
لتحقيق الشرط
بالطريقة التالية :
http://127.0.0.1/index.php?name=yourname
الان استطعنا التحكم بالمدخلات لنجرب كود خبيث
نجح الاستغلال
الان تعلمنا ان سبب هذه الثغرة امر الطباعة في لغة البي اتش بي
الان لنذهب الى لغة اخرى جافا سكربت
وايضا لدينا لاب اخر يمكنك تنزيله من هذا الرابط
لنستعرض الملف
قبل الخوض في الاستغلال كيف يمكنني قراءة اكواد الجافاسكربت بشكل اسهل
تشغيل اللاب
ثم ادوات المطور ثم الكونسول لوق
وكتابة المتغيرات التي تم قراءتها من السورس كود
الاستغلال
مع الاسف الاستغلال لم ينجح لنرجع الان للكونسول لوق ونكتب المتغير
لمعرفة لماذا لم يتم طباعة الاستغلال
نجح الاستغلال
الى الان نحن في عملية الطباعة والتي تؤدي بدورها الى هذه الثغرة
مهم اختلفت اللغة البرمجية بمعنى اخر ان اي دالة في اي لغة برمجية
تستطيع الطباعة قد يمكن استغلالها ولاننسى اهم شرط هل يمكن التحكم بها ام لا
الان لدينا لاب اخر مبرمج ب
django
هذه اللاب لتثبيت المعلومة انه مهما اختلفت اللغة نمط او سلوك ثغرة
XSS
متشابه في كل اللغات انها نحتاج الى امر طباعة يمكن التحكم فيه
لاستغلال الثغرة
لتنزيل اللاب
https://github.com/Ph33rr/WebAppPenetrationTesting-Code-Review/tree/main/2/LabXSSDjango
لتشغيله علينا تنفيذ الامر التالي اولا:
pip install django
ثم
python manage.py runserver
والدخول من المتصفح
قبل الخوض في اللاب علينا قراءة السورس كود للبحث عن
1- مدخلات يمكن التحكم بها
2- امر طباعة
3- ان يكون المخرج غير مشفر
حاليا اضفنا شرط ثالث ان المخرج لايكون مشفر لعمل الكود
اولا الذهاب لهذا الملف للتعرف على محتويات المشروع
يهمنا انها يتم استيراد ملف فيو من مجلد
XSSlab
البقية تأتي بشكل افتراضي
استيراد تمبلت وعرضه للمستخدم
لنذهب الى هذا الملف الان
الان لنستعرض اللاب الخاص بنا ومحاولة اضافة البرامتر
ومن ثم الحقن فيه
قبل الاكمال علينا مراجعة بسيطة في معرفة ماهو
MVC
جدا يفضل لمعرفة كيفية تتبع الاخطاء
يفضل ان تقرء عنها قبل التعمق في لاب
RubyOnRails
.NET Core
لفهم الية البرمجة وكيفية التتبع
اولا علينا تنزيل اللاب من هذا الرابط
بعدها تنزيل الرابط وتنفيذ الاوامر بالترتيب لتشغيل اللاب
cd Lab-XSS-RubyonRails
bundle install
rails s
الان لنبدا استعراض ملفات اللاب
ملاحظة تم تسهيل اللاب لسهولة التتبع من المهم فهمها في نهاية الدرس
سيتم فحص سكربت حقيقي بنفس الالية
الاستغلال
اللاب الاخير
تمرين لهذا الدرس لتطوير قدراتك
ملاحظة:جميع اللابات نفس التصميم لتقريب الفكرة اكثر التي تحدثت عنها في البداية
الان اخذنا فكرة عن اسباب وجود هذه الثغرة وكيف يمكن تطبيقها
للعلم لم يتم ذكر جميع اوامر الطباعة في الاعلى كان الهدف فقط
فهم الية الثغرة واسباب حدوثها في اي لغة برمجية واوجه التشابه
بينهم .
لنتذكر الشروط من جديد :
1- وجود مدخل للمستخدم
2- وجود امر طباعة
3-المخرج لايحتوي على فلترة
الان نأتي لجزء السكربتات الحقيقية كان فيه سكربت في الدرس السابق
كتمرين على اكتشاف هذا النوع من الثغرات لتنزيل السكربت
لم يتم حل التمرين الا من 3 اشخاص فقط التمارين تفيدك بتحدى نفسك
هل يمكنك الارتقاء اكثر ام لا بعيدا عن
CTF
نحن الان في الواقع
لتنزيل السكربت :
https://code-projects.org/online-shop-store-in-php-with-source-code/
وهنا نسخة احتياطية للسكربت للمستقبل :
https://github.com/Ph33rr/WebAppPenetrationTesting-Code-Review/tree/main/1
ذكرنا في الدرس السابق تثبيت السيرفر المحلي
لذلك الان سنتوجه مباشرة الى تثبيت السكربت واتباع التعليمات
الان لنستعرض السورس كود الخاص بملفات السكربت
والبحث عن اي مدخلات لليوزر وامر طباعة
الاستغلال :
السكربت الثاني
Restaurant Reservation System
لتنزيل السكربت من الرابط ادناه :
نسخة احتياطية من السكربت
https://github.com/Ph33rr/WebAppPenetrationTesting-Code-Review/blob/main/2/Restaurant_Reservation_System_In_PHP_With_Source_Code.zip
الاستغلال
السكربت الثالث
College Management System
لتنزيل السكربت
https://code-projects.org/college-management-system-in-php-with-source-code/
النسخة الاحتياطية
https://github.com/Ph33rr/WebAppPenetrationTesting-Code-Review/blob/main/2/College_Management_System_In_PHP_With_Source_Code.zip
هذا الصورة تتحدث ان بنية الحقول داخل الجدول مصممة بحيث انها لاتقبل قيم اكثر من القيم
المحددة
مثل ما لاحظنا انه تم ايجاد عدة ثغرات ولكن للاسف تم تقليصها
الى ثغرة واحدة بسبب حجم البيانات الذي يتم تخزين في قاعدة البيانات
وايضا وجود علاقة بين جدول وجدول اخر المقصد من وجود علاقة ان حقل الايام
مرتبط بجدول اخر اسمه ايام الاسبوع لذلك مهما تحكمنا فيه لانستطيع كتابة قيمة جديدة
الان نأتي الى الاستغلال
تم استخدام البايلود التالي
<svg/onload=alert()>من 20 قيمة مكون فقط
هنا تم كتابة استغلال
الان السكربت الرابع مبرمج بلغة الروبي
للعلم تم شرح تنصيب الادوات في الدرس السابق
AlchemyCMS
موقع السكربت
https://alchemy-cms.com
لتنزيل السكربت
https://github.com/AlchemyCMS/alchemy_cms
لتثبيت السكربت الرجاء اتباع الاوامر التالية :
gem install alchemy_cms
npm install gm
rails new alchemycms
ثم الدخول في مجلد
cd alchemycms
تحرير ملف
nano Gemfile
واضافة التالي :
gem ‘alchemy_cms’
gem ‘alchemy-devise’
الان تنفيذ الامر
bundle install
بعد الانتهاء تنفيذ
rails g alchemy:devise:install
rake alchemy:install
ملاحظة يرجى اختيار كل شئ افتراضي عند التثبيت
الان لتشغيل السيرفر
rails s
عند اول دخول سيتم طلب منك انشاء حساب ادمن
الان لنستعرض الاكواد
الان لنستعرض الاكواد ليس عن امر طباعة ولكن لرفع ملف بصيغة
SVG
حيث هذه الصيغة تتيح لنا الحصول على ثغرة من نوع
Stored XSS
شرط انها تكون في نفس السب دومين لان بعض المواقع تستخدم بوكس لتلافي مثل هذه الثغرات
فعليا المبرمج ماهو معترف بالتحقق من الامتداد لاي ملف يتم رفعه
نستخدم هذا البايلود
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/Files/SVG_XSS.svg
الاستغلال
السكربتات الكبيرة التي تحتوي على اكثر من 1000 ملف اذا كان الفحص سريع
يفضل استخدام بلاك بوكس + وايت بوكس في الفحص = الصندوق الرمادي
او الطريقة التي شرحتها في في ورقة تحليل ملفات الجافاسكربت
الدرس السابق استطاع حل التمرين عدد 3 اشخاص شكرا لهم
ملاحظة :
جميع السكربتات اعلاه تحتوي على ثغرات وبعضها اكثر من الثغرات التي تم شرحها
ولكن على حسب الدرس يتم شرح الثغرات لذلك اذا اجتهدت يمكنك الحصول على عدة ثغرات
ثم يمكنك ارسال الثغرة الى موقع
https://packetstormsecurity.com/
https://www.exploit-db.com/
وتكون صيغة الايميل كالتالي :
# Exploit Title: college management system - SQL Injection Authentication Bypass
# Date: 01/10/2021
# Exploit Author: Abdulrahman https://twitter.com/infosec_90
# Vendor Homepage: https://www.eedunext.com/
# Software Link: https://code-projects.org/college-management-system-in-php-with-source-code/
# Version: 1.0
# Tested on: Kali Linux
in login/login.php in line 8 :
$username=$_POST["email"];
$password=$_POST["password"];
$query="select * from login where user_id='$username' and Password='$password' ";
$result=mysqli_query($con,$query);
POC :
http://127.0.0.1/2/College-Management-System/login/login.php
username : ' or 1=1#
password : 123456
ليس شرط كتابة السطر البرمجي المصاب يكتفي بالاستغلال
هذه بعض المصادر
لتحدى نفسك في اكتشاف ثغرات ولتطوير قدراتك
في التحليل بغض النظر عن اللغة
تنسيق الدرس اخذ وقت طويل خصوصا مشكلة اللغة الانجليزية والعربية
لذلك بعض المصطلحات لم يتم كتابتها بالانجليزية
اخيرا تم بذل مجهود لتحضير هذا الدرس فلا اتمنى منكم الا دعوى بظاهر الغيب شكرا لكم