0
0

باگ SQL Injection چیست ؟ از سیر تا پیاز

6573 بازدید
باگ Sql Injection چیست ؟

باگ SQL Injection چیست ؟ از سیر تا پیاز

 

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

  • نکته : پیشنهاد میکنیم برای درک بهتر مقاله و توضیحات بعد از مطالعه مقاله حتما به مینی دوره SQL Injection رایگان ما داخل کانال یوتیوب مراجعه کنید !

 

باگ SQL Injection چیست ؟

آسیب پذیری Sql Injection یکی از معروف ترین آسیب پذیری های سمت وب اپ هست
که در OwaspTop10 2021 سومین آسیب پذیری رایج سطح وب سایت ها شناخته میشود
تزریق SQL نوعی حمله سایبری است که در آن یک هکر از یک کد SQL (زبان پرس و جوی ساختاریافته) برای دستکاری پایگاه داده و دسترسی به اطلاعات بالقوه ارزشمند استفاده می کند.

 

جریان چیه :

وب سایت ها برای ذخیره دیتا از دیتابیس ها استفاده میکنند تا داده های خود را ذخیره کنند حال برای ارتباط با دیتابیس
در زبان های برنامه نویسی باید از یک سری کوئری ارتباطی برای دیدن اطلاعات و تغییرات دیتا استفاده کنند که این کوئری ها با زبان sql نوشته میشود
دیتابیس ها به صورت SQL و NOsql هستند که در این مقاله به SQL ها می پردازیم.

 

حال آسیب پذیری کجاست ؟

خیال کنید چنین آدرسی داریم :


http://Site.Com/news/?news_id=5200

 


Host : site.com

endPoint : /news/?news_id=5200

Get Parameter : news_id = 5200

هرگاه چنین آدرسی دیدیم احتمال وجود Injection وجود دارد که یکی از اینجکشن ها SQL Injection هست وقتی چنین آدرسی داریم پس احتمالا درون کد سمت سرور چنین کوئری را داشته باشیم !


Select * from News where news_id = ‘5200’

در ادامه باگ Sql Injection چیست ؟

چون ما میتونیم  پارامتر آدرس news_id را برای سرور ارسال کنیم پس احتمال وجود آسیب پذیری هست

خیال کنید ما بجای 5200 مثلا کلمه ali را ارسال کنیم

کوئری ما به شکل زیر در می آید

Select * from news where news_id = ‘ali’

خب تا اینجا مشکلی نیست حال خیال کنید ما به جای ali  تک کوتیشن (‘) را ارسال کنیم. چه رخ خواهد داد ؟


Select * from news where news_id = ‘5200’’

اتفاقی که میافتد یک تک کوتیشن باعث میشود syntax ما به هم بخورد و منجر به Syntax Error میشود و این یعنی وب اپ دارای آسیب پذیری SQLI هست و ما می توانیم دستورات SQLI خود را وارد کنیم.

  • یک Page لاگین را فرض کنید خب ما برای لاگین Username و Password خودمون رو میزنیم تا لاگین بشه که احتمالا چنین کدی باشد.
Res_query = select * from users where username = ‘ali’ and password = ‘1234’

If Res_query {

login()

}else{

Error_login()}

خب برای لاگین شدن ما یوزر و پسوردمون رو ارسال میکنیم. و اگر چنین یوزرنیم و پسوردی داخل دیتابیس بود اون فچ میشود که 1 ارسال میشود که به معنای True هست و Res_query ما true میشود و عمل لاگین انجام میشود.

  • ما اینجا در میابیم که برای لاگین کردن باید جواب کوئری ما 1 یا True باشد (البته یک وبسایت آسیب پذیر را در نظر گرفتیم) !

 

حال خیال کنید ما کوئری خود را این گونه میزنیم.


' or 1=1 #


Select * from users where username = ‘ ’or 1=1 # ’ and password = ‘ ’or 1=1 # ‘

 

چه اتفاقی می افتد ؟

اگر وب سایت آسیب پذیر باشه شما با دسترسی اولین یوزر که احتمالا ادمین هم هست لاگین میکنید. چه شد ؟


Select * from users where username = ‘ ’or 1=1 # ’ and password = ‘ ’or 1=1 # ‘

 

ما وقتی پیلود خود را ارسال میکنیم کوئری به این شکل خوانده می شود

انتخاب کن همه اطلاعات کسی که یوزر نیم = ” یا ۱=۱ از جدول users خب ما نمیگیم اون کس کیه اما در ادامه میگیم یا ۱=۱ باشه که قطعا یک عبارت منطقی درست هست و اینطوری نتیجه ما true میشود و ما با اولین یوزر انتخاب شده لاگین میکنیم.

