با پیشرفت دنیای دیجیتال و سرعت انتشار دادهها در اینترنت، امنیت اطلاعات ذخیره شده در پایگاه دادهها به یکی از موضوعات بسیار مهم برای مدیران IT تبدیل شده است. بسیاری از برنامههای تحت وب برای ذخیره و بازیابی دادهها از پایگاهدادههایی مانند MySQL ،PostgreSQL یا SQL Server استفاده میکنند. اگر ورودی کاربران بدون فیلتر کردن مناسب مستقیماً در کوئریهای SQL استفاده شود، هکر میتواند با وارد کردن کدهای SQL، ساختار کوئری را تغییر دهد.
در بین کاربران اینترنت mysql یکی از محبوبترین پایگاه دادههایی است که همیشه هدف نفوذگران بوده است. Sql injection یکی از قدیمیترین و معروفترین حملاتی است که خرابکاران برای تهدید منابع اطلاعاتی ذخیره شده در دیتابیس استفاده میکنند. در این مقاله هدف آشنایی کامل با Sql injction و انواع حملاتی که از این طریق میتواند منجر به آسیبپذیری در شبکه سازمان شما شود است. سپس با ارائه چند مثال به راهکارهای مقابله با این تهدید اشاره میکنیم.
در بسیاری از شرکتها و سازمانها کاربران و مشتریان نیاز به ورود اطلاعات شخصی خود دارند. برای مثال در بانکها نیاز به ورود اطلاعات نام کاربری و رمز عبور است و یا در برخی سایتهای خرید اینترنتی برای تشکیل پروفایل کاربری باید دادههایی وارد شود تا در دیتابیس آن شرکت ذخیره شود. این نقطه ورود (Entry Point) دقیقا نقطه نفوذ هکرها (یا همان نقاط آسیبپذیر) به سازمان شماست، یعنی هکرها به سادگی وارد سایت شما میشوند و به جای اینکه اطلاعات هویتی خود را وارد کنند از کدهای مخرب SQL استفاده میکنند. فرمهای ورود اطلاعات کاربران، کادر سرچ (Search Box) در سایتها و فرمهای Login از نمونههای نقطه ورود هکرها برای حملات sql injection است.
به عبارت دیگر، Code Injection یا تزریق کدهای SQL به معنای قراردادن کدهای مخرب در SQL بهوسیله صفحات وب است. درواقع نفوذگر از صفحات وب برای تزریق کدهای مخرب SQL استفاده میکند تا پایگاه داده شما را مختل کند. به این نوع حمله سایبری SQL Injection میگویند. درصورتی که نفوذگر موفق به درج کدهای مخرب در پایگاه داده شرکت شود، میتواند به اطلاعات مشتریان دسترسی پیدا کند، آنها را تغییر دهد یا حذف کند. هکرها در برخی مواقع حتی ممکن است با استفاده از کدهای مخرب sql به سرور شما دسترسی پیدا کنند و وبسایت وردپرس شما را نیز دستکاری کنند. هکرها پس از بررسی روزنههای نفوذ به پایگاه داده کدهای مخرب را از طریق ابزارهایی مانند NoSQLMap و Kali Linux تزریق میکنند.
معمولا در مرحله اول هکرها تلاش میکنند تا نقاط آسیبپذیر سیستم شما را شناسایی کنند و با استفاده از روشهای خاص مانند سینتکس 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 = " ;
عبارت '1'='1' همیشه درست است، بنابراین مهاجم میتواند بدون نیاز به رمز عبور وارد شود.
حملات سایبری از طریق تکنیکهای SQL injection را میتوان براساس میزان دسترسی و آسیبرسانی به سه گروه تقسیم کرد:
Stacked Queries: اجرای چند کوئری پشت سر هم که در برخی پایگاههای داده مانند Microsoft SQL Server امکانپذیر است.
Second Order Injection: دادههای مخرب ابتدا ذخیره شده و در زمان دیگری در کوئریها استفاده میشوند.
در صورتی که هکر یا نفوذگر با استفاده از تزریق کدهای مخرب وارد سازمان شما شود و به اطلاعات پایگاه داده دسترسی پیدا کند به سادگی میتواند اطلاعات موجود را دستکاری یا حذف کند. در برخی مواقع این اطلاعات حساسیت بالایی دارد مانند حسابهای بانکی افراد و رمز عبور یا موجودی حساب مشتریان. در برخی موارد هکر میتواند به سطح بالاتری از نفوذ هم دست یابد و به زیرساختهای سرور هم دسترسی پیدا کند. گاهی پس از حمله SQLI، هکرها یک روتکیت (rootkit) روی سرور نصب میکنند و کنترل سرور را به صورت مخفیانه در اختیار میگیرند.
متداولترین نمونههای تزریق کد اس کیو ال عبارتند از:
همواره هکرها از تکنیکهای متنوعی برای نفوذ به شرکت یا سازمان شما استفاده میکنند که این حملات با توجه به خلاقیت و تخصص نفوذگر متفاوت است. برخی از حملات رایج با تزریق کد 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 وجود دارد که معروفترین آن اسکنر OWASP ZAP است. این اسکنر امنیتی در سال ۲۰۰۱ توسط متخصصین حوزه امنیت ارائه شد. از آنجایی که یک ابزار حرفهای منبع باز در اختیار دارید، میتوانید با خیالی آسوده سایت خود را آنالیز و بررسی کنید.
برای شناسایی حملات اس کیو ال میتوان از راهکارهای زیر هم استفاده کرد:
علاوه بر موارد ذکر شده برای پیشگیری از حملات sql injection بهتر است پورت ۳۳۰۶ شبکه را ببندید و از رمزهای پیچیده استفاده کنید و همچنین دسترسی کاربران به بخش(SASS) Syntactically Awesome Stylesheets را محدود کنید.
SQLmap : ابزاری خودکار برای شناسایی و بهرهبرداری از SQL Injection
Havij : ابزار گرافیکی برای نفوذ به پایگاه داده از طریق SQL Injection
Burp Suite : برای تحلیل و دستکاری درخواستها و شناسایی نقاط ضعف
بهتر است قبل از اینکه سازمان شما دچار یک حمله از طریق تزریق کد شود راههایی برای مقابله با آن در نظر داشته باشید تا امنیت اطلاعات خود را تضمین کنید.
در سال ۲۰۱۱ پایگاه داده Sony Pictures با حمله SQL Injection هدف قرار گرفت. مهاجمین توانستند به سرورهای این شرکت نفوذ کنند و دادههای حساس شامل اطلاعات کاربران و کارکنان را سرقت کنند. این حادثه یکی از اولین نمونههای بزرگ حملات موفق SQL Injection به شرکتهای بزرگ بود.
در سال ۲۰۱۲، گروه هکری به نام D33Ds Company با استفاده از حملات SQL Injection به سرورهای Yahoo حمله کردند. آنها توانستند به اطلاعات حسابهای کاربری دسترسی پیدا کنند و اطلاعات شخصی میلیونها کاربر را افشا کنند. این حادثه به شدت به اعتبار Yahoo لطمه زد.
شرکت مخابراتی بریتانیایی TalkTalk قربانی حمله SQL Injection شد که منجر به افشای اطلاعات شخصی بیش از ۱۵۰ هزار مشتری شد. این حمله باعث جریمههای سنگین مالی و کاهش شدید اعتماد مشتریان شد.
هرچند حمله اصلی British Airways به خاطر نقص امنیتی در وبسایتش اتفاق افتاد، اما گزارشها نشان میدهد بخشی از نفوذ با روشهایی شبیه به SQL Injection انجام شده بود. این حمله منجر به افشای اطلاعات پرداخت هزاران مشتری شد و جریمههای GDPR را به دنبال داشت.
درسهای مهم از این حملات:
SQL Injection یکی از رایجترین و خطرناکترین آسیبپذیریهای امنیتی در برنامههای وب است که از طریق آن مهاجم میتواند دستورات SQL مخرب را به پایگاه داده تزریق کند و به منابع محافظتشده دسترسی یابد. این حمله به دلیل ضعف در اعتبارسنجی ورودیهای کاربر و استفاده نادرست از کوئریهای دینامیک رخ میدهد و میتواند منجر به افشای دادهها، تخریب اطلاعات و حتی کنترل کامل سرور شود.
با رعایت اصول برنامهنویسی امن، استفاده از کوئریهای پارامتری و پاکسازی ورودیها میتوان جلوی این حملات را گرفت و از اطلاعات حساس محافظت کرد.