معرفی حملات SQL Injection

1 1 1 1 1 1 1 1 1 1 Rating 3.25 (2 Votes)

امتیاز کاربران

ستاره فعالستاره فعالستاره فعالستاره فعالستاره فعال
 

تزریق به دیتابیس (SQL Injection) چیست؟

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

در واقع این حمله به علت اشتباهات و مشکل امنیتی در برنامه نویسی به وجود می آید .

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

 

روش های نفوذ از طریق تزریق به دیتابیس

۳ روش برای نفوذ از طریق sql injection وجود دارد.

۱. Union یا اجتماع : ساده ترین و معمول ترین روش در حملات تزریق به پایگاه داده است که در تمام پایگاه داده ها قابل اجرا میباشد ، اما با استفاده از فایروال می توان از این روش حمله جلوگیری کرد.

۲. Error : در این روش هکر دستوراتی را اجرا میکند تا پایگاه داده یکسری ارور نمایش بدهد تا از همین ارورها بتواند اطلاعاتی را بدست آورد. با بستن نمایش ارور توسط وب سرور میتوان از این نوع حمله جلوگیری کرد.

۳. Blind sql injection : این نوع حمله با وجود اینکه زمانبر است ولی برای هکرها بهترین نتیجه را خواهد داشت. زیرا که با  فایروال هم قابل جلوگیری نبوده و همچنین بر روی تمام دیتابیس ها قابل پیاده سازی است . در این روش تمام کارها با true و false انجام شده  و کاراکتر به کاراکتر دیتاها را بدست می آوریم .

 

نحوه عملکرد SQL Injection

روش حمله بدین صورت است که هکر به عنوان یک بازدیدکننده سایت ، در فرمهای سایت در فیلدی که باید اطلاعات خود را وارد کند ، میتواند کوئری های مخرب خود را وارد و به دیتابیس ارسال کند.بدین صورت به جای اجرا شدن کد اصلی sql ، کد وارد شده هکر اجرا خواهد شد. پس زمانیکه این باگ در یک نرم افزار وجود داشته باشد ،  هکر خواهد توانست دستورات خود را در پایگاه داده  اجرا کند. نوع اطلاعات ورودی در SQL Injection به نوع سرویس هاستینگ و دیتابیس بستگی دارد و هر دیتابیسی به یک سری کاراکترهای خاص حساس است. به عنوان مثال Mysql  در هاست لینوکس به کاراکتر ‘ و چند کاراکتر دیگر حساس است.

فرض کنید شما یک برنامه نویس سمت وب هستید و قصد دارید با دیتابیس از طریق دستورات SQL ارتباط برقرار کنید. چون همانطور که می‌دانید استفاده از زبان SQL برای برقراری ارتباط با دیتابیس ضروری است. کد زیر را فرض کنید که در زبان PHP نوشته شده است:

$sql_statement = "SELECT * FROM users WHERE name = '" . $_GET["name"] . "'";

دستور بالا مقدار فیلد یا همان پارامتر username که توسط متد GET، متدی که پارامترها در مسیر URL مشخص می‌شوند، از طرف کاربر به سرور ارسال شده را در بین دو علامت ' قرار می‌دهد (تا توسط سرور SQL به عنوان رشته حروفی شناخته شود) و پس از آن فرض کنید که مقدار موجود در متغیر $sql_statement قرار است اجرا شود.

فرض کنید که کاربر فیلد name را به صورت عادی مثل مقدار زیر پر کند. مسیر از طریق متد GET به این شکل خواهد شد:

http://example.com/vul.php?name=Amin

در این صورت Query  موجود در متغیر sql_statement به این صورت خواهد بود:

$sql_statement = "SELECT * FROM users WHERE name = 'Amin'";

 

و کوئری (حرف همزه به دلیل فونت سایت مانند ن نشان داده می‌شود) بدون مشکل اجرا خواهد شد. در دیتابیس فیلد name با رشته Amin مقایسه خواهد شد و در جایی که نتیجه یافت شد، همه فیلدها (*) برای بقیه کدها در دسترس خواهد بود.

حال فرض کنید که کاربر (در اینجا، حمله کننده) فیلد name را به صورت زیر پر کند:

http://example.com/vul.php?name=' UNION UPDATE users SET email = این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید' WHERE name = 'admin'

حال این مقدار را جایگزین پارامتر username متد POST می‌کنیم. متغیر کوئری ما به این شکل خواهد بود:

$sql_statement = "SELECT * FROM users WHERE name = '' UNION UPDATE users SET email = این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید' WHERE name = 'admin'";

کوئری بالا هم اجرا خواهد شد ولی با این تفاوت که در واقع هکر کوئری دلخواه خود را اجرا کرده است! در دیتابیس فیلد name با رشته خالی جستجو خواهد شد ولی چیزی پیدا نخواهد شد، تا اینجا برای هکر مهم نیست. اما هکر با استفاده از دستور UNION، کوئری دوم خود را نیز اجرا می‌کند و در کوئری دوم، ایمیل کاربر admin (که به احتمال زیاد تمامی دسترسی‌های موجود را دارد) را به ایمیل دلخواه تغییر (UPDATE) می‌دهد.

 

