الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماهي الثغرة الامنية في هذه الاستعلام

بدأه السيد الهاشمي في 20 أكتوبر 2011 · 9 رد · 1,483 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

اخواني اعضاء ومشرفين المنتدى . وانا اتابع بعض دورس asp.net لقيت هذه الاستعلام في كتاب . ويقول صاحب الكتاب انه فية ثغرة امنية لكن لم يوضح ماهي الثغرة الامنية وهذه هو الاستعلام

basic.FullDataReader(“SELECT * FROM items WHERE id=” + Request.QueryString["id"]);

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

#2

بخصوص هذا الإستعلام ليس عندي معرفة بالثغرات

ولكن تستطيع الإستزادة من هذا المقال الدسم هنا

1

الله أكبر الله أكبر الله أكبر لآ إله إلا الله الله أكبر الله أكبر ولله الحمد

#3
KV2010 كتب:

بخصوص هذا الإستعلام ليس عندي معرفة بالثغرات

ولكن تستطيع الإستزادة من هذا المقال الدسم هنا

------------------------

مشكور خيو على ردك السريع وماقصرت

#4
basic.FullDataReader(“SELECT * FROM items WHERE id=” + Request.QueryString["id"]);

هذا الجزء

Request.QueryString["id"]

يقوم بأخذ قيمة id من المستخدم مباشرة دون فلترة للبيانات. وفي أمن تطبيقات الويب، اعتبر دوماً أن البيانات الواردة من جهة العميل غير موثوقة وعليك تدقيقها من أجل أي أخطاء عفوية أو استغلالات خبيثة للأخطاء البرمجية.

افرض أن المستخدم قام بإدخال القيمة

-1 UNION SELECT <1,2,table_name,...> FROM INFORMATION_SCHEMA.TABLES

طبعاً بعد أن قام بتحديد عدد الأعمدة التي يجب طلبها <1,2,3,...> وقام بتحديد العمود الذي يظهر على الشاشة.

عندها سيصبح الاستعلام بالشكل:

basic.FullDataReader(“SELECT * FROM items WHERE id=” + “-1 UNION SELECT <1,2,table_name,...> FROM INFORMATION_SCHEMA.TABLES”);

وسيحصل على قائمة بجميع الجداول الموجودة لديك، ومن ثم:

basic.FullDataReader(“SELECT * FROM items WHERE id=” + “-1 UNION SELECT <1,2,column_name,...> FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = <interesting_table_name>”);

فيحصل على جميع الأعمدة في قاعدة معينة <interesting_table_name>

وبطريقة مشابهة يحصل على جميع الحقول في تلك القاعدة.

الثغرة يطلق عليها اسم SQL injection حيث يتم حقن استعلامات SQL باستعلامات SQL خبيثة من طرف المستخدم.

5

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5
Xacker كتب:

basic.FullDataReader(“SELECT * FROM items WHERE id=” + Request.QueryString["id"]);

هذا الجزء

Request.QueryString["id"]

يقوم بأخذ قيمة id من المستخدم مباشرة دون فلترة للبيانات. وفي أمن تطبيقات الويب، اعتبر دوماً أن البيانات الواردة من جهة العميل غير موثوقة وعليك تدقيقها من أجل أي أخطاء عفوية أو استغلالات خبيثة للأخطاء البرمجية.

افرض أن المستخدم قام بإدخال القيمة

-1 UNION SELECT <1,2,table_name,...> FROM INFORMATION_SCHEMA.TABLES

طبعاً بعد أن قام بتحديد عدد الأعمدة التي يجب طلبها <1,2,3,...> وقام بتحديد العمود الذي يظهر على الشاشة.

عندها سيصبح الاستعلام بالشكل:

basic.FullDataReader(“SELECT * FROM items WHERE id=” + “-1 UNION SELECT <1,2,table_name,...> FROM INFORMATION_SCHEMA.TABLES”);

وسيحصل على قائمة بجميع الجداول الموجودة لديك، ومن ثم:

basic.FullDataReader(“SELECT * FROM items WHERE id=” + “-1 UNION SELECT <1,2,column_name,...> FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = <interesting_table_name>”);

فيحصل على جميع الأعمدة في قاعدة معينة <interesting_table_name>

وبطريقة مشابهة يحصل على جميع الحقول في تلك القاعدة.

الثغرة يطلق عليها اسم SQL injection حيث يتم حقن استعلامات SQL باستعلامات SQL خبيثة من طرف المستخدم.

-----------------------------------

اولاُ اشكرك على هذه الشرح توضيح لي بهذه المعلومة القيمة

ثانياُ : طيب اخي ا لعزيز ماهو الحل كيف اعمل الاستعلام بحيث لايكون فيه ثغرة امنية .. وجزاك الله الف خير

