آسیبپذیری SQL Injection: شناخت، نمونهها و راهکارهای محافظتی
با پیشرفت دنیای دیجیتال و سرعت انتشار دادهها در اینترنت، امنیت اطلاعات ذخیره شده در پایگاه دادهها به یکی از موضوعات بسیار مهم برای مدیران IT تبدیل شده است. بسیاری از برنامههای تحت وب برای ذخیره و بازیابی دادهها از پایگاهدادههایی مانند MySQL ،PostgreSQL یا SQL Server استفاده میکنند. اگر ورودی کاربران بدون فیلتر کردن مناسب مستقیماً در کوئریهای SQL استفاده شود، هکر میتواند با وارد کردن کدهای SQL، ساختار کوئری را تغییر دهد.
در بین کاربران اینترنت mysql یکی از محبوبترین پایگاه دادههایی است که همیشه هدف نفوذگران بوده است. Sql injection یکی از قدیمیترین و معروفترین حملاتی است که خرابکاران برای تهدید منابع اطلاعاتی ذخیره شده در دیتابیس استفاده میکنند. در این مقاله هدف آشنایی کامل با Sql injction و انواع حملاتی که از این طریق میتواند منجر به آسیبپذیری در شبکه سازمان شما شود است. سپس با ارائه چند مثال به راهکارهای مقابله با این تهدید اشاره میکنیم.
SQL Injection چیست؟
در بسیاری از شرکتها و سازمانها کاربران و مشتریان نیاز به ورود اطلاعات شخصی خود دارند. برای مثال در بانکها نیاز به ورود اطلاعات نام کاربری و رمز عبور است و یا در برخی سایتهای خرید اینترنتی برای تشکیل پروفایل کاربری باید دادههایی وارد شود تا در دیتابیس آن شرکت ذخیره شود. این نقطه ورود (Entry Point) دقیقا نقطه نفوذ هکرها (یا همان نقاط آسیبپذیر) به سازمان شماست، یعنی هکرها به سادگی وارد سایت شما میشوند و به جای اینکه اطلاعات هویتی خود را وارد کنند از کدهای مخرب SQL استفاده میکنند. فرمهای ورود اطلاعات کاربران، کادر سرچ (Search Box) در سایتها و فرمهای Login از نمونههای نقطه ورود هکرها برای حملات sql injection است.
به عبارت دیگر، Code Injection یا تزریق کدهای SQL به معنای قراردادن کدهای مخرب در SQL بهوسیله صفحات وب است. درواقع نفوذگر از صفحات وب برای تزریق کدهای مخرب SQL استفاده میکند تا پایگاه داده شما را مختل کند. به این نوع حمله سایبری SQL Injection میگویند. درصورتی که نفوذگر موفق به درج کدهای مخرب در پایگاه داده شرکت شود، میتواند به اطلاعات مشتریان دسترسی پیدا کند، آنها را تغییر دهد یا حذف کند. هکرها در برخی مواقع حتی ممکن است با استفاده از کدهای مخرب sql به سرور شما دسترسی پیدا کنند و وبسایت وردپرس شما را نیز دستکاری کنند. هکرها پس از بررسی روزنههای نفوذ به پایگاه داده کدهای مخرب را از طریق ابزارهایی مانند NoSQLMap و Kali Linux تزریق میکنند.
نحوه اجرا حملات SQL Injection
معمولا در مرحله اول هکرها تلاش میکنند تا نقاط آسیبپذیر سیستم شما را شناسایی کنند و با استفاده از روشهای خاص مانند سینتکس sql و یا قرار دادن کاراکترهای خاص در فیلدهای ورودی، نقاط بالقوه را از نظر میزان آسیبپذیری تست کنند. در واقع در این مرحله نقاط آسیبپذیری مانند پیامهای خطا و موارد نشت داده (Data Leakage) شناسایی میشوند. سپس آنها متناسب با نوع آسیبپذیری کدهای مخربی (Payload) میسازند.
بهتر است بدانید تزریق کد sql به معنای تزریق کوئری (QUERY) است که در پایگاه داده ذخیره شود و بتواند اطلاعات مفیدی بدست آورد. کوئریها درخواستهای اجرای عملی در دیتابیس هستند. برای اجرای فرآیندهای سیستم عامل از کوئریها استفاده میشود. نتیجه درخواست کوئری استخراج اطلاعات حساس از رکوردهای ذخیره شده مربوط به کاربران است. گاهی اوقات هم هدف از اجرای کوئریها دور زدن احراز هویت و یا حتی حذف پایگاه داده است. گاهی اوقات دسترسی تا جایی پیش میرود که منجر به ایجاد یک در پشتی (backdoor) میشود که مدیران تا مدتها از آن بیخبرند. هکرها با توجه به نتیجهای که از وب یا اپلیکیشن مشاهده میکنند، تکنیکهای متفاوتی را برای اجرای کدهای مخرب استفاده میکنند.
فرض کنید کد زیر در یک سایت استفاده شده است:
SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password’;
اگر مهاجم به جای نام کاربری عبارت ‘OR ‘1’=’1 را وارد کند، کوئری به این شکل تغییر میکند:
SELECT * FROM users WHERE username = ” OR ‘1’=’1′ AND password = “”;
عبارت ‘۱’=’۱′ همیشه درست است، بنابراین مهاجم میتواند بدون نیاز به رمز عبور وارد شود.
آشنایی با حملات SQL injection
حملات سایبری از طریق تکنیکهای SQL injection را میتوان براساس میزان دسترسی و آسیبرسانی به سه گروه تقسیم کرد:
- SQLi در باند (In-band SQL Injection): در این روش مهاجم مستقیماً نتایج کوئری مخرب را دریافت میکند. این نوع از حملات خود به دو دسته جداگانه تقسیم میشود که به طور مشترک از یک کانال ارتباطی برای حمله استفاده میکنند. Error-based SQLi روشیست که در آن پیغام خطایی تولید میشود که اطلاعات مفید را از پایگاه داده گردآوری میکند. در روش Union-based SQLi مهاجم از دستور UNION برای ترکیب نتایج کوئری مخرب با کوئری اصلی استفاده میکند تا یک پاسخ http بدست آورد.
- SQLi استنتاجی (کور): در این روش هدف دستیابی به دادههای پایگاه داده نیست بلکه بررسی رفتار و ساختار پایگاه داده است. مهاجم با مشاهده پاسخهای متفاوت از سرور، اطلاعات را به صورت تدریجی استخراج میکند. نفوذگر سعی میکند مبتنی بر رفتار و پاسخ پایگاه داده آن را بهتر بشناسد، هرچند این نوع حملات با سرعت کمتر قابل اجرا است. برای مثال در روش حملات Boolean یک کوئری به پایگاه داده ارسال میشود تا نتیجه درست یا غلط بودن آن به نفوذگر کمک کند شناخت بهتری نسبت به دیتابیس پیدا کند. حملات مبتنی بر زمان (Time-based) نوع دیگری از حمله است که با اجرای کوئری، پایگاه داده برای چند ثانیه در حالت انتظار قرار میگیرد.
- SQLi خارج از باند(Out-of-Band SQL Injection): در این روش اطلاعات از طریق یک کانال متفاوت (مثلاً ارسال ایمیل) ارسال میشود. درصورتی که بعضی از ویژگیهای خاص در سرور پایگاه داده فعال باشد و یا سرعت سرور پایین باشد از این روش برای حمله استفاده میشود.
مکانیزمهای اجرای حملات پیشرفته
Stacked Queries: اجرای چند کوئری پشت سر هم که در برخی پایگاههای داده مانند Microsoft SQL Server امکانپذیر است.
Second Order Injection: دادههای مخرب ابتدا ذخیره شده و در زمان دیگری در کوئریها استفاده میشوند.
SQL injection موفق چه خطراتی دارد؟
در صورتی که هکر یا نفوذگر با استفاده از تزریق کدهای مخرب وارد سازمان شما شود و به اطلاعات پایگاه داده دسترسی پیدا کند به سادگی میتواند اطلاعات موجود را دستکاری یا حذف کند. در برخی مواقع این اطلاعات حساسیت بالایی دارد مانند حسابهای بانکی افراد و رمز عبور یا موجودی حساب مشتریان. در برخی موارد هکر میتواند به سطح بالاتری از نفوذ هم دست یابد و به زیرساختهای سرور هم دسترسی پیدا کند. گاهی پس از حمله SQLI، هکرها یک روتکیت (rootkit) روی سرور نصب میکنند و کنترل سرور را به صورت مخفیانه در اختیار میگیرند.
متداولترین نمونههای تزریق کد اس کیو ال عبارتند از:
- استخراج اطلاعات دیتابیس: برای دستیابی به اطلاعات دیتابیسها از جمله ساختار و ورژن آن مورد استفاده قرار میگیرد.
- بازیابی دادههای مخفی: روشی که میتوان با اجرای کوئریها دادههای پنهان را بازیابی کرد.
- حملاتunion: برای بازیابی داده از دیتابیسهای مختلف کاربرد دارد.
- از کار انداختن منطق برنامه(Subverting application logic): با استفاده از کوئریها کدهایی را تغییر میدهند که منطق اپلیکیشنها را دچار مشکل میکند.
مثالهایی از تزریق کدهای مخرب SQL
همواره هکرها از تکنیکهای متنوعی برای نفوذ به شرکت یا سازمان شما استفاده میکنند که این حملات با توجه به خلاقیت و تخصص نفوذگر متفاوت است. برخی از حملات رایج با تزریق کد sql عبارتند از:
۱. تزریق زمانبندی (Time-based Blind SQL Injection)
ورودی:
‘ OR IF(SUBSTRING((SELECT password FROM users WHERE username=’admin’),1,1)=’a’, SLEEP(5), 0)
این کد باعث میشود اگر اولین حرف رمز عبور ادمینa باشد، سرور ۵ ثانیه تأخیر داشته باشد؛ این روش برای استخراج تدریجی اطلاعات استفاده میشود.
۲. تزریق برای دسترسی به سیستمعامل (Command Injection)
ورودی:
EXEC xp_cmdshell(‘net user hacker password /add’); –‘ ;
در برخی پایگاه دادهها مانندMicrosoft SQL Server، این دستور باعث اجرای فرمان سیستمعامل و ایجاد یک حساب کاربری جدید میشود (در صورتی که مجوزها اجازه دهند).
۳. تزریق برای حذف جدول (Data Destruction)
ورودی:
DROP TABLE users; —
کوئری تغییر یافته:
SELECT * FROM products WHERE id = ”; DROP TABLE users; — ‘;
این کوئری باعث حذف کامل جدولusers میشود و اطلاعات کاربران پاک میشود.
برای شناسایی حملات sql injection چه راهکاری وجود دارد؟
ابزارهای متفاوتی برای تشخیص حملات sql injection وجود دارد که معروفترین آن اسکنر OWASP ZAP است. این اسکنر امنیتی در سال ۲۰۰۱ توسط متخصصین حوزه امنیت ارائه شد. از آنجایی که یک ابزار حرفهای منبع باز در اختیار دارید، میتوانید با خیالی آسوده سایت خود را آنالیز و بررسی کنید.
برای شناسایی حملات اس کیو ال میتوان از راهکارهای زیر هم استفاده کرد:
- کنترل و نظارت آسیب: به منظور محدود کردن دسترسی هکرها بهتر است دسترسی ادمین به پایگاه داده محدود باشد تا در صورت نفوذ فقط به صورت read only قابل مشاهده باشد.
- اسکنرهای آسیبپذیر: پلاگینهایی مانند ThreatPass یاWPScan باید به طور منظم از نظر کارایی و عملکرد مورد بررسی قرار گیرند.
- پاکسازی فایل هایUDF: فایلهایUDF (User-Defined Functions)، توابعی هستند که توسط کاربران نوشته میشوند و میتوانند عملیات دلخواه را انجام دهند. معمولا هکرها از آن برای نفوذ استفاده میکنند پس بهتر است به طور دورهای این فایلها را پاکسازی کنید.
- پشتیبانگیری دورهای: به منظور حفظ اطلاعات بهتر از سایت خود به صورت دورهای بک آپ بگیرید و درجای دیگر از آن محافظت کنید.
- پاکسازی دیتابیس: تمامی جداولی که نام sqlmap دارند را با دستور DROP TABLE Sqlmap پاک کنید.
- اجرای تست نفوذ(Penetration Test): تست نفوذ حملات شبیهسازی شدهای هستند که توسط متخصصین امنیت اجرا میشود تا نقاط آسیبپذیر و حفرههای امنیتی شبکه سازمان را شناسایی شوند.
علاوه بر موارد ذکر شده برای پیشگیری از حملات sql injection بهتر است پورت ۳۳۰۶ شبکه را ببندید و از رمزهای پیچیده استفاده کنید و همچنین دسترسی کاربران به بخش(SASS) Syntactically Awesome Stylesheets را محدود کنید.
ابزارهای رایج برای تست و بهرهبرداری
SQLmap : ابزاری خودکار برای شناسایی و بهرهبرداری از SQL Injection
Havij : ابزار گرافیکی برای نفوذ به پایگاه داده از طریق SQL Injection
Burp Suite : برای تحلیل و دستکاری درخواستها و شناسایی نقاط ضعف
روشهای جلوگیری از حملات SQL Injection
بهتر است قبل از اینکه سازمان شما دچار یک حمله از طریق تزریق کد شود راههایی برای مقابله با آن در نظر داشته باشید تا امنیت اطلاعات خود را تضمین کنید.
- از یک فایروال برای مقابله با حملات sql injection استفاده کنید.
- در انتخاب تمها و افزونهها دقت بسیاری داشته باشید و از برندهای ناشناس خرید نکنید.
- اگر سایت وردپرسی دارید نسخه آن را پنهان کنید تا از آن در مقابل نفوذ، محافظت کنید.
- از کدهای سایت با استفاده از تگهای کوتیشن برای کوئریها، در مقابل نفوذ محافظت کنید.
- پیشنهاد میشود تا حد امکان استفاده از فرمهای ورود از جمله پاپآپهای اشتراک را محدود کنید.
- آگاهی مهمترین گام برای حفظ امنیت شماست پس برای یادگیری دورههای امنیت وقت بگذارید و یا از متخصصین این حوزه بخواهید تا نمونههایی از تستهای امنیتی را برای شما اجرا کنند.
- امتیازاتی به کاربران پایگاه داده خود دهید که تنها قادر به انجام وظایف خود باشند. ایجاد حسابهای کاربری با حداقل دسترسی لازم (Principle of Least Privilege) و جلوگیری استفاده از حسابهای با دسترسی ادمین برای اتصال برنامه از دیگر موارد پیشگیری از حمله است.
- تمامی اطلاعات و کاراکترهای ارسال شده کاربران را بررسی کنید که لزوما در همان قالب استاندارد باشد. برای مثال برای دریافت آدرس ایمیل حتما به همان شکل استاندارد احراز شود.
- استفاده از کاراکترهای خاص در کوئریها احتمال نفوذ را افزایش میدهد، بنابراین بهتر است از کد جایگزینی استفاده کنید. همچنین میتوانید از توابعی مانند mysqli_real_escape_string یا htmlspecialchars در PHP برای پاکسازی کاراکترهای خاص استفاده کنید.
- استفاده ازORMها: ابزارهای ORM مانند Entity Framework یا Hibernate به صورت پیشفرض بسیاری از حملات SQL Injection را کاهش میدهند.
- بصورت دورهای وردپرس و افزونههای سایت خود را آپدیت کنید و از افزونههای نال شده استفاده نکنید.
نمونههای واقعی حملات SQL Injection به شرکتها و سازمانها
حمله به Sony Pictures در سال ۲۰۱۱
در سال ۲۰۱۱ پایگاه داده Sony Pictures با حمله SQL Injection هدف قرار گرفت. مهاجمین توانستند به سرورهای این شرکت نفوذ کنند و دادههای حساس شامل اطلاعات کاربران و کارکنان را سرقت کنند. این حادثه یکی از اولین نمونههای بزرگ حملات موفق SQL Injection به شرکتهای بزرگ بود.
حمله بهYahoo در سال ۲۰۱۲
در سال ۲۰۱۲، گروه هکری به نام D33Ds Company با استفاده از حملات SQL Injection به سرورهای Yahoo حمله کردند. آنها توانستند به اطلاعات حسابهای کاربری دسترسی پیدا کنند و اطلاعات شخصی میلیونها کاربر را افشا کنند. این حادثه به شدت به اعتبار Yahoo لطمه زد.
حمله به TalkTalk در سال ۲۰۱۵
شرکت مخابراتی بریتانیایی TalkTalk قربانی حمله SQL Injection شد که منجر به افشای اطلاعات شخصی بیش از ۱۵۰ هزار مشتری شد. این حمله باعث جریمههای سنگین مالی و کاهش شدید اعتماد مشتریان شد.
حمله بهBritish Airways در سال ۲۰۱۸
هرچند حمله اصلی British Airways به خاطر نقص امنیتی در وبسایتش اتفاق افتاد، اما گزارشها نشان میدهد بخشی از نفوذ با روشهایی شبیه به SQL Injection انجام شده بود. این حمله منجر به افشای اطلاعات پرداخت هزاران مشتری شد و جریمههای GDPR را به دنبال داشت.
درسهای مهم از این حملات:
- حتی شرکتهای بزرگ با منابع مالی زیاد هم در برابر SQL Injection آسیبپذیرند.
- نگهداری و بهروزرسانی منظم نرمافزارها و تستهای امنیتی دورهای اهمیت زیادی دارد.
- آموزش تیمهای توسعه برای برنامهنویسی امن یکی از کلیدهای جلوگیری از حملات تزریق کد اس کیو ال است.
کلام آخر
SQL Injection یکی از رایجترین و خطرناکترین آسیبپذیریهای امنیتی در برنامههای وب است که از طریق آن مهاجم میتواند دستورات SQL مخرب را به پایگاه داده تزریق کند و به منابع محافظتشده دسترسی یابد. این حمله به دلیل ضعف در اعتبارسنجی ورودیهای کاربر و استفاده نادرست از کوئریهای دینامیک رخ میدهد و میتواند منجر به افشای دادهها، تخریب اطلاعات و حتی کنترل کامل سرور شود.
با رعایت اصول برنامهنویسی امن، استفاده از کوئریهای پارامتری و پاکسازی ورودیها میتوان جلوی این حملات را گرفت و از اطلاعات حساس محافظت کرد.
سوالات متداول
۱. چه مشکلاتی میتواند در اثر SQL Injection به وجود بیاید؟
از دسترسی غیرمجاز به دادهها، افشای اطلاعات حساس، حذف یا تغییر دادهها، تا اجرای دستورات دلخواه روی سرور، همگی از پیامدهای این حمله هستند.
۲. چه برنامههایی بیشتر در معرض SQL Injection هستند؟
برنامههای وب که ورودی کاربران را بدون اعتبارسنجی و فیلتر مناسب مستقیم در کوئریهای SQL استفاده میکنند، بیشترین آسیبپذیری را دارند.
۳. آیا تمام پایگاههای داده در برابر SQL Injection آسیبپذیرند؟
تقریباً همه سیستمهای مدیریت پایگاه داده ممکن است آسیبپذیر باشند، اگر کد برنامهنویسی به صورت ناامن نوشته شده باشد.
۴. آیا SQL Injection فقط مربوط به وبسایتهاست؟
خیر، هر برنامهای که از SQL برای ذخیره یا بازیابی داده استفاده میکند و ورودی کاربران را مستقیم به کوئریها وارد میکند، ممکن است در معرض این حمله باشد.
۵. آیا با کدگذاری ورودیها میتوان از SQL Injection جلوگیری کرد؟
کدگذاری به تنهایی کافی نیست. بهترین روش استفاده از کوئریهای آماده است که ورودیها را به طور جداگانه مدیریت میکند.
۶. آیا حملات SQL Injection میتوانند به سرور آسیب فیزیکی بزنند؟
خیر، اما میتوانند از طریق اجرای دستورات مخرب، دادهها را پاک کنند یا تغییر دهند و حتی از طریق فایلهای UDF دستورات سیستمعامل را اجرا کنند.
۷. چه نوع دادههایی معمولاً در حملات SQL Injection هدف قرار میگیرند؟
اطلاعات حساس مثل نام کاربری، رمز عبور، شماره کارت اعتباری، اطلاعات شخصی و مالی.
۸. آیا فریمورکهای برنامهنویسی مدرن از SQL Injection جلوگیری میکنند؟
بسیاری از فریمورکها ابزارها و امکاناتی برای جلوگیری از SQL Injection دارند، ولی استفاده درست و آگاهانه از آنها توسط توسعهدهنده ضروری است.
۹. آیا حملات SQL Injection میتوانند به صورت خودکار انجام شوند؟
بله، ابزارهایی مثل SQLmap میتوانند به صورت خودکار نقاط آسیبپذیر را شناسایی و حتی بهرهبرداری کنند.
۱۰. چگونه میتوان وجود SQL Injection را در یک برنامه تشخیص داد؟
با استفاده از تستهای دستی (وارد کردن کاراکترهای خاص، شرطهای boolean، تاخیر زمانی) یا ابزارهای خودکار تست نفوذ.
۱۱. آیا حملات SQL Injection فقط در مرحله توسعه برنامه اتفاق میافتد؟
خیر، حتی در برنامههای در حال اجرا و پس از انتشار هم ممکن است SQL Injection رخ دهد اگر کدها ایمن نباشند.
لینک کوتاه آموزش : https://rezaforuzan.ir/dhy6



دیدگاه خود را بنویسید