تحدثنا في مقالات سابقة كثيرة عن إستغلال ثغرات SQL injection ، وفي جميع المقالات كنا نقوم بإستخراج معلومات من قاعدة البيانات مثل إسم المستخدم وكلمة المرور ومن ثم إستخدمها في الدخول إلى لوحة تحكم الموقع ومحاولة تمكين إتصالنا به من خلال رفع php backdoor والتوصل به من خلال Metasploit مثلاً ، هذه الطريقة تعتبر من أكثير الطُرق الدارجة للحصول على سطر أوامر على السيرفر المُراد إختبار إختراقه.

وفي هذا المقال سوف نشرح طريقة ثانية مُختلفة كُلياً لإختبار إختراق تطبيقات الويب وإستغلال ثغرة SQL injection لرفع ملف مباشرة من خلال بعض إستعلامات SQL التي سوف توصلنا بالنهاية إلى رفع ملف على السيرفر ومن ثم الحصول على سطر أوامر مباشر مع هذا السيرفر من خلال Metasploit.

العملية ليست صعبة أبداً ، وسوف أقوم بالتنفيذ على أحد مختبرات Pentester Lab كون ان المختبرات الحالية الخاصة ب iSecur1ty قيد الصيانة وسوف تعود مع بداية 2016 بإذن الله ، طبعاً قمت بالتعديل على المختبر السابق لكي يتماشى مع السيناريو الذي سوف نقوم بتنفيذه.

سوف نقوم بإستخدام الإستعلام INTO OUTFILE لوضع نصوص معينة داخل ملف معين على السيرفر من خلال مسار موجود على السيرفر ويحمل التصريح 777 على أنظمة Linux والذي يسمح لجميع مستخدمين النظام القرأة والكتابة والتنفيذ داخل هذا المسار ، وفي حالتنا سوف نقوم بإستخدام المستخدم الخاص بقاعدة البيانات بكتابة ملف معين داخل هذا المسار الذي يحمل التصريح 777 ومن ثم تفعيله لرفع Backdoor خاص وعمل إتصال عكسي مباشر معنا.

الأن سوف نبدأ ، هذه صورة الهدف طبعاً موجود على جهاز وهمي لدي :

SQLi-lab-main-page

كما نلاحظ عنوان المُختبر هو 172.16.179.128 وطبعاً يوجد فيه الملف cat.php يُمرر لهُ البارميتر id يحمل القيمة 2 ، طبعاً فور إضافة علامة إقتباس فردية – Single Quotation – ‘ لكي نختبر في حال كانت هذه العلامة سوف تؤثر على عمل السكربت وبالفعل تقوم بإحداث خلل داخل الإستعلام الخاص بالملف cat.php أم لا ، لكي نحصل على النتيجة التالية :

SQLi-error-detected

كما نرى حدث ظهر لدينا نص يفيد بوجود مشكلة خاصة بإستعلامات SQL تؤكد وجود ثغرة SQL injection ، سوف نقوم الأن بإستخدام الأمر ORDER BY لمعرفة عدد الأعمدة الموجوده وإستخراج المصاب منها :

سوف نبدأ بالعدد 5 كمثال ونستخدم الأمر ORDER BY 5 لتظهر لنا الرسالة :

SQLi-order-by-first

المُتصفح يقوم بشكل تلقائي بتغير الطلب ORDER BY 5 إلى صيغة URL ENCODE لذلك إختلف شكلها

كما نشاهد ظهرت لنا الرسالة unknown column 5 in order case وهذه تعني أن عدد الأعمدة أقل من 5 لذلك دعونا نُجرب الرقم 4 ونرى النتيجة :

SQLi-order-by-done

كما نرى عادت الصفحة للشكل القديم والمشكلة قد إختفت ، وبهذا فإن عدد الأعمدة المصابة هو 4 ، لذلك سوف نستخدم الأن الإستعلام Union Select لإستخراج العامود المصاب :

SQLi-union-select-done

كما نرى هُنا أن العامود المُصاب هو العامود رقم 2 ، إلى الأن جميع الأمور معروفة ولم أخض بتفاصيل أكثر حول عملية الإستغلال وطبيعة الإستعلامات لأننا بالفعل قُمنا بشرحها بمقالات سابقة عديدة ، الأن سوف نقوم بالبدء بإستخدام التقنية الخاصة بنا والتي سوف نعتمد بها كما ذكرنا على الإستعلام INTO OUTFILE في تحميل نصوص مُعينة إلى مسار معين وحفظها في هذا المسار ، ولكن بالطبع يجب أن تكون قاعدة البيانات والمستخدم الخاص بها يحملات الصلاحيات المُناسبة للكتابة داخل ملفات النظام ، كذلك يُمكننا إستخدام الإستعلام Load_file في حال كانت الصلاحيات الخاصة بقاعدة البيانات والمُستخدم الخاص بها كذلك يحملان الصلاحيات المُناسبة لإستخدام هذا الإستعلام ، دعونا الأن نبدأ بمحاولة قرأة ملف /etc/passwd من خلال الإستعلام Load_file ، حيث سوف نقوم بوضعه داخل العامود المُصاب وملاحظة ماذا سوف يجري كما في الصورة التالية :

SQLi-load-file-done