یک مثال دیگر:

فرض کنید در یک صفحه Login (ورود)، کاربر یوزرنیم و پسورد را به وبسایت ارسال می‌کند. در سمت سرور، یک کوئری با شرط وجود و برابری یوزرنیم و پسورد در دیتابیس اجرا می‌شود. اگر کوئری خروجی داشت، یک نشست (Session) ایجاد شده و به کاربر دسترسی ورود می‌دهد اما اگر هیچ خروجی ای نبود، یعنی یوزر پیدا نشده یا رمز برابر نبوده، در این صورت از ورود کاربر جلوگیری می‌شود. فرض کنیم کد کوئری ما به این صورت باشد:

$query = "SELECT name, phone FROM users WHERE username='" . $_POST["username"] . "' AND passwd = '" . $_POST["password"] . '";

فرض کنید کاربر به صورت عادی یوزرنیم و پسورد خود را وارد می‌کند. در نتیجه پارامترهای زیر با متد POST (چون از فرم استفاده شده) ارسال می‌شوند:

username = administrator

password = 'FgRt%3Hj

کوئری به صورت زیر خواهد بود:

$query = "SELECT name, phone FROM users WHERE username='administrator' AND passwd = 'FgRt%3Hj";

چون یک رکورد با شرط برابر بودن فیلدهای username و passwd با مقادیر دریافت شده وجود دارد، کاربر به داخل پنل هدایت خواهد شد.

حال فرض کنید یک هکر یا حمله کننده مقادیر پارامترها را به صورت زیر ارسال کند:

username = ' OR '1' = '1

password = ' OR '1' = '1

کوئری به صورت زیر خواهد بود:

$query = "SELECT name, phone FROM users WHERE username='' OR '1' = '1' AND passwd = '' OR '1' = '1'";

عملگر OR یک کار بسیار مهم انجام خواهد داد. در کوئری بالا برنامه به این صورت عمل می‌کند:

فیلدهای name و phone را از تیبل users بگیر به شرط این که در یکی از رکوردها، مقدار username برابر {خالی} باشد یا اگر ۱ برابر ۱ باشد و شرط دوم هم این که مقدار passwd برابر {خالی} باشد یا اگر ۱ برابر ۱ باشد.

خب می‌دانیم که همیشه مقدار ۱ برابر ۱ است پس هر دو شرط همیشه درست خواهند بود و در خروجی این کوئری، همه رکوردهای موجود بیرون داده خواهد شد. و چون رکوردی با شرط کوئری (درواقع شرط تقلبی ما) پیدا شد، حمله کننده به پنل منتقل خواهد شد!

 

تشخیص باگ sql injection در وب سایت

حال میخواهیم وب سایت هایی را جستجو کنیم که دارای باگ sql injection میباشند تا بتوانیم همراه با آن راه های جلوگیری از این حملات را یاد بگیریم.

برای این کار به سایتی نیاز داریم که در آدرس url آن پارامتری مانند Php?id=4 و یا php?id =any وجود داشته باشد.برای پیدا کردن این نوع وب سایت ها ، میتوانیم از Google Dorks (جستجوهای پیشرفته در گوگل ) استفاده کنیم.

برای مثال تعدادی از این google dorks ها که مربوط به کشور پاکستان هست به این صورت جستجو میشود :  

 

Gallery.php?id=site:.pk 

Product.php?id ="+۹۲"

Cat.php?id="+۹۲"

Default.php?catID="+۹۲"

هیچ محدودیتی برای لیست دورک ها وجود ندارد و میتوانید با وارد کردن کلمات کلیدی خود این لیست را افزایش دهید، یا اینکه در گوگل عبارت new google dorks list  را جستجو کرده و نتایج زیادی را مشاهده کنید.در صورتیکه میخواهید دورک ها تنها برای کشور خاصی نمایش داده شود میتوانید در پایان آدرس مانند نمونه عبارت site:.pk و به جای pk کشور مورد نظر را وارد نمایید.

about.php?cartID=site:.pk

پس از پیدا کردن سایت مورد نظر برای تست ، باید در مرورگر در انتهای آدرس سایت ، یک کوتیشن (‘) قرار دهیم تا آسیب پذیر بودن آن را ارزیابی کنیم مانند زیر:

'http://www.wurm.info/index.php?id=6

در صورتیکه از مرورگر کروم استفاده میکنید کوتیشن به %27 تغییر داده خواهد شد و مشکلی نخواهد داشت.

اگر سایت دارای باگ SQL باشد ، ارورهای مختلفی نمایش داده خواهد شد. و یا اینکه اطلاعاتی از صفحه حذف شود.

مانند تصویر زیر

 در مقاله آینده به توضیح نحوه جلوگیری از حملات تزریق پایگاه داده خواهیم پرداخت.