حفاظت بیگناه خروجی زیر از تزریق SQL
نویسنده:
اشفق انصاری

نقد و مرور:
رتبه:
5
بر اکتبر 19, 2012
تاریخ و زمان آخرین اصلاح شده:ژانویه 18, 2013

خلاصه:

راهنمای به نحوه جلوگیری از تزریق خروجی زیر در PHP. امن برنامه نویسی قواعد و توابع برای جلوگیری از تزریق SQL.

معرفی

 

این راهنمای مختصر در مورد نحوه حفاظت بیگناه خود را خروجی زیر پایگاه داده از تزریق SQL حملات.
 

تزریق SQL چیست?

 

همانطور که از نام آن پیداست, تزریق SQL زمانی اتفاق می افتد که کاربر تزریق عبارات SQL به درخواست شما.
 
چگونه این اتفاق می افتد?
 
می گویند که ما یک فرم ورود ساده که طول می کشد یک نام کاربری و رمز عبور, و تایید علیه پایگاه داده. اگر نام کاربری و رمز عبور معتبر, کاربر به سیستم وارد شده.
 

کد این می تواند چیزی شبیه به این:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?پی اچ پی
// کاربر و کلمه عبور از درخواست POST
$USER_NAME = $_POST[ 'نام کاربری' ];
$رمز عبور  = $_POST[ 'رمز عبور' ];

$پرس و جو = "SELECT FIRST_NAME, LAST_NAME, account_number از users_table که در آن نام کاربری = '$USER_NAMEو رمز عبور = '$رمز عبور' ";

$نتیجه = MYSQL_QUERY( $پرس و جو );

// بررسی کنید که آیا خروجی زیر هر چیزی در بر داشت, و بدست آوردن رکورد اگر موفق
اگر ( mysql_num_rows( $نتیجه ) > 0 ) {
    $اطلاعات = mysql_fetch_assoc( $نتیجه );
    پژواک 'خوش آمدید' . $کاربر . '!';
    پژواک شماره حساب شما: ' . $اطلاعات[ account_number ' ] . '';
} //چاپ از پیام errorr است
دیگر {
    پژواک 'نام کاربری یا رمز عبور صحیح نیست! لطفا دوباره سعی کنید!';
}
?>

 

اسکریپت بالا خوب کار می کند و این اجازه خواهد داد که کاربران واقعی وارد سایت شدید با وارد کردن نام کاربر و رمز عبور خود را به شماره حساب بانکی خود را برای دیدن.
 

بیایید فرض کنیم که من را وارد کنید “نسخه ی نمایشی” به عنوان نام کاربری من, و “demopass” به عنوان رمز عبور من, پس از پرس و جوی SQL است که به خروجی منتقل می خواهد مثل این به نظر می رسد:
 

1
را انتخاب کنید FIRST_NAME, LAST_NAME, account_number از users_table مکانی که در آن نام کاربری = 'نسخه ی نمایشی' AND رمز عبور = Demopass ' ;

 

اگر داده های ورودی ما این است که با موفقیت در پایگاه داده معتبر, پس از آن ما خواهد شد به سیستم وارد شده و ما خواهد بود با شماره حساب دیگری ارائه شده ما دسترسی به سیستم را می کنید و ما خواهد بود با یک پیغام خطا ارائه شده “نام کاربری و یا رمز عبور صحیح نیست! لطفا دوباره سعی کنید!
 

مشکل هنگامی که یک کاربر مخرب وارد شخصیت های دیگر که به منظور خاتمه دادن به عبارت SQL.
 

بیایید فرض کنیم که یک کاربر تلاش می کند تا به عنوان نام کاربری وارد شوید dem'o و رمز عبور demopass.
 

اکنون, بیایید ببینید که چگونه دستور SQL به نظر می رسد مانند.
 

1
را انتخاب کنید FIRST_NAME, LAST_NAME, account_number از users_table مکانی که در آن نام کاربری = 'dem'oو رمز عبور = 'demopass' ;

 