كما نرى وبكُل سهولة لقد إستطعنا قرأة الملف 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 دون وجود أي مشاكل ، دعونا نبدأ بمحاولة قرأة المسارات بالترتيب وهذه نتيجة المسار الأول كما في الصورة التالية :

SQLi-var-path

كما نشاهد لا يوجد أي مُخرجات من السكربت وهذا يدل على عدم وجود الملف ، وبالطبع في بعض الحالات من الممكن أن يُخرج لك رسالة صريحة بأن الملف غير موجود ، حسناً دعونا نقوم بتجربة المسار الثاني ونرى النتيجة :

SQLi-var-path-done

كما نرى لقد تم قرأة الملف دون أي مشاكل ! وبهذه الحالة لقد وجدنا مسار الخاص بالسكربت وهو /var/www/ الأن بأغلب الحالات يوجد ملفات تحمل التصريح 777 وفي حالتنا هذه الملف الذي يحمل هذا التصريح هو ملف images حيث بتخمين بسيط على المجلدات وجدت الملف هذا ضمن ملفات السيرفر ، وهو يحمل التصريح 777 كما ذكرنا حيث يصبح المسار الذي سوف نقوم بإستخدام الإستعلام INTO OUTFILE عليه هو /var/www/images/ وسوف نتمكن من رفع الملف عليه دون أي مشاكل ، ولكن دعونا في البداية أن نقوم بعمل ملف بسيط بتنفيذ الأوامر القادمة إليه حيث سوف نقوم في البداية بكتابة هذا الملف داخل المجلد السابق ومن خلالها سوف نرفع ملف backdoor لأن ملف backdoor حجمه كبير قليلاً ومن الممكن أن يحدث لنا مشاكل في كيفية كتابته داخل الإستعلام من خلال أمر wget.

يُمكنك تشفير الملف بإستخدام base64 مثلاً ورفعه بشكل مباشر ولكن أُفضل أن نقوم برفع ملف صغير وظيفته أن يقوم برفع الملفات لكي نستخدمه في رفع الملفات.

هذا هو السكربت الصغير الذي سوف نقوم برفعه داخل مجلد /var/www/images/ :

cmd-small-script

حيث أن هذا الملف يقوم بأخذ البارميتر cmd ويقوم بتنفيذه بشكل مباشر ، دعونا الأن نقوم بكتابة الإستعلام الخاصة بكتابة هذا الملف داخل المجلد السابق :

SQLi-INTO-OUTFILE-query

ويُمكنكم تحميل نص الإستغلام هذا من خلال الرابط التالي تسهيلاً لكتابته من قبلكم ، حيث قمنا بوضع النص المُراد حفظه في الملف المُراد رفعه ومن ثم في نهاية الإستعلام قمنا بوضع الإستعلام INTO OUTFILE مع المسار الخاص بمجلد images موضوعاً في نهايته إسم الملف وهو بالطبع a2.php ، وهذه نتيجة التنفيذ :

SQLi-OUTFILE-done

كما نلاحظ ظهر لنا تحذير SQL ، إذاً من المفترض الأن فور طلب الملف a2.php من خلال المسار الذي تم رفعه وتمرير البارميتر بالأمر الخاص بنا سوف يتم تنفيذه دون أي مشاكل ، دعونا نستعرض هذا بشكل سريع من خلال طلب الملف وتمرير الأمر pwd له :

SQLi-cmd-done

كما نرى تم تنفيذ الأمر دون مشاكل ، ولو نلاحظ لقد تم كتابة أيضاً الأعمدة المصابة داخل الملف ، يبدو أننا قد وضعناها داخل الملف من خلال الإستعلام الخاص بالكتابة :D.

دعونا الأن نقوم بضغط ملف backdoor الخاص بنا والذي قمت بتحميله من الرابط السابق إلى صيغة zip ومن ثم سحبه إلى السيرفر لكي نقوم بتنفيذه كما في الصور التالية :

SQLi-zip-backdoor

الأن دعون نقوم بطلب الملف من خلال a2.php بإستخدام الأمر wget ، ومن ثم فك ضغطه وتنفيذه.

طبعاً يجب أن تقوم بالتعديل على ملف backdoor بوضع الأيبي والبورت المراد التوصل فيهم بشكل عكسي كما بالصورة التالية :

SQLi-backdoor-change

والأن دعونا ننفذ طلب جلب الملف من خلال الأمر :

SQLi-wget-done

SQLi-ls-done

كما نشاهد هنا تم جلب الملف دون أي مشاكل ، دعونا الأن نقوم بفك الضغط عنه من خلال الأمر unzip وطلبه بشكل مباشر من خلال المتصفح.

يمكنكم تحويل صيغة الملف إلى txt وجلبها من خلال wget بصيغة php فلا مشكلة بذلك.

SQLi-unzip-done

والان سوف نقوم بطلب الملف بشكل طبيعي بعد إعداد nc لإستقبال الإتصال على المنفذ 4444 :

SQLi-Final-connection

كما نُشاهد تم التوصل بنجاح دون أي مشاكل وقمنا بتنفيذ الأمر id وتم عرض نتائجه دون أي مشاكل.

إلى هنا نكون قد إنتهينا بشكل كامل من عملية الإستغلال ونفذنا العملية بشكل مُمنهج ودقيق وأتمنى أن يكون المقال قد نال إعجابكم.