Lesson 2 : WebAppPen Cross Site Scripting XSS ( Code Review )

Abdulrahman
13 min readOct 12, 2021

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

الدرس السابق :

محتويات الدرس :

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

والدخول من المتصفح

http://127.0.0.1:8000/

قبل الخوض في اللاب علينا قراءة السورس كود للبحث عن

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

ليس شرط كتابة السطر البرمجي المصاب يكتفي بالاستغلال

هذه بعض المصادر

لتحدى نفسك في اكتشاف ثغرات ولتطوير قدراتك

في التحليل بغض النظر عن اللغة

تنسيق الدرس اخذ وقت طويل خصوصا مشكلة اللغة الانجليزية والعربية

لذلك بعض المصطلحات لم يتم كتابتها بالانجليزية

اخيرا تم بذل مجهود لتحضير هذا الدرس فلا اتمنى منكم الا دعوى بظاهر الغيب شكرا لكم

--

--