ابحث عن:
المشروع - كل ما يتعلق بتطوير المواقع http://www.almashroo.com/
انضم للكتّاب
البرمجة الآمنة في لغة SQL Injections … PHP
مدرج تحت قسم: دروس
23 يوليو 2006
لقد تعرفنا على بالدرس السابق على CrossSite Scripting وطرق الحماية منه و كيفية الاستغلال الأولية. واليوم سوف نتكلم عن ما هو اخطر من XSS وما يسمى SQL Injection وتعني بالعربية ( حقنة السكيوال ).
لماذا تسمى بالحقنة؟
لقد سميت بالحقنة لأن من اكتشف هذا النوع سمها هكذا، لكن السبب الرئيسي هو ان طريقة استغلالها تكون بحقن الاستعلام الرئيسي باستعلام آخر يغير مجرى الاستعلام الأول للوصول إلى بيانات ليس من حقك الاطلاع عليها. وليـست فقط MySQL التي لها هذا النوع من الثغرات، بل Oracle & MS-SQL.
ولكل واحدة طريقة استغلال، فمثلاً طريقة استغلال MS-SQL أهون بكثير من MySQL، لأنها توفر لك طرق لجلب اسماء الجداول و الحقول، لكن أكثر برمجيات PHP تعتمد بشكل كبير على MySQL لأنها تتوافق مع جميع السيرفرات، وكما ذكرنا ان مكانيكية العمل هي حقن الاستعلام الرئيسي باستعلام آخر، أو بدالة أخرى، تغير مجرى الاستعلام.
أين من الممكن وجود هذا النوع من الثغرات؟
من الممكن ايجاد هذا النوع من الثغرات في جميع برامج PHP ، ASP وغيرها التي تتعامل مع قواعد البيانات، حتى بالبرامج التنفيذية على Linux و غيره من الآنظمة. ودائما تذكر قبل البدء بكتابة برنامج من النواحي الأمنية وأنك تجيد تفادي الثغرات إلى حد كبير، ولا يوجد برنامج خالي من الثغرات.
انظر إلى الكود التالي:
view source
print?
1.<?php
2.mysql_query("SELECT * FROM Table WHERE id=".$_GET]'id']."") or die(mysql_error());
3.?>
كما تلاحظ لقد قمنا بالاستعلام من الجدول ( Table ) عن محتوياته بشرط ان يعرض محتويات الحقول التي ( حقل ID فيها يساوي _GET[id] ). يكون الرابط على هذا الشكل:
view source
print?
1.http://127.0.0.1/file.php?id=1
لاكن لو اعطينا ID قيمة وهمية أو غير موجوده مثل ( -99999 ) سوف يعرض البيانات بحقول فارغه.
view source
print?
1.http://127.0.0.1/file.php?id=-99999
وعند استعمال الجملة ( UNION ) يتم تغير مجرى الاستعلام ما ان وجد البيانات فارغه ليستعلم عن شيء ليس من حقه الاتطلاع عليه.
view source
print?
1.http://127.0.0.1/file.php?id=-99999 UNION SELECT username,password FROM admin/*
لا اريد التعمق بالاستغلال لأن له شروط و له عدة طرق للوصول إلى البيانات، لأن اوضح الطريقه فقط.
الآن للحماية من هذه الثغره، مثلما راينا ان المتغير id متغير رقمي، لذلك يجب علينا استعمال الدالة intval() معه لتعيد القيمة الرقمية الحقيقية للمدخلات، وهذه بعض الدوال المساعده.
http://il.php.net/manual/en/function.intval.php
http://il.php.net/manual/en/function.is-numeric.php
وهناك فائدة لاستعمال الدالتين، الأولى تعيد القيمة الرقمية الحقيقية للمدخلات، أما الثانية فهي تتاكد من المتغير اذا كان رقمي حقيقي أو لا و تعود بقيمتين ( True OR False ).
استعمال الداله الأولى للترقيعة:
view source
print?
1.<?php
2.$id=intval($_GET]'id']); mysql_query("SELECT * FROM Table WHERE id=".$id."") or die(mysql_error());
3.?>
استعمال الداله الثانية للترقيعة:
view source
print?
1.<?php
2.if(!is_numeric($_GET]'id']))
3.{
4. echo "STOP SQL Injection";
5. exit();
6.}
7.mysql_query("SELECT * FROM Table WHERE id=".$id."") or die(mysql_error());
8.?>
هذا بالنسبة للاستعمال مع الارقام، اما السلاسل النصية فلها دوال آخرى، انظر إلى الكود التالي:
view source
print?
1.<?php
2.mysql_query("SELECT * FROM Table WHERE id='".$_GET['email']."'") or die(mysql_error());
3.?>
هنا يتعامل مع سلسلة نصية و هي عبارة عن بريد الكتروني.
view source
print?
1.http://127.0.0.1/file.php?id=me@almashroo.com
سوف يصبح الاستعلام هكذا:
view source
print?
1.mysql_query("SELECT * FROM Table WHERE id='me@almashroo.com'
لكن في حالة تم إضافة علامة التنصيص ” ‘ ” للاستعلام، سوف يصبح هكذا:
view source
print?
1.mysql_query("SELECT * FROM Table WHERE id='me@almashroo.com''
ويظهر خطأ يعلمك بوجوده في الاستعلام وهنا تتم عملية كتابة الاتستغلال ( Exploit ).
السلاسل النصية تاتي الحماية لها من ملف php.ini في حال ان magic_quotes_gpc = on. اما لو كانت magic_quotes_gpc = off فعندئذ يجب علينا استعمال دوال الـ addslashes() و دوال التاكد من ان المدخل بريد بـ مساعدة ( Regex ).
الترقيع باستعمال addslashes()
view source
print?
1.<? mysql_query("SELECT * FROM Table WHERE id='".addslashes($_GET['email'])."'") or die(mysql_error()); ?>
حيث تعمل هذه الدالة على إضافة الـ Slash \ لكل للعلامات التالية:
view source
print?
1.' & &
بما أنك قد وصلت إلى النهاية، ربما تكون قد أحببت المقال وأردت المزيد:
- البرمجة الآمنة في لغة PHP [مقدمة]
- البرمجة الآمنة في لغة Declare Variables … PHP
- البرمجة الآمنة في لغة CrossSite Scripting … PHP
- البرمجة الآمنة في لغة PHP مع File Inclusion
- [سجن البرمجة] ستايل البرمجة – كود مرتّب (2)
الوسوم: PHP ، SQL ، ثغرات ، دوال
الثلاثاء مارس 03, 2015 1:12 am من طرف علي البرنس
» Definition of salmonella bacteria
الجمعة مارس 14, 2014 12:08 am من طرف أحمدكزمه عين اللويقة
» تعريف بكتيريا السلمونيلا
الأربعاء فبراير 26, 2014 7:25 am من طرف ميسره احمد عثمان
» Enteric feve
الأربعاء فبراير 26, 2014 7:14 am من طرف ميسره احمد عثمان
» حمى التايفويد
الأربعاء فبراير 26, 2014 6:55 am من طرف ميسره احمد عثمان
» تحية طيبة
الأحد يناير 19, 2014 2:29 pm من طرف Admin
» حير2نا يا ناس البرير
الأربعاء يناير 08, 2014 9:28 am من طرف أحمدكزمه عين اللويقة
» من قصة المحلق وتاجوج
الثلاثاء يناير 07, 2014 11:13 pm من طرف أحمدكزمه عين اللويقة
» هذا هو الاسلام
الأربعاء ديسمبر 25, 2013 2:36 pm من طرف أحمدكزمه عين اللويقة
» ثورة الطين(احمد مطر)
الثلاثاء ديسمبر 24, 2013 5:22 pm من طرف أحمدكزمه عين اللويقة
» يلاكم ننم وندوبي
الثلاثاء ديسمبر 24, 2013 3:00 pm من طرف أحمدكزمه عين اللويقة
» معا من أجل موسوعة من الامثال السودانية الحديثة والمعاصرة
الثلاثاء ديسمبر 24, 2013 2:27 pm من طرف أحمدكزمه عين اللويقة
» عووووووووووووووووووووووك
الثلاثاء ديسمبر 24, 2013 12:47 am من طرف أحمدكزمه عين اللويقة
» الدوبيت السودانى
الثلاثاء ديسمبر 24, 2013 12:36 am من طرف أحمدكزمه عين اللويقة
» امثال شعبية
الثلاثاء ديسمبر 24, 2013 12:32 am من طرف أحمدكزمه عين اللويقة