احسان امجدی
کارشناس امنیت اطلاعات و ارتباطات

آموزش مقدماتی حملات SQL Injection

با آموزش مقدماتی موضوع شیرین و پرطرفدار SQL Injection در خدمت شما هستم. همانطور که میدانید، هزاران اکسپلویت برای تهدید کردن و در نهایت حمله به وب سرورها طراحی شده اند که در میان این تهدیدات بالقوه، SQL Injection توانسته است به عنوان تاثیرگذارترین، ساده ترین و فراگیرترین آن ها یک سر و گردن از سایر رقبا جلوتر و معروف‌تر باشد. حملات SQL Injection، روزانه بر روی تعداد زیادی از وب سایت های اینترنتی که اطلاعات Dynamic (پویا) را به مخاطبان خود ارائه میدهند، گزارش میشوند. چرا Dynamic؟

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

ساختار و طراحی Dynamic سایت‌ها باعث میشود که از دیتابیس MySQL و یا هر دیتابیس دیگری که مرتبط با SQL است، استفاده کنیم، بنابراین همین موضوع باعث میشود که آن ها سوژه جذابی برای حمله باشند. از آنجایی که حمله SQL Injection مستقیما با دیتابیس در ارتباط است، بنابراین برای یادگیری SQL Injection و شروع صحبت های آتی،، باید فهم درستی از SQL داشته باشیم. سعی میکنم که این سری از مقالات، برای آندسته از دوستانی که با این مبحث آشنایی کمی دارند و یا در حد یک اسم به آن برخورد کرده اند، سورس خوبی برای شروع آشنایی و تخصص در زمینه زبان کوئری ساختاریافته باشد.

SQL Injection چیست؟

SQL Injection یک روش تزریق (injection) کد است که از یک آسیب پذیری امنیتی در لایه دیتابیسِ یک اپلیکیشن، در جهت حمله استفاده میکند. اگرچه SQL Injection غالبا در حمله به وب سایت ها کاربرد دارد اما از آن میتوان در حمله به هر دیتابیس SQL ای استفاده کرد.

انتخاب قربانی (مقصد حمله)

اولین قدم در اجرای یک حمله SQL Injection، پیدا کردن یک وب سایت آسیب پذیر است. این مرحله ممکن است از لحاظ زمانی بیشترین تایم را از کل زمان مورد نیاز برای حمله کامل بخود اختصاص دهد. امروزه اکثر وب سایت ها با استفاده از روش ها و تکنیک های مختلف خودشان را از تهدیدات SQL Injection مصون نگه داشته اند. این بدان معنی است که این مرحله یعنی پیدا کردن یک وب سایت آسیب پذیر، وقت زیادی را از شما میگیرد.یکی از ساده ترین راه های پیدا کردن وب سایت های آسیب پذیر "Google Dorking" نام دارد. یک Dork، در واقع یک درخواست جستجوی خاص برای پیدا کردن وب سایت هایی است که با پارامترهای ورودیِ درون این درخواست، مطابقت دارند. در زیر مثال هایی از Dork هایی آورده شده است که شما میتوانید بوسیله آن ها سایتی آسیب پذیر در برابر حمله SQL Injection پیدا کنید. فقط کافیست که هرکدام از این درخواست ها را درون گوگل سرچ کنید.

Inurl:index.php?id=
Inurl:trainers.php?id=
Inurl:buy.php?category=
Inurl:article.php?id=
Inurl:play_old.php?id=
Inurl:declaration_more.php?decl_id=
Inurl:pageid=
Inurl:games.php?id=
Inurl:page.php?file=
inurl:newsDetail.php?id=
inurl:gallery.php?id=
inurl:article.php?id=
inurl:show.php?id=
inurl:staff_id=
inurl:newsitem.php?num= andinurl:index.php?id=
inurl:trainers.php?id=
inurl:buy.php?category=
inurl:article.php?ID=
inurl:play_old.php?id=
inurl:declaration_more.php?decl_id=
inurl:pageid=
inurl:games.php?id=
inurl:page.php?file=
inurl:newsDetail.php?id=
inurl:gallery.php?id=
inurl:article.php?id=
inurl:show.php?id=
inurl:staff_id=
inurl:newsitem.php?num=

این ها فقط نمونه کمی از Dork هایی بود که میتوان از آن ها برای پیدا کردن وب سایت های آسیب پذیر استفاده کرد. اگر دقت کرده باشید، نکته کلیدی در میان تمامی این Dork ها این است که تمامی آن ها بر روی وب سایت هایی تمرکز کرده اند که با استفاده از اسکریپت های php، محتوای Dynamic را از دیتابیس SQL تولید میکنند. به یاد داشته باشید که یک حمله SQL Injection بر روی هر دیتابیس SQL ای کار میکند.

اما در این میان وب سایت های php- based معمولا هدف مناسب تری برای این کار هستند چرا که کاربری آن ها در مورد هر زمینه ای صدق میکند و معمولا دارای اطلاعات ارزشمندی در دیتابیس‌شان هستند که شما قصد هک آن را دارید. در مورد نتایجی که Dork ها بر میگردانند این نکته را بیاد داشته باشید که الزاما وب سایت هایی که در نتیجه سرچ یک Dork به خروجی میایند، آسیب پذیر نیستند و باید در مرحله بعد هرکدام از آن را تست کنیم تا ببینیم که کدامیک از آن ها آسیب پذیری مورد نظر را داراست.با یکی از وب سایت هایی که در نتیجه سرچ Dork به خروجی آمده است، کار را دنبال میکنیم؛ فرض کنید که وب سایت