پس این قسمت چی میشه ؟


and password = ‘ ’or 1=1 # ‘

 

تو Sql وقتی به


#

--

-- +

می رسیم سمت راست کوئری را کامنت میکنه پس در نتیجه کوئری ما تا اینجا خونده میشه و اجرا میشه.


Select * from users where username = ‘ ’or 1=1 #   ‘

حالا چطور می شود اطلاعات را خوند ؟

روش های مختلفی وجود دارد که بستگی به نوع SQL Injection دارد. اگر برنامه نویس اطلاعاتی ار دیتابیس را فراخوانی و در صفحه به نمایش دهد می توان با روش union based اطلاعات را خواند (مثال news) اگر برنامه نویس فقط صحت اطلاعات رو بررسی کند دو حالت دارد اگر error sql در صفحه به نمایش در بیاید می توان با روش Error Based اطلاعات را فراخوانی کرد و اگر چیزی برای نمایش نداشت با دو روش Blind boolean و Blind Time Based

  • در پلتفرم های بزرگ معمولا حالت اول و دوم پیش نمی آید اما حاالت blind Time Based را می توان همیشه چک کرد . یک کلید طلایی در تمام آسیب پذیری های Injection استفاده از تابع Sleep() هست و معمولا اگر آسیب پذیر باشد جواب میدهد !

آسیب پذیری Sql معمولا در رخ میدهد

  • Parameter (Username or ID)
  • (Header) Cookies(if Saved In DB)
  • (Header) User-Agent(if Saved In DB)

 

روش Patch پارامتریزه کردن :

در این روش بجای اینکه ورودی را به صورت مستقیم به کوئری خود ارسال کنیم. آن را داخل یک متغییره پارامتریزه میکنیم و بعد آن را به کوئری تحویل میدهیم

 

  1. cursor.execute(“SELECT id FROM users WHERE username = ‘” + username + ‘”);
  2. cursor.execute(“SELECT id FROM users WHERE username = ‘%s'” % username);
  3. cursor.execute(“SELECT id FROM users WHERE username = ‘{}'”.format(username));
  4. cursor.execute(“SELECT id FROM users WHERE username = ‘{username}'”);
  5. cursor.execute(“SELECT id FROM users WHERE username = %s'”, (username, ));
  6. cursor.execute(“SELECT id FROM users WHERE username = %(username)s”, {‘username’: username});

 

فقط 5 و 6 امن هستند چون پارامتریزه شدن.

 

استفاده از توابع :


Sanitize()

Escape_string()

ابزار Sql Map 

sqlmap یک ابزار تست نفوذ منبع باز است که فرآیند شناسایی و بهره برداری از نقص های تزریق SQL و در اختیار گرفتن سرورهای پایگاه داده را خودکار می کند.
این دستگاه دارای یک موتور تشخیص قدرتمند، بسیاری از ویژگی‌های خاص برای آزمایش‌کننده نفوذ نهایی و طیف وسیعی از سوئیچ‌ها است که از انگشت نگاری پایگاه داده، واکشی داده‌ها از پایگاه داده، دسترسی به سیستم فایل زیرین و اجرای دستورات روی سیستم عامل از طریق خارج اتصالات باند !


Sqlmap -u “site.com?id=1*” --batch;

روش پیدا کردن اسم دیتابیس جاری


Sqlmap -u site.com?id=1 --dbs=mysql --Database

پیدا کردن اسم جداول


Sqlmap -u site.com?id=1 --dbs=mysql -D database --table_name

پیدا کردن اسم کالمن ها


Sqlmap -u site.com?id=1 --dbs=mysql -D database -T table_name --columns

گرفتن اطلاعات داخل جداول


Sqlmap -u site.com?id=1 --dbs=mysql -D database -T admin_tb -C username,password,email --dump

 

در آخر شما را مجدد برای درک بهتر از این آسیب پذیری دعوت به دیدن مینی دوره SQL Injection آموزش در یوتیوب میکنم. با ما همراه باشید !

 

جستجوی سایت های دارای باگ SQL Injection با ابزار Sqliv کلیک کنید !

0 0 votes
امتیازدهی به مقاله
آیا این مطلب را می پسندید؟
https://blacksecurityteam.com/?p=8204
اشتراک گذاری:
واتساپتوییترفیسبوکپینترستلینکدین
مهدی حسنی
مهدی حسنی
برنامه نویس زبان PHP و Python و رباتهای تلگرامی و فعال در زمینه امنیت سرورها و وب سایت ها
مطالب بیشتر
برچسب ها:
اشتراک در
اطلاع از
guest
0 نظرات
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x