باگی خطرناک به اسم Sql Injection

قبل از اشتراک این مقاله باید بگم مسئولیت این آموزش بر عهده خود فرده و تیم امنیتی TBS هیچ مسئولیتی رو قبول نمیکنه.دوما این مقاله خیلی خیلی ابتدائیه و روی هر وبسایتی جواب نمیده.سوما من وقتی این باگ رو شروع کردم روزی 4 ساعت فقط به صورتی تذریق دستی میکردم.و در اخر اگه میخواین توی این باگ حرفه ای بشین باید کلی تحقیق کنین و این آموزش در مورد حمله به صورت Union Base هست و در ادامه ما بقی حالات تذریق رو شرح میدیم.مراحل تست نفوذ Sql Injectionبا عرض سلام و درود خدمتشما عزیزان ، به واسطه آسیب پذیری 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 اشاره کنیم.البته همیشه به این اسم ها نیست ولی دونستنش خیلی خوبه چون توی اتک به ورژن 4 خیلی کمک میکنه.استخراج اطلاعات از جدول انتخاب شدهدر بخش قبلی ما جدول 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) در اومده باشن .من خودم از این آموزش شروع کرده بودم و امیدوارم خوشتون بیاد. سوالی دارین زیر همین پست بپرسین جواب میدم. https://kaliboys.com/sql-injection/