#6
اقتباس
ثانياُ : طيب اخي ا لعزيز ماهو الحل كيف اعمل الاستعلام بحيث لايكون فيه ثغرة امنية .. وجزاك الله الف خير

السلام عليكم ورحمة الله وبركاتة

أخي الكريم حسب المعلومات البسيطة التي لدي لتفادي الـ SQL injection تستطيع أستخدام الـ Parameters. والروابط التي في الأسفل تحتوي على مقالات مفيدة:

How To: Protect From SQL Injection in ASP.NET

Preventing SQL Injection in ASP.NET

Tip/Trick: Guard Against SQL Injection Attacks

Good luck

1

My Latest

Hello Entity Framework Code First

--------------------

#7

استخدم هذا التابع عادة في PHP:

function purg_text( $txt )
{
    $search = array( "'<script[^>]*?>.*?</script>'si", "'<[\\/\\!]*?[^<>]*?>'si", "'([\r\n])[\\s]+'", "'&(quot|#34);'i", "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'(\\d+);'e" );
    $replace = array( "", "", "\\1", "\"", "&", "<", ">", " ", chr( 161 ), chr( 162 ), chr( 163 ), chr( 169 ), "chr(\\1)" );
    $txt = trim( $txt );
    $txt = preg_replace( $search, $replace, $txt );
    $txt = str_replace( "&", "&", $txt );
    $txt = str_replace( "<", "<", $txt );
    $txt = str_replace( ">", ">", $txt );
    $txt = str_replace( "\"", """, $txt );
    $txt = str_replace( "\\'", "", $txt );
    return $txt;
}

حيث أقوم بفلترة أي محتوى قد يستخدم في أغراض خبيثة.

بالإضافة إلى هذا التابع يوجد توابع built-in في اللغة للحماية من SQL injection في حال استخدام quotes للحقن.. لكنها لا تحمي إن لم يكن الاستعلام يحوي على quotes ;)

بالتالي، إن كنت ستتبع هذه الطريقة، فهناك Keywords هامة جداً في أي استعلام SQL وبدونها يفقد قدرته على التنفيذ.. مثل SELECT وفلترة هذه الـ Keyword ستفشل نسبة عالية جداً من تعابير الحقن.

يمكنك تطبيق الفكرة في ASP.NET بسهولة حسبما أعتقد.

بالتوفيق

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8
Xacker كتب:

استخدم هذا التابع عادة في PHP:

function purg_text( $txt )
{
    $search = array( "'<script[^>]*?>.*?</script>'si", "'<[\\/\\!]*?[^<>]*?>'si", "'([\r\n])[\\s]+'", "'&(quot|#34);'i", "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'(\\d+);'e" );
    $replace = array( "", "", "\\1", "\"", "&", "<", ">", " ", chr( 161 ), chr( 162 ), chr( 163 ), chr( 169 ), "chr(\\1)" );
    $txt = trim( $txt );
    $txt = preg_replace( $search, $replace, $txt );
    $txt = str_replace( "&", "&", $txt );
    $txt = str_replace( "<", "<", $txt );
    $txt = str_replace( ">", ">", $txt );
    $txt = str_replace( "\"", """, $txt );
    $txt = str_replace( "\\'", "", $txt );
    return $txt;
}

حيث أقوم بفلترة أي محتوى قد يستخدم في أغراض خبيثة.

بالإضافة إلى هذا التابع يوجد توابع built-in في اللغة للحماية من SQL injection في حال استخدام quotes للحقن.. لكنها لا تحمي إن لم يكن الاستعلام يحوي على quotes ;)

بالتالي، إن كنت ستتبع هذه الطريقة، فهناك Keywords هامة جداً في أي استعلام SQL وبدونها يفقد قدرته على التنفيذ.. مثل SELECT وفلترة هذه الـ Keyword ستفشل نسبة عالية جداً من تعابير الحقن.

يمكنك تطبيق الفكرة في ASP.NET بسهولة حسبما أعتقد.

بالتوفيق

---------------------------

مشكور خيو على ردك .. بس المشكلة اني ماعرف استخدم لغة pHp ومافهمت كيف اعملة ياليت لو تعرف تسوية في asp.net > تقولي كيف اسويها

#9

كحل سريع لمشكلة استخدم sqlparameter

لكي يكون تطبيقك أكثر أمانا :

عليك استخدام ال views ضمن ال ms sql server

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

ولزيادة الامان يمكنك تغيير اسماء الحقول ضمن ال orm

#10

استخدام Prepared Queris أو ما يسمى بـ Parametrized Queris يحمي بشكل عملي جدا من هجمات SQL Injection

الفكرة قاءمة على كتابة استعلامات SQL بوجود قيم لم تحدد في الاستعلام، ثم ترجمة الاستعلام إلى Byte code ومن ثم إضافة القيم (يدخلها المستخدم) ودمجها لتنفيذ الاستعلام.

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…