http://www.udemi.com/index.php?catid=1

، یکی از وب سایت هایی که در خروجی سرچ Dork آمده است. برای آن که متوجه شویم که این سایت در برابر حمله SQL Injection آسیب پذیر است یا خیر، کاراکتر ' به آخر URL مانند زیر اضافه میکنیم:

http://www.udemy.com/index.php?catid=1’

کلید اینتر را میزنیم و منتظر میمانیم تا عکس العمل وب سایت را ببینیم. اگر صفحه بشما ارور SQL برگرداند، وب سایت در برابر حمله SQL Injection آسیب پذیر است. در غیر اینصورت اگر صفحه بطور عادی لود شد، این وب سایت کاندیدای خوبی برای حمله SQL Injection نیست و باید از لیست وب سایت های پیدا شده، وب سایت دیگری را تست کنید.گفتیم که اگر صفحه بما ارور SQL برگرداند، به معنی آسیب پذیر بودن آن است. این که محتوای ارور چیست، اصلا اهمیتی ندارد. بطور کلی صحبت سر اینست که اگر صفحه بما هر ارور SQL ای برگرداند، در برابر تکنیک های SQL Injection آسیب پذیر است.در همین لحظه است که درک صحیح SQL نقطه قوت ادامه کار ما میشود. اگر با ساختار و مفاهیم SQL آشنا باشیم، میتوانیم از این صفحه اسیب پذیر، مستقیما محتوای دیتابیس را دستکار کنیم.

شروع حمله

بعد از آنکه وب سایت اسیب پذیر را شناسایی کردید، نوبت آنست که از تعداد ستون های موجود در دیتابیس SQL آن سایت مطلع شوید و این که چه تعداد از این ستون ها قابلیت پذیرش کاراکتر و یا عبارت ورودی از طرف شما را دارند. عبارت "order by" را در انتهای URL اضافه میکنیم:

http://www.udemy.com/index.php?catid=1 order by 1

عددی که پس از "order by" میآوریم در واقع حدس ما از تعداد ستون های دیتابیس است. همین طور این عدد را یکی یکی افزایش میدهیم تا به ارور بخوریم. تعداد ستون های دیتابیس، بزرگترین عددی است که قبل از ارور تست کردیم و جواب گرفتیم.در حالت دیگر ممکن است که با افزایش یک به یک عدد، تنها روی یک عدد به ارور نخوریم که در اینجا نیز آن عدد نشانگر تعداد ستون های دیتابیس است. فرض میکنیم که تعداد ستون های دیتابیس عدد 6 است. علاوه بر این مورد نیاز داریم تا بفهمیم که کدامیک از ستون های دیتابیس درخواست های ورودی سایت را قبول میکنند. ما این کار را با اضافه کردن عبارت "Union Select" به انتهای URL انجام میدهیم:

http://www.udemy.com/index.php?catid=-1 union select 1,2,3,4,5,6

در مثال بالا دو نکته هست که باید آن ها را توضیح دهم. اول آن که قبل از عدد 1 (بعد از catid) باید یک کاراکتر "-" اضافه کنیم. علاوه بر این تعداد ستون های دیتابیسی که در مثال قبل آن ها را بدست آوردیم، همان ارقامی است که بعد از عبارت union select آورده ایم. برای مثال اگر شما در مثال قبل متوجه شدید که دیتابیس 12 ستون دارد، باید URL را بصورت زیر وارد کنید:

http://www.udemy.com/index.php?catid=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12

نتیجه ای که این کوئری بر میگرداند، تعداد ستون هایی که از سایت ورودی قبول میکنند را نشان میدهد. شما میتوانید ازهرکدام از این ستون ها را برای تزریق (Inject) به SQL استفاده کنید.

اکسپلویت کردن دیتابیس

در این مرحله شما میدانید که از طریق کدام ستون ها باید مستقیما درخواست خود را تزریق کنید؛ بنابراین میتوانید کار اکسپلویت کردن دیتابیس را اغاز کنید. از این جا به بعد برای اجرای بسیاری از دستورالعمل ها به عبارت union select بسیار نیاز پیدا خواهید کرد. خوب دوستان دیدید انجام SQL Injection آنقدرها هم که از دور به نظر میاد، ترسناک نیست و میشود با یادگیری قواعد بازی و دستورالعمل ها تا حد زیادی کار را به جلو برد.

اما یادمان باشد که در کنار این سادگی، اجرای موفقیت آمیز یک SQL Injection همیشه در غالب دستورالعمل ها و مراحل از پیش تعریف شده نمیگنجد و در واقع میتوان گفت که هسته اصلی کار کاملا بسته به هوش و خلاقیت و صد البته درک کامل از ساختار SQL و هدف دارد. اگر با دستورات SQL و نحوه استفاده از آن ها برای به پایان رساندن اکسپلویت آشنایی ندارید، باید دستورات مختلف در این زمینه را مطالعه و بعد از آن اقدام به اجرای SQL Injection کنید.


احسان امجدی
احسان امجدی

کارشناس امنیت اطلاعات و ارتباطات

احسان امجدی ، مشاور امنیت اطلاعات و ارتباطات و تست نفوذ سنجی ، هکر کلاه سفید ، مدرس دوره های تخصصی امنیت اطلاعات و شبکه ، تخصص در حوزه های سرویس های مایکروسافت ، Routing و Switching ، مجازی سازی ، امنیت اطلاعات و تست نفوذ ، کشف جرائم رایانه ای و سیستم عامل لینوکس ، متخصص در حوزه SOC و ...

نظرات