هنگامی که خروجی زیر اجرای بیانیه, آن را فقط درمان “dem” به عنوان نام کاربری و هنگامی که آن دیگری برخورد ‘o', سپس آن را رفتار ‘o‘ به عنوان یک دستور SQL و آن را پرتاب و پیام خطا را به عنوان آن را به رسمیت می شناسد ‘o‘ به عنوان یک دستور SQL معتبر.
 
ERROR 1064 (42000): شما دارای یک اشکال در نحو گذاشتن شما; برای نحو حق به نزدیک 'O استفاده کنید به کتابچه راهنمای کاربر که مربوط به نسخه MySQL سرور شما را بررسی کنید’ و رمز عبور =”demopass”; ” در خط 1
 

عالی. پیغام خطا در بالا بیان می کند که برخی از اشکال در نحو گذاشتن وجود ندارد. اگر مظنه سحر و جادو فعال شد, پس ما ممکن است که پیغام خطا در بالا نمی کردم.
 

اکنون, بیایید ببینید که اگر کاربر مخرب وارد نام کاربری به عنوان چه اتفاقی می افتد (‘ OR '1' = '1) و رمز عبور “demopass“.

پرس و جو SQL خواهد شد شبیه به این:

1
را انتخاب کنید FIRST_NAME, LAST_NAME, account_number از users_table مکانی که در آن نام کاربری = '' OR '1 '='1 ' AND رمز عبور = Demopass ' ;

 

چه معنی پرس و جو بالا SQL? این خروجی زیر نشان می دهد برای پیدا کردن همه ردیف با نام کاربری برابر “” (سفید) یا (1= 1) و یک رمز عبور برای برابری “demopass“.
 

اجازه دهید به پرس و جو بالا SQL را نشان منطقی تر به درک آنچه در واقع با بیانیه SQL اشتباه:
 

نام کاربری = “” OR “1= 1” و رمز عبور = “demopass”
 

اکنون, ما در حال حاضر می دانیم که 1 = 1 است که همیشه برای رفتن به TRUE. از این رو, کاربر قادر خواهد بود برای ورود به سیستم در صورتی که رمز عبور صحیح است و نام کاربری اشتباه است.
 

بیایید سناریو وخیم تر با یک رشته حمله های مختلف تجزیه و تحلیل.
 

حمله عبارات: ‘ OR 1 = 1–
 

لطفا توجه داشته باشید که ( و #) استفاده می شود خاتمه بیانیه SQL. اجازه دهید رشته حمله در یک پرس و جوی SQL قرار داده و ببینید که چگونه بیانیه پایانی SQL خواهد نگاه.
 

اکنون, ما فرض کنیم که حمله می کند حتی نمی دانند که رمز عبور.
 

1
را انتخاب کنید FIRST_NAME, LAST_NAME, account_number از users_table مکانی که در آن نام کاربری = '' OR 1=1--و رمز عبور = 'idonotknow' ;

 

ببینید که چگونه عبارت SQL است که خروجی زیر تفسیر.
 

نام کاربری = “” OR 1 = 1– و رمز عبور = “idonotknow”
 

لطفا توجه داشته باشید در بیانیه ای بالا. همانطور که می دانیم بیانیه نابودگر در SQL و 1= 1 است که همیشه درست, پس از بیانیه نابودگر بقیه پرس و جوی SQL اجرا نخواهد شد.
 

از این رو, تمامی پرونده را در جدول بازگشت و کاربر به سیستم وارد شده. مهاجم قادر خواهد بود برای دیدن شماره حساب اولین رکورد در پایگاه داده.
 

بیایید کمک به خروجی زیر بی گناه
 

مظنه سحر و جادو

 

مظنه سحر و جادو یکی از ویژگی های بحث برانگیز از زبان برنامه نویسی پی اچ پی, در آن کاراکترهای خاص آمادگی به پایان رسید با یک بک اسلش قبل از اینکه در گذشت.
 

مظنه سحر و جادو به طور پیش فرض در تاسیسات جدید فعال شد PHP3 و PHP4, و از آنجا که عملیات خود را در پشت صحنه و نه بلافاصله آشکار, توسعه دهندگان ممکن است غافل از وجود خود و مشکلات احتمالی که آنها می توانند معرفی.
 

ما باید به نوبه خود در مظنه سحر و جادو به فایل php.ini اجرا شده فایل را در ریشه وب سایت وب سایت.
 

چگونه مظنه سحر و جادو کمک می کند?

 

ما نیاز به فرار از این شخصیت های اعلان ( هر دو به نقل از یک و دو, و همچنین بک اسلش).
این است که با قرار دادن یک علامت ممیز در مقابل آنها انجام می شود.
 

So usename = dem'o می شود DEM 'درجه , و خروجی زیر می تواند کار کند که با علامت نقل قول آن را به عنوان است “محفوظ” توسط اسلش.
 

بیایید ببینید چه اتفاقی می افتد زمانی مظنه سحر و جادو روشن است. بیایید ببینید که چگونه حمله با نقل قول سحر و جادو را تحت تاثیر قرار.
 

1
را انتخاب کنید FIRST_NAME, LAST_NAME, account_number از users_table مکانی که در آن نام کاربری = '\' OR 1 = 1 - AND رمز عبور = 'Idonotknow' ;

 

نام کاربری به عنوان تفسیر: \’ OR 1 = 1–

که کاملا پرس و جو SQL فرار, هیچ چیز می تواند تزریق. magic_quotes_gpc فرار نقل قول تنها خطرناک برای ما. از این رو, مهاجم قادر خواهد بود برای ورود به سیستم.

مسائل را با نقل قول سحر و جادو

 

به نقل از سحر و جادو فقط قبل از چند کاراکتر بک اسلش وارد, چیزی بیشتر. این از ما محافظت از تزریق SQL تنها در برخی موارد خاص مانند و تنها توسط شرکت بروز. اگر ما display_errors را بر, ما فقط ساخته مهاجم با جزئیات پایگاه داده خود را درست قبل از اینکه چشم خود را بسیار خوشحال خروجی است. حتی اگر شما نمی کنند, هنوز امکان تزریق SQL کور و با استفاده از روش های تزریق SQL پیشرفت وجود دارد آن است که ممکن است به دور زدن magic_quotes_gpc تابع.
 
پس, ما نیاز به یک راه فرار داده است که پیش فرض نیست, است که به عنوان مستعد ابتلا به مسائل مربوط به مجموعه کاراکتر نیست, است و مستعد ابتلا به سحر و جادو پرورش به نقل از چاک دار نیست.
 
به نوامبر 2005 هسته توسعه دهندگان پی اچ پی تصمیم گرفت در حساب از این مشکلات که به نقل از سحر و جادو ویژگی خواهد بود از پی اچ پی حذف 6.
هنگامی که به نقل از سحر و جادو ویژگی های خارج, پس از رفتن به برخی از مشکلات عمده برداشت تا وجود دارد.
 

تزریق SQL کاهش
 

تعدادی از راه هایی برای جلوگیری وجود دارد خروجی زیر تزریق درون پی اچ پی. رایج ترین راه ها با استفاده از توابع مانند معکوس addslashes() و mysql_real_escape_string().
 

معکوس addslashes()

 

معکوس addslashes() یک رشته با یک بک اسلش قبل از شخصیت های که نیاز به پایگاه داده نمایش داده شد به خوبی بررسی بازگشت. این شخصیت ها هستند به نقل از تک (‘ = ’) به نقل از دو (” = ”) و nullbyte (%00 = \0).
 

معکوس addslashes() فقط کار خواهد کرد اگر رشته پرس و جو به نقل از پیچیده. یک رشته مانند زیر هنوز هم در معرض خطر تزریق SQL:
 

1
2
3
$USER_NAME = معکوس addslashes( $_POST[ 'نام کاربری' ] );
$رمز عبور  = معکوس addslashes( $_POST[ 'رمز عبور' ] );
$پرس و جو = "SELECT FIRST_NAME, LAST_NAME, account_number از users_table که در آن نام کاربری = '$USER_NAMEو رمز عبور = '$رمز عبور' ";

mysql_real_escape_string()

 

mysql_real_escape_string() کمی قوی تر از معکوس addslashes() آن را به عنوان تابع کتابخانه خروجی زیر تماس mysql_real_escape_string, است که prepends بک اسلش به شخصیت های زیر: \X00, \N, \تحقیق, \, ', ” و x1a،.
 

همانطور که با معکوس addslashes(), mysql_real_escape_string() فقط کار خواهد کرد اگر رشته پرس و جو به نقل از پیچیده. یک رشته مانند زیر هنوز هم در معرض خطر تزریق SQL:
 

1
2
3
$USER_NAME = mysql_real_escape_string( $_POST[ 'نام کاربری' ] );
$رمز عبور  = mysql_real_escape_string( $_POST[ 'رمز عبور' ] );
$پرس و جو = "SELECT FIRST_NAME, LAST_NAME, account_number از users_table که در آن نام کاربری = '$USER_NAMEو رمز عبور = '$رمز عبور' ";

 

sprintf()

 

sprintf() را می توان با مشخصات تبدیل استفاده می شود تا اطمینان حاصل شود که استدلال پویا درمان راه آن فرض به درمان می شود. مثلا, اگر یک تماس برای شماره ID کاربران در رشته, %بازدید کنندگان می تواند مورد استفاده قرار گیرد برای اطمینان از این استدلال به عنوان یک رشته درمان. نمونه ای از این است به شرح زیر است:
 

1
2
3
$USER_NAME = $_POST[ 'نام کاربری' ];
$رمز عبور  = $_POST[ 'رمز عبور' ];
$پرس و جو = sprintf("SELECT FIRST_NAME, LAST_NAME, account_number از users_table که در آن نام کاربری = '%بازدید کنندگانو رمز عبور = '%بازدید کنندگان' ", $USER_NAME, $رمز عبور);

 

htmlentities($بود, ENT_QUOTES)

 

htmlentities() در رابطه با پارامتر اختیاری quote_style دوم, اجازه می دهد تا استفاده از ENT_QUOTES, که هر دو به نقل از دو جداره و تک تبدیل. این به این معنا همان کار خواهد کرد معکوس addslashes() و mysql_real_escape_string() در رابطه با علائم نقل قول, اما, به جای prepending یک بک اسلش, آن را به نهاد HTML از علامت نقل قول استفاده کنید.
 

علاوه بر استفاده از ENT_QUOTES در داخل htmlentities(), پارامتر سوم را می توان مجموعه ای که مجبور به استفاده از یک شخصیت مجموعه ای در داخل تبدیل. این کمک خواهد کرد که متوقف کردن نتایج پیش بینی نشده از استفاده از چند بایتی شخصیت در شخصیت مجموعه مانند BIG5 و GPK.
 

در زیر یک مثال از کد که برای کمک به جلوگیری از تزریق SQL در پی اچ پی.
 

1
2
3
4
5
$USER_NAME = $_POST[ 'نام کاربری' ];
$USER_NAME = htmlentities( $USER_NAME, ENT_QUOTES, 'UTF-8' );
$رمز عبور  = $_POST[ 'رمز عبور' ];
$رمز عبور  = htmlentities( $رمز عبور, ENT_QUOTES, 'UTF-8' );
$پرس و جو = "SELECT FIRST_NAME, LAST_NAME, account_number از users_table که در آن نام کاربری = '$USER_NAMEو رمز عبور = '$رمز عبور' ";

 

بهینه سازی کد SQL

 

سرورهای پایگاه داده جانوران پیچیده هستند و آنها را به قابلیت های بسیار بیشتر از شما نیاز دارید. تا آنجا که به امنیت مربوط می شود, تر است هرگز بهتر. مثلا, the xp_cmdshell روش های ذخیره شده در گسترش SQL MS دسترسی به پوسته می دهد و این تنها چیزی است که رویاهای هکر است. این است که چرا شما باید این روش و هر گونه قابلیت های دیگر را غیر فعال کنید, که به راحتی می تواند سوء استفاده شود. فقط حذف و یا حداقل غیر فعال کردن هر گونه قابلیت شما می توانید بدون انجام.
 

غیر فعال کردن پیش فرض پیام خطا در SQL

 

پیام های خطا به مهاجم مفید هستند چرا که آنها اطلاعات بیشتری در مورد پایگاه داده و SQL نمایش داده شد را. و تمام حملات SQL معمولا بر اساس نوع خطا صادر شده توسط SQL, به این معنی که نوع خطا تصمیم می گیرد که در روش هکرها برای هک کردن وب سایت و یا نرم افزار. راه حل بهتر این است که امنیت سازش نیست، خواهد بود برای نشان دادن یک پیغام خطا عمومی که به سادگی بیان می خطایی رخ داده است.
 

ذخیره اعتبارنامه پایگاه داده ایمن

 

به منظور به حداقل رساندن خسارت در صورت حمله تزریق SQL, همیشه اعتبار پایگاه داده ذخیره در یک فایل رمزگذاری شده جداگانه. در حال حاضر حتی اگر یک هکر موفق به شکستن در, او نمی خواهد به نفع زیادی که او نمی تواند در پایگاه داده خود را انجام دهید بسیار.
 

از کمترین امتیازی اصل استفاده کنید

 

اصل حداقل امتیاز بسیار مفید است و آن را به صدق تزریق SQL و همچنین. همیشه فکر می کنم و یا دو بار در مورد آنچه تیک بزنید. امتیازات شما در حال ارائه به کاربر یا هدف. فرض کنید شما رنگ پریده به فراهم کردن دسترسی مدیر به کاربران, بنابراین تنها او را دسترسی به این جداول که او / او باید ارائه, و نه از اثبات او را از دسترسی به کل پایگاه داده. اگر شما مجبور به فراهم کردن دسترسی به یک سیستم, بهتر است خود را به ایجاد فضاهای جدول قسمتبندی شده در داخل پایگاه داده ها و فراهم کردن دسترسی تنها به فضای میز خاص. این روش خواهد شد سطح حمله به شدت کاهش می دهد.
 

غیر فعال کردن پوسته

 

بسیاری از بانکهای اطلاعاتی ارائه دسترسی به پوسته به بانک اطلاعاتی است که اساسا همان چیزی است که مهاجم یا هکر نیازهای. به این دلیل که شما نیاز به بستن این راه گریز باز. هر ارائه دهنده خدمات روش های مختلف به غیر فعال کردن اجرای پوسته در پایگاه داده خود. بنابراین مستندات به پایگاه داده های خود را در مورد چگونگی غیر فعال کردن دسترسی به پوسته برای جدول پایگاه داده و یا فضای خاص خود و یا جدول خاص مشورت.
 

استفاده از ابزارهای تزریق SQL برای بررسی آسیب پذیری

 

تاریخ و زمان آخرین اما نه کم, فکر می کنم مثل هکر. چگونه یک هکر می تواند پایگاه داده من از طریق هک تزریق SQL, چه ابزارها و تکنیک های او می توانید استفاده کنید برای پیدا کردن نقاط ضعف. شما همیشه باید یک اجرای خشک ابزار هک تزریق SQL مانند SQLI, Haviz, SQL injectme غیره. اگر شما می توانید اسکنر آسیب پذیری شبکیه چشم استطاعت و سپس خود را بیش از حد خوب. همانطور که آن را از تمام موضوعات در معرض آسیب پذیری شامل.

از شما بسیار سپاسگزارم. من امیدوارم که همه شما باید ازش لذت برد. لطفا برای دادن نظر به طوری که ما می توانیم بهتر انجام دهید اینجا را کلیک کنید.

 
 

28,918 نمایش کل, 17 بازدید های امروز

دو زبانه زیر محتوای زیر تغییر.

اشفق انصاری

محقق امنیتی
اشفق انصاری بنیانگذار است HackSys تیم کد نام "Panthera". او یک محقق امنیتی با تجربه در جنبه های مختلف امنیت اطلاعات می باشد. او نویسنده "HackSys افراطی درایور آسیب پذیر" و "شل کد از مرگ". او همچنین نوشته شده است و whitepapers مختلف در سطح پایین بهره برداری نرم افزار منتشر شده. علاقه او نهفته در هسته "بهره برداری سطح پایین", "مهندسی معکوس", "تجزیه و تحلیل برنامه" و "ترکیبی fuzzing در". او fanboy هوش مصنوعی و یادگیری ماشین است. او به فصل برای است تهی پونا.

پاسخ دهید لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *