توضیح کوتاه درمورد آسیب پذیری SQL Injection
SQL injection یک نوع حمله در وب است که از آن استفاده میشود تا به سیستمهای پایگاه داده نفوذ شود. زیرا در برخی از موارد، ترکیبهای ورودی کاربر به صورت نادرست در دستورات SQL استفاده میشود و این اجازه را به حمله کننده میدهد تا دستورات SQL خود را در دستور SQL اصلی اجرا کند.
به زبان ساده تر، این آسیب پذیری باعث تزریق و اجرای کد های SQL در پایگاه داده (database) می شود.
به دنبال هدف!
برای پیدا کردن تارگت، از گوگل دورک (Google Dork) استفاده کردم. دورک که من استفاده کرده بودم این بود:
inurl:search.php?q=
در اصل هدف استفاده من از این دورک برای پیدا کردن سایت های آسیب پذیر به XSS بود، که داستان با XSS شروع شد و با SQL Injection تموم شد 😁
میتونید رایتاپ XSS این هدف رو هم اینجا بخونید
بین سایت هایی که گوگل آورد، یکی رو انتخاب کردم که توی این رایتاپ اسمش رو target.com میذاریم، تا دردسر نشه 🤫
بریم سراغ تست!
در قسمت سرچ این سایت کلمه “hacker” رو نوشتم تا ببینم کجا ها ازش استفاده می شود🤔
Inspect رو باز کردم و کلمه “hacker” رو سرچ زدم، همانطور که می بینید کلمه “hacker” در قسمت بدنه درخواست ajax استفاده می شود:
فکر کنم تا الان فهمیدین که ورودی ما در یک رشته مانند کوئری SQL استفاده میشه؛ حالا چه تستی به ذهنتون میرسه؟💡
دقیقا SQL Injection😁
اولین کاری که کردم ببینم چند تا ستون داره تا بتونم بر اساس اون Payload های بعدی رو تست کنم.
اولین کوئری که زدم ” order by” بود:
همان طور که در عکس بالا می بینید، کوئری هایی ارسالی ما اجرا میشه، پس شروع کردم به صورت تصادفی عدد ها رو تست کردم و نهایت معلوم شد که این جدول 83 ستون داره.
میخواستم اسم جدول ها دیتابیس رو پیدا کنم ولی یک مشکلی بود؛ مشکل این بود که معلوم نبود کدوم ستون آسیب پذیر هست، چون زمانی که ورودی ها null میدادیم فقط به ما خطا نمایش می داد🤦♂️
اگر توی ذهنتون این هست که <خب به صورت Blind بزن>🙄
ولی یک حسی بهم می گفت که خیلی راحت تر میشه دیتا رو گرفت!
حتی با ابزار sqlmap هم تست کردم ولی جوابی نگرفتم چون ابزار نمیتونست پارامتر رو شناسایی کنه…
یک ایده زد به ذهنم که بیا مستقیم با جدول information_schema کار کنم و از اونجا اسم جدول های دیتابیس رو بگیریم😀
این ایده هم کار نکرد و با خطا مواجه شد…
گفتم برم بقیه جاهای سایت رو هم ببینم، شاید چیزی پیدا کردم که پس دیدن درخواست ها دیدم یک پارامتر جدید وجود داره!
جالبه!
این پارامتر اومده ستون هایی که میخواسته رو نام برده؛ اینجا فهمیدم که این پارامتر ها تک به تک داخل یک دستور کامل دیگه استفاده میشه😀
دوباره نگاه کردم به بدنه درخواست و یک چیز دیگه نظرم رو جلب کرد اون هم بقیه پارامتر های بدنه بود❗
همان طور که می بینید پارامتر table و MOD هم هست که یعنی اطلاعات رو از این جدول دریافت کن. حالا دیگه مسئله حل شد و فهمیدیم چه خبر هست!
بریم که اسم جدول های دیتابیس رو از information_schema بیرون بکشیم😁
همانطور که در عکس بالا می بینید اومدم:
داخل پارامتر “table” اسم جدول رو نوشتم که می شود => information_schema.tables
داخل پارامتر “what” اسم ستون مورد نظر که میخواستم اطلاعات رو بگیرم، نوشتم => TABLE_NAME
داخل پارامتر “sql” هم شرط خودم رو نوشتم => ()where table_schema = database
در آخر هم اسم ستون های یک جدول رو تونستم بگیرم😁❤️
نکات جالب که این هدف داشت!
1- واقعا جالب بود، توسعه دهنده وب سایت چرا باید کوئری دیتابیس رو داخل فرانت بنویسه🤔🙄
2- تنبل بودن هم گاهی اوقات خوبه، چون باعث خلاقیت و کشف راه آسون میشه 😁❤️
3- همیشه به پارامتر ها شک کنید! باعث آسیب پذیری ها بزرگی میشن😉💙
سخن پایانی
امیدوارم از این رایتاپ خوشتون اومده باشه و نکات جدیدی یاد گرفته باشین❤️
دیدگاه خود را بنویسید