تزریق SQL
به زبان ساده این نوع حمله وارد کردن کد SQL به یک برنامه است، در شرایطی که توسعه دهنده برنامه قصد آن را نداشته و یا حتی پیشبینی آن را نیز نکرده باشد. ریشه این نوع حملات به ساختار طراحی ضعیف برنامه برمیگردد و تنها در مورد برنامههایی قابل انجام است که از روشهای ساخت رشته های SQL بهره میگیرند.
به مثال زیر توجه کنید:
Dim StrSQL as String = “SELECT CustomerID, CompanyName, ContactName, ” & –
“ContactTitle FROM Customers WHERE CustomerID = ‘” & txtCustID.Text & “‘”
در عبارت فوق با استفاده از روش ساخت رشته به صورت پویا یک رشته SQL تولید میشود که CustomerID با مقدار موجود در txtCustID جایگزین میشود. در شرایط عادی کاربر شناسه خود را در Box وارد مینماید، برنامه اقدام به جستجو در پایگاه داده نموده و پس از آن نتایج برای کاربر نمایش داده میشود. به عنوان مثال اگر کاربر شناسه ALFKI را وارد نماید نتایجی که برنامه تولید میکند به شرح زیر خواهد بود:
در چنین موردی کاربر میتواند در فرایند تولید عبارت SQL به گونهای دخالت کند که پیام خطا دریافت نماید. اگر خطای تولید شده به درستی در برنامه مدیریت نشود و این پیام به صورت کامل در اختیار کاربر قرار گیرد، اطلاعات بیشتری در خصوص عبارت SQL دراختیار کاربر قرار خواهد گرفت که مقدمه نفوذ به سیستم را فراهم میآورد. به عنوان مثال کاربر میتواند عبارت زیر را وارد نماید:
ALFKI’ or CustomerID like ‘%
با توجه به اینکه هیچگونه اعتبار سنجی بر روی داده ورودی کاربر انجام نمیشود، عبارت ساخت رشته SQL عبارت زیر را تولید خواهد نمود که در پی آن اجرا هم خواهد شد:
SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM Customers WHERE CustomerID = ‘ALFKI’ or CustomerID like ‘%’
در نتیجه اجرای این رشته SQL علاوه بر اطلاعات کاربر با شناسه ALFKI، اطلاعات تمام کاربران موجود در پایگاه داده نمایش داده میشود. در صورتی که در پایگاه داده سیستم اطلاعات حساس شخص مانند شماره کارت اعتباری ذخیره شده باشد، این اتفاق میتواند منجر به بروز یک فاجعه شود.
هکرها به روش دیگری نیز میتوانند با تزریق SQL به اطلاعات پایگاه داده دسترسی یابند. اگر رشته ALFKI’ or 1=1 — در صفحه وارد شود نتیجه دقیقا مشابه حالت قبل خواهد بود. در این صورت رشته SQLتولید شده، به صورت زیر میباشد:
SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM Customers WHERE CustomerID = ‘ALFKI’ or 1=1 —
دو خط فاصله (–) استفاده شده در عبارت در MS SQL Server مشخص کننده جملات توضیحات (Comments) هستند. این کار در My SQL با نماد (#) و در اراکل با نماد (;) انجام میشود. هکر قادر است هر رشتهای را در صفحه وبی وارد نماید، و در صورتی که اعتبار سنجی مناسب انجام نشود، بالقوه سایت در معرض خطرات فراوانی خواهد بود.
حمله SQL Union
برای دریافت اطلاعات بیشتر در مورد سرور حمله کنندگان به سایت میتوانند از عبارت Union استفاده نمایند. با وجودی که این نوع حمله بسیار سختتر بوده و دشواریهای خاص خود را به همراه دارد، ولی با این وجود غیر ممکن نیست. مهمترین محدودیت این نوع حمله در این است که هر دو عبارت پرس و جو باید یک تعداد ستونهای یکسانی را برگردانند و نوع داده ستونهای هر دو عبارت پرس و جو باید با هم سازگار باشند. این مسئله باعث میشود که حمله Union دشوارتر از سایر روشها باشد ولی با چند بار تلاش هکر میتواند موفق به گرفتن اطلاعات مورد نیاز خود شود. به عنوان مثالی از این نوع حمله فرض کنید هکر عبارت زیر را وارد مینماید:
ALFKI’ union select @@Servername —
در این صورت رشته SQL زیر تولید خواهد شد:
SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM Customers WHERE CustomerID = ‘ALFKI’ union select @@Servername –‘
این رشته منجر به تولید یک خطا در سمت سرور میشود و با توجه به مکانیزم کنترل خطا، احتمالا پیام تولید شده به کاربر نمایش داده میشود. در هر صورت هکر چند بار تلاش به شرح زیر انجام میدهد:
ALFKI’ union select @@Servername, @@Servicename, @@Version —
ALFKI’ union select @@Servername, @@Servicename, @@Servicename, @@Version —
با چندین بار تکرار و سعی و خطا بالاخره هکر میتواند به هدف خود رسیده و تعداد ستونهایی که توسط عبارت SQL برگردانده میشود را کشف نماید. با این کشف کنترل بیشتری بر روی عبارت union بعدی که نوشته میشود بوجود میآید. ورودی فوق عبارتی به شکل زیر تولید میکند:
SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM Customers WHERE CustomerID = ‘ALFKI’ union select @@Servername, @@Servicename, @@Servicename, @@Version —
با توجه به اینکه عبارت فوق یک عبارت معتبر SQL است، لذا SQL Server آن را اجرا نموده و مقادیر نتیجه را برای صفحه ASP.NET برمیگرداند.
این خروجی اطلاعات ذیقیمتی در ارتباط با سرور شامل نام سرور، نام سرویس، نسخه سرور، سرویس پک و نسخه سیستم عامل را در اختیار هکر قرار میدهد.
منبع: مرکز امداد امنیت کامپیوتر ایران