انجمن انیاک
آموزش sql injection - نسخه‌ی قابل چاپ

+- انجمن انیاک (http://forum.learninweb.com)
+-- انجمن: آموزش های تصویری (/forumdisplay.php?fid=7)
+--- انجمن: آموزش تصویری SQL Server (/forumdisplay.php?fid=17)
+--- موضوع: آموزش sql injection (/showthread.php?tid=392)



آموزش sql injection - learninweb - 03-03-2013 08:40 AM

تزریق به پایگاه داده یا sql injection :
تزریق به پایگاه داده (به انگلیسی: SQL injection)‏ نوعی فن تزریق کد است که نقص امنیتی نرم‌افزار وب‌سایت را اکسپلویت می‌کند به این صورت که نفوذگر با یک سری دستورهای اس‌کیوال عملیاتی را (متفاوت با عملیات عادی موردنظر طراح وبسایت) در پایگاه داده وب‌سایت آسیب‌پذیر انجام می‌دهد.

این آسیب‌پذیری جزو ده آسیب‌پذیری رایج نرم‌افزار‌های وب در سال ۲۰۰۷ و ۲۰۱۰ برشمرده شده‌است.

تزریق SQL یک روش حمله است که هدف آن داده های ساکن در یک پایگاه داده می باشد که از طریق FireWall محافظت می شود. حمله معمولا به علت مدیریت ضعیف در اعتبار سنجی کدها و یا ورودیهای برنامه (وب سایت) اتفاق می افتد. حمله تزریق SQL زمانی اتفاق می افتد که یک مهاجم قادر به قرار دادن یک سری از عبارتهای SQL در یک Query (پرس و جو) با دستکاری داده های ورودی کاربر در یک برنامه مبتنی بر وب می باشد. البته این مساله نیز مستقیما با نحوه مدیریت کدها و ورودیهای وب سایت رابطه مستقیم دارد. یک حمله کننده می تواند از نقصهای برنامه نویسی و یا حفره های امنیتی وب سایت و یا نرم افزار به راحتی برای دستیابی به اطلاعات یک پایگاه داده استفاده نماید.

پرس و جوی معمول دارای چند بخش مختلف به شرح ذیل می باشد:

1.دستور Select: با استفاده از این دستور ستونهایی که مورد نظرمان است را انتخاب می نمائیم.
2.From : که مشخص می نماید که ستونهای مورد نظر ما از کدام جدول انتخاب شوند
3.Where: که در آن شروطی را مشخص می نمائیم.
4.و یک سری دستورات و عبارها و متدهای دیگر . . .
حملات تزریق از طریق SQL فقط در بخش شرطی Where اتفاق می افتند. در ادامه توضیح خواهیم داد که این مساله چگونه رخ می دهد.

این آسیب‌پذیری از راه‌های گوناگونی پدید می‌آید. یک طریق فیلترنشدن Escape characterها (" و ') است. برای مثال:
کد:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
کار این کد استخراج اطلاعات یک نام کاربری (که به متغیر داده می‌شود) از جدول users است. اما نفوذگر می‌تواند با دادن مقدارهایی هوشمندانه به متغیر userName، سبب اجرای دستورهایی متفاوت از آنچه موردنظر کدنویس بوده‌است بشود. برای مثال با وارد کردن این کد به عنوان ورودی:
کد:
' OR 'a'='a
کد نهایی اینچنین رندر می‌شود:
کد:
SELECT * FROM users WHERE name = '' OR 'a'='a';
همچنین می‌توان با یکی از این سه روش، ادامهٔ کد را کامنت گرفت
کد:
' OR 'a'='a' -- '
' OR 'a'='a' ({ '
' OR 'a'='a' /* '
که نتیجه چنین است:
کد:
SELECT * FROM users WHERE name = '' OR 'a'='a' -- ';
مثلاً ممکن است در کدی، ادامهٔ کد مربوط به بررسی گذرواژه باشد، در آن حالت با این کار آن بخش از کد کامنت گرفته می‌شود و پردازش نمی‌شود، و نفوذگر بدون واردکردن گذرواژه از مانع می‌گذرد.

یا مثلاً واردشدن چنین عبارتی:
کد:
a'; DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
سبب حذف جدول users و نیز استخراج تمام اطلاعات جدول userinfo می‌شود.

در ژوئیهٔ ۲۰۱۲ گروهی تحت عنوان D33D با نفوذ به زیردامنه‌ای از یاهو، Yahoo Voices، به همین شیوه، گواهی‌نامه‌های لاگین بیش از ۴۵۰۰۰۰ کاربر این وب‌گاه را ربودند.[۳]

منبع : ویکی پدیا

. استفاده از پارامترهاي ورودي علاوه بر اين که کار را ساده‌تر مي‌کند و قابليتهاي بيشتري به روالهاي ذخيره شده مي‌دهد از بروز حمله SQL Injection نيز جلوگيري مي‌کند.
براي درک حمله SQL Injection به يک مثال توجه کنيد. فرض کنيد که يک سايت وب داريد که در آن کاربر مي‌تواند نام مشتري را وارد کند تا آدرس و تلفن آن نمايش داده شود. در برنامه ASP يا PHP خود حتماً کدي مشابه کد زير خواهيد داشت که در آن مقدار وارد شده توسط کاربر در متغير CusName ذخيره مي‌شود.
کد:
sql = "Select * from customer where name= ' "
sql = sql + CusName
sql = sql + " ' "

sql = "Select * from customer where name= ' "
sql = sql + CusName
sql = sql + " ' "
در اين کد متغير CusName عبارتي است که کاربر وارد کرده است. فرض کنيد يک کاربر عبارت زير را وارد کند.
کد:
Ali' ; Drop Table Customer  - -
با اين کار دستور SQL شما بصورت زير مي‌شود.
کد:
Select * from customer where name = 'Ali' ; Drop Table Customer  - - '
به اين ترتيب
SQL Server سه دستور زير را اجرا مي‌کند:
کد:
Select * from customer where name = 'Ali' ;
Drop Table Customer
- - '
دستور خط اول به دنبال رکوردهاي که داراي نام Ali هستند مي‌گردد. دستور خط دوم جدول Customer را حذف مي‌کند و توسط دستور خط آخر کاري انجام نمي‌شود زيرا دو کاراکتر منها در کنار يکديگر نشان دهنده توضيحات يا Comment هستند و کدي اجرا نمي‌شود.

به اين ترتيب يک کاربر حرفه‌اي به سادگي مي‌تواند اطلاعات شما را حذف کند ( و بسياري کارهاي ديگر). در صورتيکه شما از روالهاي ذخيره شده داراي پارامتر استفاده کنيد ديگر چنين اتفاقي نمي‌افتد و توسط دستور وارد شده رکوردهائي که نام آنها برابر عبارت Ali' ; Drop Table Customer - - است نمايش داده مي‌شود.

منبع : آموزش SQL Server انتشارت پیروز الوان - تولید کننده نرم افزارهای آموزشی انیاک