اصول پایگاه داده و SQL – همه آن چه یک هکر باید بداند


کلید موفقیت در مسیر تبدیل شدن به یک هکر کلاه سفید این است که فناوریهایی که قرار است از آنها بهرهبرداری (اکسپلویت) بکنید را به خوبی بشناسید. تزریق اسکیواِل یکی از رایجترین روشهای حمله است که امروزه مورد استفاده قرار میگیرد و همچنین یکی از راحتترین مواردی است که میتوان آموخت. برای درک چگونگی عملکرد این نوع حمله باید درک کاملی از نحوه کارکرد اسکیواِل داشته باشید.
این آموزش به طور مقدماتی با معرفی مفاهیم اساسی اسکیواِل و تزریق اسکیواِل آغاز شده و به سمت شناسایی پایگاه داده و تکنیکهای پیشرفتهتر حرکت میکند و در نهایت روشهای مورد استفاده برای جلوگیری از انواع این نوع حملهها معرفی شدهاند.
تزریق اسکیواِل چیست؟
اسکیواِل که عبارتی اختصاری برای زبان کوئری ساختیافته (structured query language) است یک زبان استاندارد برای بازیابی و دستکاری دادهها در سیستمهای مدیریت پایگاههای داده رابطه ای (RDBMS) محسوب میشود. دادهها از طریق اجرای کوئریها (پرسوجوها) مورد دسترسی قرار میگیرند و بدین ترتیب امکان چهار عمل ایجاد، خواندن، بروزرسانی و حذف (که به اختصار CRUD نامیده میشود) فراهم میآید.
پایگاههای داده در موقعیتهای مختلفی مورد استفاده قرار میگیرند، اما یکی از مهمترین پیکربندیهای یک پایگاه داده جهت خدمترسانی به عنوان یک برنامه وب است. زمانی که اعمال خاصی مانند ورود به وبسایت و جستجو صورت میگیرد، کوئریهایی از برنامه وب به سمت پایگاه داده فرستاده میشود.
تزریق اسکیواِل زمانی رخ میدهد که فیلدهای ورودی کاربران وب به درستی بررسی یا تأیید نمیشوند. مهاجم میتواند دستورهای اسکیواِل مخرب را جهت دسترسی به دادههایی که خارج از دسترسش هستند، وارد پایگاه داده کند. تزریق اسکیواِل عموماً تأثیر بالایی بر جای میگذارد، زیرا امکان بازیابی اطلاعات بسیار حساس را در اختیار مهاجم قرار میدهد. همچنین امکان دستکاری، تخریب و یا حتی ارتقای مجوزها و صدور دستورات سیستمی بر روی سرور را برای وی فراهم میسازد.
به طور کلی هر نوع از ورودی به یک صفحه وب، قابلیت آسیب زدن به صورت تزریق اسکیواِل را دارد، زیرا این همان جایی است که کاربران بیرونی با پایگاه داده تعامل مییابند. فرمهای احراز هویت که در آن کاربر با استفاده از یک نام کاربری و رمز عبور وارد وبسایت میشود، یکی از رایجترین انواع ورودیهایی هستند که مورد سوءاستفاده قرار میگیرند؛ اما فرم های جستجو، فرمهای تماس و آپلود فایل نیز همگی اهداف بالقوه ای برای تزریق محسوب میشوند.
در بخش نخست این سری از نوشته ها، مفاهیم مقدماتی اسکیواِل را برای درک بهتر انواع حملههایی که اجرا میشوند، بررسی میکنیم.
آناتومی یک پایگاه داده
دادههایی که در یک پایگاه داده نگهداری میشوند، در اشیایی به نام جداول ذخیره شدهاند. این جداول بازنماییهای مجازی از روابط بین عناصر مختلف هستند که شامل ردیف و ستون میشوند. ردیفها به نام رکورد خوانده میشوند و شامل دادههایی برای هر مدخل منفرد در پایگاه داده هستند. فیلدها که ستونهای جدول هستند، نماینده بخش خاصی از اطلاعات هر رکورد هستند. این مسئله در جدول Users در ادامه بهتر نمایش یافته است:
این جدول شامل سه رکورد و چهار فیلد است. هر کاربر در پایگاه داده یک ID، نام، نام کاربری، و رمز عبور دارد. در واقعیت جداول معمولاً بسیار بزرگتر از این نمونه هستند و ممکن است شامل میلیونها رکورد باشند و خود پایگاه داده میتواند جداول بسیاری را در خود داشته باشد. با توجه به دادههای زیادی که در این جداول ذخیره شدهاند، مطمئناً متوجه هستید که تزریق اسکیواِل تا چه حد میتواند آسیبزا باشد.
انواع داده و عملگرها
برای درک شیوه عملکرد دادهها باید انواع مختلف دادههایی که در اسکیواِل استفاده میشوند را بشناسیم. با این که انواع دقیق دادهها بین سیستمهای مختلف پایگاه دادهای متفاوت هستند؛ ولی در اغلب موارد آنقدر به هم شباهت دارند که بتوانیم آنها را دستهبندی کنیم. این انواع دادهای معمولاً به صورت متن، عدد و تاریخ دستهبندی میشوند.
عملگرها امکان دستکاری و تعامل با دادهها را در اسکیواِل فراهم میسازند. پنج دسته اصلی برای عملگرها وجود دارد: حسابی، بیتی، مقایسهای، ترکیبی و منطقی. اغلب آنها شبیه زبانهای برنامهنویسی دیگر هستند؛ اما تفاوتهایی نیز وجود دارند.
دستورها (Statement) و دستور زبان (Syntax)
عبارتهای اسکیواِل کدهایی هستند که برای بازیابی یا تغییر دادن دادهها به پایگاه داده ارسال میشوند.
در ادامه مثالی از یک کوئری به پایگاه داده را با هم بررسی میکنیم:
SELECT * FROM Users WHERE Name='John Smith';
بخش نخست این دستور (SELECT * FROM Users) باعث میشود همه فیلدها از جدول Users انتخاب شوند. در عبارت فوق بند (clause) WHERE تعیین میکند که ما تنها میخواهیم اطلاعاتی را از رکوردی که در فیلد Name خود مقدار «John Smith» دارد به دست آوریم.
اسکیواِل از گیومه یا تک کوتیشن (‘…’) برای رشتهها استفاده میکند؛ اما در اغلب پایگاههای داده امکان استفاده از گیومه جفتی ("...") و علامت نقطهویرگول (;) در انتهای عبارت وجود دارد. لازم به ذکراست که کلیدواژههایی مانند SELECT و WHERE به حروف کوچک و بزرگ حساس هستند.
توضیحات در اسکیواِل را میتوان در یک یا چند خط نوشت:
این یک توضیح تکخطی است-- SELECT * FROM Users; /* این توضیح چندخطی است*/
نقش توضیحات در تزریق اسکیواِل
در تزریق اسکیواِل از طریق مدیریت توضیحها به وسیله اجرا کردن بخشهای خاصی از کوئری به صورت غیر الزامی سوءاستفاده میشود. در تزریق زیر نیاز به وارد کردن رمز عبور کنار زده میشود:
SELECT * FROM Users WHERE Username='' or 1=1-- AND Password='';
این دستور همه رکوردهای پایگاه داده را باز میگرداند زیرا یک رشته خالی یا 1=1 همواره مقدار صحیح دارد و دو علامت تیره پشت سرهم (--) باعث میشود که فیلد password به صورت توضیح از دستور خارج شود.
همچنین کلیدواژههایی مانند MIN و MAX, ORDER BY, و BETWEEN در SQL وجود دارند که کار چیدمان دادهها را آسانتر میکنند.
در ادامه جدولی به نام LoginSessions را میبینیم.
فرض کنید میخواهیم بدانیم که چه کسی قدیمیترین ورود به سایت را ثبت کرده است و چه زمانی بوده است. کوئری زیر ID، نام کاربری، و کوتاهترین و بلندترین سِشِنهای بین دو تاریخ وارد شده را باز میگرداند:
SELECT ID, Username, MIN(SessionLength), MAX(SessionLength) FROM LoginSessions WHERE LoginDate BETWEEN '2018-01-01' AND '2018-05-01' GROUP BY ID ORDER BY MAX(SessionLength) DESC;
دستور GROUP BY در SQL باعث میشود که ردیفها بر مبنای BY ID تجمیع شوند و عبارت ORDER BY MAX(SessionLength) DESC موجب میشود که کاربری که طولانیترین ورود را دارد در ابتدا نمایش یابد.
دستورهای مفید دیگر شامل INSERT INTO که رکوردهای جدیدی در یک جدول ایجاد میکند، UPDATE که رکوردهای موجود در یک جدول را بهروزرسانی میکند و DELETE که برای حذف رکوردها از یک جدول استفاده میشود. این انواع کوئریها میتوانند هنگامی که بخواهید کاری بیش از بازیابی اطلاعات از یک پایگاه داده انجام دهید به منظور تزریق اسکیواِل مفید نیز باشند.
یک مهاجم میتواند یک رکورد جدید ایجاد کند که برای مثال نشان میدهد وی کالایی را از یک فروشگاه آنلاین خریداری کرده است و ادعا کند که کالا به دستش نرسیده است و باید به خاطر آن غرامت دریافت کند. اگر مهاجم بخواهد واقعاً آسیب زیادی وارد کند میتواند از دستور DROP استفاده کند. DROP TABLE باعث میشود که همه جدولهای موجود در پایگاه داده حذف شوند و FROP DATABASE باعث حذف کامل خود پایگاه داده میشود.
Joins & Unions
Joins و انواع آن
عملگر Joins برای ترکیب ردیفهایی از دو جدول مختلف هنگامی که یک فیلد بین آنها مرتبط است استفاده میشود. در ادامه جدول USERS که قبلاً معرفی کردیم را میبینید.
یک جدول جدید به نام Logins هم اضافه میکنیم:
دستورهای اسکیواِل زیر تاریخی که Bob Jones برای آخرین وارد وبسایت شده است را نشان میدهد:
SELECT Users.Username, Logins.Date FROM Users INNER JOIN Logins ON Users.ID = Logins.ID;
یک دستور INNER JOIN یا صرفاً JOIN مانند مثال فوق رکوردهایی که دادههایشان در هر دو جدول منطبق است را باز میگرداند. دستور LEFT JOIN همه رکوردها از جدول سمت چپ و نیز رکوردهایی از جدول راست که منطبق هستند را بازمی گرداند، در حالی که دستور RIGHT JOIN همه رکوردها از جدول راست و رکوردهایی از جدول چپ که با معیار کوئری منطبق هستند را بازیابی میکند. دستور FULL JOIN نیز همه رکوردهایی که در جدلهای چپ و راست منطبق هستند را باز میگرداند. با این که دستورهای Joins برای تزریق اسکیواِل الزامی نیستند ولی ثابت شده است که این دستورها هنگامی که بدانیم چگونه میتوانیم اطلاعات را از جداول بیرون بکشیم برای اجرای این کار بسیار مفید هستند.
UNION
دستور UNION برای ترکیب دادهها از دو یا چند دستور SELECT استفاده میشود. هر دستور SELECT باید انواع دادهای یکسان، و تعداد مشابهی ستون داشته باشند و همه آنها نیز در یک ترتیب باشند. UNION ALL همین کار را انجام میدهد اما در مواردی که دادههای یکسانی در هر دو جدول union شده وجود داشته باشند، ردیفهای تکراری را حذف نمیکند. در ادامه مثالی از این دستورها با استفاده از جدولهای Users و Admins ارائه شده است.
دستور اسکیواِل زیر رمز عبورهای کاربران و همچنین مدیران (admins) را بازیابی میکند:
SELECT Password FROM Users UNION SELECT Password FROM Admins;
بدیهی است که این نمیتواند یک کوئری نرمال باشد که بر روی یک پایگاه داده اجرا شود؛ اما اگر مجاز باشیم آن را درون پایگاه داده تزریق کنیم، میتوانیم رمزهای عبور admin یا هر اطلاعاتی که معمولاً قابل دسترسی است را به دست آوریم
در این نوشته تلاش کردیم با مفاهیم مقدماتی اسکیواِل آشنا شویم. از این اطلاعات میتوان برای اجرای تزریقهای اسکیواِل استفاده کرد. در نوشتههای آتی، روشهایی که برای آشکار کردن اطلاعاتی در مورد پایگاه داده و روشنتر کردن اهداف حمله لازم هستند را معرفی خواهیم کرد.
اگر به این نوشته علاقهمند بودید، احتمالاً موارد زیر نیز مورد توجه شما واقع خواهند شد:
- آموزش کار با دستورات پایگاه داده در SQL Server
- ۱۳ دستور SQL مهم که هر برنامهنویسی باید بداند
- آموزش امنیت شبکه های کامپیوتری
- آموزش امنیت وردپرس (WordPress Security)
- آموزش کاربردی SQL Server
- آموزش SQL Server Management Studio | کامل، رایگان و گام به گام
- MongoDB چیست؟ — راهنمای شروع با دیتابیس مانگو دی بی
==
خیلی خوب بود. ممنون