مقال : إستغلال ثغرات SQL injection والحصول على سطر أوامر من خلالها
تحدثنا في مقالات سابقة كثيرة عن إستغلال ثغرات SQL injection ، وفي جميع المقالات كنا نقوم بإستخراج معلومات من قاعدة البيانات مثل إسم المستخدم وكلمة المرور ومن ثم إستخدمها في الدخول إلى لوحة تحكم الموقع ومحاولة تمكين إتصالنا به من خلال رفع php backdoor والتوصل به من خلال Metasploit مثلاً ، هذه الطريقة تعتبر من أكثير الطُرق الدارجة للحصول على سطر أوامر على السيرفر المُراد إختبار إختراقه.
وفي هذا المقال سوف نشرح طريقة ثانية مُختلفة كُلياً لإختبار إختراق تطبيقات الويب وإستغلال ثغرة SQL injection لرفع ملف مباشرة من خلال بعض إستعلامات SQL التي سوف توصلنا بالنهاية إلى رفع ملف على السيرفر ومن ثم الحصول على سطر أوامر مباشر مع هذا السيرفر من خلال Metasploit.
العملية ليست صعبة أبداً ، وسوف أقوم بالتنفيذ على أحد مختبرات Pentester Lab كون ان المختبرات الحالية الخاصة ب iSecur1ty قيد الصيانة وسوف تعود مع بداية 2016 بإذن الله ، طبعاً قمت بالتعديل على المختبر السابق لكي يتماشى مع السيناريو الذي سوف نقوم بتنفيذه.
سوف نقوم بإستخدام الإستعلام INTO OUTFILE لوضع نصوص معينة داخل ملف معين على السيرفر من خلال مسار موجود على السيرفر ويحمل التصريح 777 على أنظمة Linux والذي يسمح لجميع مستخدمين النظام القرأة والكتابة والتنفيذ داخل هذا المسار ، وفي حالتنا سوف نقوم بإستخدام المستخدم الخاص بقاعدة البيانات بكتابة ملف معين داخل هذا المسار الذي يحمل التصريح 777 ومن ثم تفعيله لرفع Backdoor خاص وعمل إتصال عكسي مباشر معنا.
الأن سوف نبدأ ، هذه صورة الهدف طبعاً موجود على جهاز وهمي لدي :
كما نلاحظ عنوان المُختبر هو 172.16.179.128 وطبعاً يوجد فيه الملف cat.php يُمرر لهُ البارميتر id يحمل القيمة 2 ، طبعاً فور إضافة علامة إقتباس فردية – Single Quotation – ‘ لكي نختبر في حال كانت هذه العلامة سوف تؤثر على عمل السكربت وبالفعل تقوم بإحداث خلل داخل الإستعلام الخاص بالملف cat.php أم لا ، لكي نحصل على النتيجة التالية :
كما نرى حدث ظهر لدينا نص يفيد بوجود مشكلة خاصة بإستعلامات SQL تؤكد وجود ثغرة SQL injection ، سوف نقوم الأن بإستخدام الأمر ORDER BY لمعرفة عدد الأعمدة الموجوده وإستخراج المصاب منها :
سوف نبدأ بالعدد 5 كمثال ونستخدم الأمر ORDER BY 5 لتظهر لنا الرسالة :
المُتصفح يقوم بشكل تلقائي بتغير الطلب ORDER BY 5 إلى صيغة URL ENCODE لذلك إختلف شكلها
كما نشاهد ظهرت لنا الرسالة unknown column 5 in order case وهذه تعني أن عدد الأعمدة أقل من 5 لذلك دعونا نُجرب الرقم 4 ونرى النتيجة :
كما نرى عادت الصفحة للشكل القديم والمشكلة قد إختفت ، وبهذا فإن عدد الأعمدة المصابة هو 4 ، لذلك سوف نستخدم الأن الإستعلام Union Select لإستخراج العامود المصاب :
كما نرى هُنا أن العامود المُصاب هو العامود رقم 2 ، إلى الأن جميع الأمور معروفة ولم أخض بتفاصيل أكثر حول عملية الإستغلال وطبيعة الإستعلامات لأننا بالفعل قُمنا بشرحها بمقالات سابقة عديدة ، الأن سوف نقوم بالبدء بإستخدام التقنية الخاصة بنا والتي سوف نعتمد بها كما ذكرنا على الإستعلام INTO OUTFILE في تحميل نصوص مُعينة إلى مسار معين وحفظها في هذا المسار ، ولكن بالطبع يجب أن تكون قاعدة البيانات والمستخدم الخاص بها يحملات الصلاحيات المُناسبة للكتابة داخل ملفات النظام ، كذلك يُمكننا إستخدام الإستعلام Load_file في حال كانت الصلاحيات الخاصة بقاعدة البيانات والمُستخدم الخاص بها كذلك يحملان الصلاحيات المُناسبة لإستخدام هذا الإستعلام ، دعونا الأن نبدأ بمحاولة قرأة ملف /etc/passwd من خلال الإستعلام Load_file ، حيث سوف نقوم بوضعه داخل العامود المُصاب وملاحظة ماذا سوف يجري كما في الصورة التالية :
كما نرى وبكُل سهولة لقد إستطعنا قرأة الملف passwd من خلال الإستعلام load_file دون وجود أي مشاكل ، طبعاً تستطيع قرأة أي ملف من خلال هذه الدالة وهنا بالطبع نحصُل أيضاً على ثغرة LFI – Local File Include حيث نستطيع قرأة أي ملف على السيرفر دون الحاجة إلى الوصول إلى تحكم فعلي أو إتصال فعلي بهذا السيرفر يبدو أن التعبير خانني قليلاً ، هنا لا أقصد بالفعل ألية عمل Local File include ولكن أسلوب معين يسمح لي بقرأة الملفات من خلال هذه الثغرة بكل بساطة وهنا سوف تاتي فكرة محاولة معرفة مسار التطبيق على السيرفر لكي نحاول رفع ملف على نفس المسار الخاص بالسيرفر ، دعونا الأن نحاول قرأة الملف cat.php من مسارات مختلفة مثل :
- var/www/html/cat.php/
- var/www/cat.php/
- home/photoblog/cat.php/
حيث أن الملف cat.php بالأصل ملف خاص بالسكربت كما لاحظنا مُسبقاً ومن المنطقي أننا في حال إستطعنا أن نقوم بقرأة هذا الملف على أحد المسارات فأننا وصلنا للمسار الخاصة بالتطبيق على السيرفر ونستطيع الأن محاولة معرفة المجلدات التي تحمل التصريح 777 على نفس المجلد مما سوف يُمكننا من إستخدامه لرفع ملف يساعدنا على عمل الإتصال بالسيرفر من خلال INTO OUTFILE دون وجود أي مشاكل ، دعونا نبدأ بمحاولة قرأة المسارات بالترتيب وهذه نتيجة المسار الأول كما في الصورة التالية :
كما نشاهد لا يوجد أي مُخرجات من السكربت وهذا يدل على عدم وجود الملف ، وبالطبع في بعض الحالات من الممكن أن يُخرج لك رسالة صريحة بأن الملف غير موجود ، حسناً دعونا نقوم بتجربة المسار الثاني ونرى النتيجة :
كما نرى لقد تم قرأة الملف دون أي مشاكل ! وبهذه الحالة لقد وجدنا مسار الخاص بالسكربت وهو /var/www/ الأن بأغلب الحالات يوجد ملفات تحمل التصريح 777 وفي حالتنا هذه الملف الذي يحمل هذا التصريح هو ملف images حيث بتخمين بسيط على المجلدات وجدت الملف هذا ضمن ملفات السيرفر ، وهو يحمل التصريح 777 كما ذكرنا حيث يصبح المسار الذي سوف نقوم بإستخدام الإستعلام INTO OUTFILE عليه هو /var/www/images/ وسوف نتمكن من رفع الملف عليه دون أي مشاكل ، ولكن دعونا في البداية أن نقوم بعمل ملف بسيط بتنفيذ الأوامر القادمة إليه حيث سوف نقوم في البداية بكتابة هذا الملف داخل المجلد السابق ومن خلالها سوف نرفع ملف backdoor لأن ملف backdoor حجمه كبير قليلاً ومن الممكن أن يحدث لنا مشاكل في كيفية كتابته داخل الإستعلام من خلال أمر wget.
يُمكنك تشفير الملف بإستخدام base64 مثلاً ورفعه بشكل مباشر ولكن أُفضل أن نقوم برفع ملف صغير وظيفته أن يقوم برفع الملفات لكي نستخدمه في رفع الملفات.
هذا هو السكربت الصغير الذي سوف نقوم برفعه داخل مجلد /var/www/images/ :
حيث أن هذا الملف يقوم بأخذ البارميتر cmd ويقوم بتنفيذه بشكل مباشر ، دعونا الأن نقوم بكتابة الإستعلام الخاصة بكتابة هذا الملف داخل المجلد السابق :
ويُمكنكم تحميل نص الإستغلام هذا من خلال الرابط التالي تسهيلاً لكتابته من قبلكم ، حيث قمنا بوضع النص المُراد حفظه في الملف المُراد رفعه ومن ثم في نهاية الإستعلام قمنا بوضع الإستعلام INTO OUTFILE مع المسار الخاص بمجلد images موضوعاً في نهايته إسم الملف وهو بالطبع a2.php ، وهذه نتيجة التنفيذ :
كما نلاحظ ظهر لنا تحذير SQL ، إذاً من المفترض الأن فور طلب الملف a2.php من خلال المسار الذي تم رفعه وتمرير البارميتر بالأمر الخاص بنا سوف يتم تنفيذه دون أي مشاكل ، دعونا نستعرض هذا بشكل سريع من خلال طلب الملف وتمرير الأمر pwd له :
كما نرى تم تنفيذ الأمر دون مشاكل ، ولو نلاحظ لقد تم كتابة أيضاً الأعمدة المصابة داخل الملف ، يبدو أننا قد وضعناها داخل الملف من خلال الإستعلام الخاص بالكتابة :D.
دعونا الأن نقوم بضغط ملف backdoor الخاص بنا والذي قمت بتحميله من الرابط السابق إلى صيغة zip ومن ثم سحبه إلى السيرفر لكي نقوم بتنفيذه كما في الصور التالية :
الأن دعون نقوم بطلب الملف من خلال a2.php بإستخدام الأمر wget ، ومن ثم فك ضغطه وتنفيذه.
طبعاً يجب أن تقوم بالتعديل على ملف backdoor بوضع الأيبي والبورت المراد التوصل فيهم بشكل عكسي كما بالصورة التالية :
والأن دعونا ننفذ طلب جلب الملف من خلال الأمر :
كما نشاهد هنا تم جلب الملف دون أي مشاكل ، دعونا الأن نقوم بفك الضغط عنه من خلال الأمر unzip وطلبه بشكل مباشر من خلال المتصفح.
يمكنكم تحويل صيغة الملف إلى txt وجلبها من خلال wget بصيغة php فلا مشكلة بذلك.
والان سوف نقوم بطلب الملف بشكل طبيعي بعد إعداد nc لإستقبال الإتصال على المنفذ 4444 :
كما نُشاهد تم التوصل بنجاح دون أي مشاكل وقمنا بتنفيذ الأمر id وتم عرض نتائجه دون أي مشاكل.
إلى هنا نكون قد إنتهينا بشكل كامل من عملية الإستغلال ونفذنا العملية بشكل مُمنهج ودقيق وأتمنى أن يكون المقال قد نال إعجابكم.
امثلة كهذه وان افادت المبتئين فانها لا تقم ولاتاخر في عالم الواقع لهذا فامثلة من الواقع والتي تحاكي التعقيدتالتي يواجهها نهتبر الاختراق هي من ستنمي من قدراته ومعارفه.
هنالك العديد من الأمثلة التي واجهتها على مواقع حقيقية تحكاي ما تم شرحه عزيزي ، ولكن على قدر الإمكان نحاول خلق بيئة تعليمية لإيصال المعلومة بالشكل المطلوب عزيزي 🙂
can you recommend some books to gain more skills in web app pentreion testing
thanks
barklah fike
شكرا لك أخي محمد على الشرح طبعا يبقى الباقي للمختبر المهم شكرا لك و بارك الله فيك
أغلب السيرفرات لا تشتغل عليها طريقتك إلا السيرفرات التي ليس فيها حماية
كلامك صحيح وقمت بالتجربة على 3 سيرفرات مختلفة ولن تعمل لاكن يجب تعلم كل شيء في عالم الهكر لكي تصبح محترف 🙂
يرجى الانتباه الى الكود يجب وضع علامة ; بعد انهاء كل دالة php 😀