کدهای مخربی که تزریق میشوند و همه را قربانی خود میکنند
در دنیای مجازی هر مولفهای آسیبپذیر بوده و هر لحظه این احتمال وجود دارد که خبری در ارتباط با شناسایی یک آسیبپذیری روز صفر منتشر شود؛ رخنههایی که هم میانافزارهای نصبشده درون دستگاههای سختافزاری و هم نرمافزارها و هسته سیستمعاملها را شامل میشوند. یکی از قدرتمندترین و کاربردیترین روشهایی که هکرها برای حمله به نرمافزارها و زیرساختهای یک شبکه از آن استفاده میکنند، حمله تزریق کد است. حملهای که ما در اصطلاح رایج با نام حمله تزریق کد SQL آن را میشناسیم. حملهای که به هکرها اجازه میدهد از طریق اجرای دستورات سادهای اطلاعات درون بانکهای اطلاعاتی و سایتها را مخدوش کنند. اما حمله تزریق کد و در راس آن تزریق کد SQL چیست و چرا تا این اندازه خطرناک است؟ در ادامه سازوکار این حمله را به شما نشان میدهیم تا با اقدامات دفاعی مناسب مانع از آن شوید که هکرها از این بردار حمله برای آسیب رساندن به شما استفاده کنند.
افزونه محبوبی که رخنه تزریق کد در آن مستتر بود
اواخر سال گذشته میلادی، پژوهشگران امنیتی خبر از شناسایی آسیبپذیری در افزونه NextGenEditor دادند. آسیبپذیری که به هکرها اجازه میداد، فرایند تزریق کد SQL را به مرحله اجرا درآورند. این افزونه رایگان به طراحان وب اجازه میدهد سایتهای جوملا خود را بهراحتی طراحی کنند. افزونهای که نهتنها 40 ویجت قدرتمند در اختیار دارد، بلکه به قابلیتهای دیگری همچون inlineediting ،pagebuilder و.... نیز تجهیز شده است. حفره امنیتی شناساییشده در این پلاگین به هکرها اجازه میدهد تا فرایند تزریق کدهای SQL را مطابق با ترکیب نحوی زیر به مرحله اجرا درآورند.
بدافزار دستگاههای اینترنت اشیایی که کدهای SQL را به سامانهها تزریق میکند
کارشناسان شرکت امنیتی دکتر وب در نمونه دیگری موفق به شناسایی بدافزاری شدند که دستگاههای اینترنت اشیا را هدف قرار داده بود. بدافزاری که سرور پروکسی SOCKS را روی دستگاههای آسیبپذیر فعال میکرد. این بدافزار که Linux.ProxyM نام دارد، بیش از یک سال است که به شکل پنهان به درون دستگاههای اینترنت اشیا آسیبپذیر واردشده و بیشتر برای ارسال هرزنامهها مورداستفاده قرار میگیرد. مکانیزم کاری بدافزار فوق به این شکل است که دستگاههای آسیبپذیر را شناسایی میکند و به هکرها این توانایی را میدهد تا ردپای دیجیتالی خود را پنهان کرده و پروکسی SOCKS را برای فعالیتهای مجرمانه خود راهاندازی کنند. بر اساس پژوهش انجامشده این شرکت امنیتی، نشان میدهد این بدافزار دستگاههای اینترنت اشیایی را که از معماری آرم، x86، PowerPC، MIPSEL، MIPS، Motorola 68000، Superh و SPARC استفاده میکنند، هدف قرار میدهد. پژوهشگران امنیتی دکتر وب در این ارتباط گفتهاند: «تحلیلهای ما نشان میدهد، بدافزار یادشده این پتانسیل را دارد تا هر نوع دستگاه لینوکسی را همچون روترها، ستاپ باکسها (set-top boxes) و تجهیزات سختافزاری مشابه آلوده کند. این بدافزار فقط در یک ماه (سپتامبر) موفق شد از طریق دستگاههای آلوده بهطور روزانه 400 پیام را تولید کرده و برای کاربران مختلف ارسال کند. اما در ادامه هکرها الگوی کاربری خود را تغییر دادند و از باتنت فوق بهمنظور ارسال پیامهای فیشینگ استفاده کردند.
ایمیلهای ارسالی برای کاربران در ظاهر از سوی سرویس DocuSign ارسال شده بود. سرویس یادشده به کاربران اجازه میدهد وضعیت سندهای الکترونیکی خود را مورد بررسی قرار دهند.» اما از ماه دسامبر سرور پروکسی بدافزار Linux.ProxyM تغییر کاربری داد و به سراغ تزریق کدهای SQL و جاوا اسکریپت میان سایتی رفت. تکنیکهایی که برای نفوذ به سایتها مورد استفاده قرار میگیرد. دکتر وب گزارش میدهد، این بدافزار تنها در ماه نوامبر روزانه 40 هزار حمله را ترتیب داده است. در ادامه شدت و قدرت این حملات افزایش پیدا کرد و این بدافزار موفق شد، 7 دسامبر 20 هزار حمله را ترتیب دهد. حملاتی که عمدتا بر مبنای تزریق کد SQL به مرحله اجرا درآمده بودند. اما تکنیک تزریق کد (SQL) چیست که تا به این اندازه خطرناک است؟
حمله تزریق کد چیست؟
شایعترین حملهای که سایتهای اینترنتی را تهدید میکند، حمله تزریق اسکریپت Cross Site Scripting است. حملهای که به نام XSS معروف است. زمانی که کدهای جاوا اسکریپت با موفقیت به درون سایتی تزریق شوند، درون مرورگر کاربر اجرا میشوند و به این شکل اطلاعات زیادی از کاربران به دست میآورند. در حملات تزریق کد، هکرها ابتدا سعی میکنند یک آسیبپذیری در سایت هدف پیدا کنند، در مرحله بعد سعی خواهند کرد از طریق بخش دیدگاهها یا فیلدهایی که درون سایتها قرار دارد یا از طریق کادرهای جستوجو کدهای مخرب خود را اجرا کنند. درحالیکه این کدها شبیه به کدهای عادی سایتها به نظر میرسند، اما در عمل تنها برای مقاصد مخرب مورد استفاده قرار میگیرند. پس از تزریق موفقیتآمیز اسکریپتها درون سایت، هکرها این شانس را به دست میآورند تا به بانک اطلاعاتی سایت (مکانی که اطلاعات مربوط به کاربران درون آن ذخیرهشده است) دسترسی پیدا کنند. در آخرین گام هکرها اطلاعات را به سرقت میبرند. این حمله بهاندازهای قدرتمند است که تنها از طریق یک صفحه از سایت قابل اجرا است. (شکل 1)
حمله تزریق کد SQL injection چیست؟
تکنیک موسوم به حمله تزریق کد به حملاتی اشاره دارد که روی برنامههای مبتنی بر دادهها (برنامههایی که بهطور مستقیم با بانکهای اطلاعاتی در ارتباط هستند) و سایتهایی انجام میشود که فیلدهای ورودی در اختیار کاربران قرار میدهند تا ورودیهای خود را در آنها وارد کنند. در این فیلدها اگر مکانیزمهای ارزیابی و اعتبارسنجی به شکل درستی به کار گرفته نشود، کدهای مخرب که در اصل دستورات و عبارات عادی SQL هستند، در یک فیلد وارد شده و اجرا میشوند. درحالیکه این بردار حمله رویکرد جدیدی نیست و قدمتی نسبتا زیاد دارد اما هنوز به اشکال مختلف همچون تزریق کتابخانه پویا (Dll Injection) مشابه با حملهای که ویروس استاکس نت از آن بهره برد، مورد استفاده قرار میگیرند. در مکانیزم حمله تزریق کد هکرها سعی میکنند با وارد کردن کدهای تزریقی مخرب اطلاعات وارد شده در کادرهای متنی مانند گذرواژهها و نامهای کاربری را به سرقت ببرند. اما برای اینکه یک حمله تزریق کد موفقیتآمیز باشد ابتدا باید حفرههای امنیتی در یک نرمافزار یا سایت شناسایی شوند. در تکنیک حمله تزریق کد این مقادیر ورودی هستند که نقش کلیدی را بازی میکنند. اگر طراحان بانکهای اطلاعاتی و برنامهنویسان سایتها یا برنامههای کاربردی تدابیر لازم را برای اعتبارسنجی فیلدهای ورودی مورد توجه قرار نداده باشند، هکرها بهراحتی میتوانند این مدل حملات را پیادهسازی کرده و در بهترین حالت به حسابهای کاربری و انواع مختلفی از گواهینامههای تصدیق هویت دسترسی پیدا کرده و در بدترین حالت اطلاعات درون بانکهای اطلاعاتی را پاک کرده یا محتوای آنها را با محتوای جعلی جایگزین کنند. اما همانگونه که اشاره شد، در این تکنیک ابتدا باید رخنه امنیتی در یک برنامه کاربردی یا سایت شناساییشده و استخراج شود. برای مثال، اگر ورودی دریافتی از کاربر بهدرستی در خصوص کاراکترهای پایان دهنده یک رشته مورد بررسی قرار نگرفته شده باشد یا در یک دستور SQL از فیلترها بهدرستی استفاده نشده باشد یا ورودی کاربر از نوع مقادیر صریح نباشد، در این حالت هکرها بهراحتی میتوانند دستورات مختلفی را اجرا کنند که نتایج حاصل از اجرای این دستورات غیرقابلپیشبینی خواهد بود. حمله تزریق کد عمدتا بهصورت یک بردار حمله روی وب سایتها پیادهسازی میشود، هر چند میتواند بر روی هر بانک اطلاعاتی رابطهای نیز پیادهسازی شود. آمار منتشر شده از سوی موسسه امنیتی Imperva نشان میدهد، میانگین حملات انجام گرفته روی برنامههای وب بهطور متوسط از چهار حمله در ماه فراتر رفته است. درحالیکه حمله تزریق کد SQL در خلال سالهای 2007 تا 2010 به یکی از 10 تکنیک حملهای تبدیلشده بود که برنامههای وب را هدف قرار داده بودند اما در نهایت پس از یک وقفه چند ساله دومرتبه در صدر حملات رایج قرار گرفته است که این بار نهتنها برنامههای کاربردی و سایتها بلکه تجهیزات اینترنت اشیا را نیز هدف قرار دادهاند. حملاتی که بهصورت برداری انجام میشوند، شامل پنج زیرکلاس اصلی بوده که هر کدام به گونه خاصی از نحوه پیادهسازی این مدل حملات اشاره دارند.
Classic SQLIA،
Inference SQL injection،
Interacting with SQL injectio،
Database management system-specific SQLIA،
Compounded SQLIA،
SQL injection + insufficient authentication،
SQL injection + DDoS attacks،
SQL injection + DNS hijacking،
SQL injection + XSS
و SQL injection + Filter bypass + Havij + Backtrack R6
همگی در زیرمجموعه حملات تزریق کد SQL قرار میگیرند. نکته در ارتباط با خود SQL است. زمانیکه صحبت از SQL به میان میآید، منظور بانک اطلاعاتی SQL Server نیست، بلکه منظور بانکهای اطلاعاتی است که از ترکیب نحوی زبان ساختارمند پرسشها SQL (سرنام Structure Query Statement) استفاده میکنند.
حمله تزریق کد چگونه پیادهسازی میشود؟
در این مکانیزم حمله، هدف دادههای قرار گرفته در یک بانک اطلاعاتی است. دادههایی که در حالت عادی و بهواسطه وجود دیوارهای آتش دسترسی آزاد به آنها امکانپذیر نبوده و در نتیجه هکرها بهراحتی نمیتوانند تغییری در آنها به وجود آورند. در این حالت نفوذگران با استفاده از محاورههای ساختارمند سعی میکنند بهنوعی دادهها را دستکاری کنند. اما قبل از پرداختن به این موضوع ابتدا بهتر است با ترکیب نحوی یک پرس و جوی ساده و استاندارد SQL آشنا شوید. یک پرسوجو ساده و استاندارد میتواند بهصورت زیر در یک برنامه کاربردی تعریف شود.
Select * From Persons Where username=’” ”;
Select: این دستور بهمنظور بازگرداندن مقادیر مشخصی از جدول یا جدولهای یک بانک اطلاعاتی مورد استفاده قرار میگیرد.
From: در این بخش از محاوره جدول یا جدولهای موردنیاز که دادهها از درون آنها باید استخراج شوند، مشخص میشوند.
Where: شرطی است که با استفاده از آن رکوردهای موردنظر برگردانده میشوند. در این حالت نتیجه پرسوجو مطابق با همان چیزی است که کاربر آن را تعیین کرده است. با استفاده از این شرط بهجای برگرداندن حجم وسیعی از رکوردها بهسادگی میتوان همان نتایجی را که مدنظر است، استخراج کرد.
Other statements: دستورات دیگری میتوانند درون یک محاوره قرار گیرند. برای مثال، متصل کردن جدولها به یکدیگر، مرتبسازی دادهها یا گروهبندی آنها از جمله این دستورات هستند.
اما چه چیزی این دستور را آسیبپذیر میکند؟ پاسخ این پرسش در بخش مربوط بهشرط این دستور، یعنی Where نهفته است. قطعه کد زیر نمونهای از یک اسکریپت SQL Injection را نشان میدهد.
var Shipcity;
ShipCity = Request.form (“ShipCity”);
var sql = “select * from OrdersTable where ShipCity = ‘” + ShipCity + “’”;
همانگونه که مشاهده میکنید به کاربر در خصوص وارد کردن نام یک شهر پیغامی نشان داده میشود. اگر مقدار وارد شده توسط کاربر برابر با مقدار Redmond باشد، این کد هماهنگ با ترکیب نحوی زیر ترجمه میشود:
SELECT * FROM OrdersTable WHERE ShipCity = ‘Redmond’
اما فرض کنید کاربر بهجای کلمه فوق یک عبارت را وارد کند:
Redmond’; drop table OrdersTable--
در این حالت محاوره بهصورت زیر ترجمه میشود:
SELECT * FROM OrdersTable WHERE ShipCity = ‘Redmond’;drop table OrdersTable--’
سمیکالن در یک عبارت نشاندهنده پایان دادن به دستورات در یک محاوره و شروع یک دستور جدید است. دو علامت – نشاندهنده یک خط توضیحات (خطی که دستورات درون آن اجرا نمیشود) است. اگر شما از یک ترکیب نحوی درست همانند آنچه در بالا به آن اشاره شد استفاده کنید، دستور شما بهراحتی روی بانک اطلاعاتی اجرا میشود. این بانک اطلاعاتی میتواند بهصورت محلی از سوی یک برنامه کاربردی مورد استفاده قرار گیرد یا روی سروری قرار داشته باشد که یک سایت دادهها را از درون آن واکشی میکند. در ترکیب نحوی فوق Sql Server ابتدا همه رکوردهای درون جدول OrdersTable را که مقدار ShipCity آنها برابر با Redmond است، برگردانده و در جدول OrdersTable را پاک میکند. به همین سادگی یک هکر از طریق بهکارگیری یک دستور ساده SQL این توانایی را دارد تا رکودهای موردنظر خود را از یک جدول استخراج کرده و جدول را پاک کند.
چگونه میتوانیم در برابر حملات تزریق کد از خود محافظت کنیم؟
دستورالعملها و راهکارهای متعددی برای پیشگیری از بروز اینگونه حملات وجود دارند که به ما اجازه میدهند از سایت خود در برابر هکرها محافظت کنیم. امکان بررسی همه راهکارها وجود ندارد، اما در ادامه به کاربردیترین تکنیکهایی که در این زمینه به شما کمک میکنند از برنامه کاربردی یا سایت خود محافظت کنید، اشاره خواهیم کرد:
• همیشه ورودیهای کاربر را بر اساس نوع، طول، فرمت و محدوده اعتبارسنجی کنید. این سازوکار باعث میشود تا میزان خطرناک بودن ورودیها به حداقل برسد.
• در خصوص مواردی مانند اندازه، نوع، طول یا فرمت دادههایی که یک برنامه دریافت میکند، سیاستهای سختگیرانهای را اتخاذ کنید. برای مثال، اگر هکری یک فایل ویدیویی 10 مگابایتی را درحالیکه برنامه شما در انتظار یک کدپستی است به آن وارد کرد، برنامه چه واکنشی را باید از خود نشان دهد؟
• درصورتیکه برنامه شما دستوری مانند DROP TABLE را که درون یک فیلد متنی قرار گرفته، دریافت کرد، چه واکنشی باید از خود نشان دهد؟
• اندازه، نوع داده ورودی و محدودیت آن را مشخص کنید. این کار مانع از آن میشود تا مشکل سرریز حافظه میانگیر (Buffer Overrun) به وجود آید.
• محتوای متغیرهای رشتهای را بررسی کرده و فقط مقادیری را که در انتظار دریافت آنها هستید، قبول کنید. موجودیتهایی را که شامل دادههای باینری، کاراکترهای خاتمه دهنده و کاراکترهای توضیحات هستند، رد کنید. این مانع از آن میشود تا هکرها بتوانند اسکریپتهای مخرب را تزریق کنند و به این شکل برنامه شما در برابر حملاتی همچون Buffer Overrun در امان خواهد بود.
• زمانیکه با اسناد XML کار میکنید، همه دادهها را روی اسکیمایی که وارد شده است اعتبارسنجی کنید.
• هیچ زمان دستورات TSQL را بهطور مستقیم از کاربری که آنها را ساخته دریافت نکنید.
• از روالهای ذخیرهشده برای اعتبارسنجی ورودی کاربر استفاده کنید.
• در محیطهای چندلایه، همه دادهها قبل از مورد قبول واقع شدن باید اعتبارسنجی شوند تا یک محیط ایمن را به وجود آورند. دادههایی که فرایند اعتبارسنجی روی آنها انجام نگرفته باشد نباید پذیرفتهشوند سایت باید یک پیغام خطا را در لایه پیش از خود به کاربران نشان دهند.
• اعتبارسنجی را بهصورت چندلایه انجام دهید. اعتبارسنجی دادهها در برنامهای سمت کلایت مانع از تزریق و اجرای اسکرپیتهای ساده میشود.
• هرگز ورودیهای تایید نشده کاربر را به یکدیگر متصل نکنید. متصل کردن رشتهها نقطه شروعی برای آغاز یک حمله اسکریپت تزریقی است.
• هرگز رشتههایی را که درون آنها از کلیدواژههایی همچون:
AUX, CLOCK$, COM1 through COM8, CON, CONFIG$, LPT1,LPT8, NUL, and PRN
استفادهشده قبول نکنید.
• تا جایی که امکان دارد ورودیهایی را که شامل کاراکترهای
; , -- /*….*/ xp _ هستند، قبول نکنید.
• از پارامترهای SQL بهصورت ایمن استفاده کنید. Parameter در دستورات SQL بررسی نوعها و طول آنها را امکانپذیر میسازد. در نتیجه، در زمان دریافت مقادیر خارج از محدوده تعیینشده میتوانید یک استثنا(خطا) تولید کنید. مثال زیر نحوه بهکارگیری دستور Parameter را نشان میدهد:
SqlDataAdapter myCommand = new SqlDataAdapter(“AuthorLogin”, conn);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(“@au_id”, SqlDbType.VarChar, 11);
parm.Value = Login.Text;
در مثال فوق پارامتر @au_id بهصورت یک کاراکتر حرفی بهجای یک کد اجرایی نشان دادهشده است. این پارامتر نوع و طولی که دریافت میکند، مورد بررسی قرار میدهد، در نتیجه اگر مقدار @au-id با نوع تعیینشده و طول مشخصشده برابر نباشد یک پیغام خطا تولید خواهد شد.
• برای مقابله با حملات XSS باید کدهای سایت بهطور مرتب بررسیشده و از اجرای هرگونه کدی که مشکوک است ممانعت به عمل آید. پیشنهاد ما این است که از سیاست امنیت محتوا (Content Security Policy) بهمنظور پیشگیری از بروز چنین حملاتی استفاده کنید.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
برچسب:
به اشتراک گذاری مطلب:
نظر شما چیست؟