صفحه اول > مقالات

 

 

حمله به برنامه هاي وبي (۳)

در بخش‌هاي پيشين از اين مجموعه مقالات تعدادي از روش‌هاي حمله به برنامه‌هاي وبي معرفي شدند. در ادامه به روش‌هايي که با استفاده از آنها مي‌توان به پايگاه داده سيستم نفوذ کرد اشاره مي‌شود.

تزريق 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 برمي‌گرداند.

اين خروجي اطلاعات ذيقيمتي در ارتباط با سرور شامل نام سرور، نام سرويس، نسخه سرور، سرويس پک و نسخه سيستم عامل را در اختيار هکر قرار مي‌دهد.