بررسی بهره برداری بر پایه ارور از آسیب پذیری SQL Injection

همانطوری که در گذشته اشاره کردیم برای بهره برداری از آسیب پذیری SQL Injection روش های متعددی به علت متفاوت بودن کد آسیب پذیر یا مکانیزم های امنیتی وجود دارد.
توی این مطلب میخواهیم یک روش دیگه بهره برداری از آسیب پذیری SQL Injection که تحت عنوان Error Based نامیده میشود را با هم بررسی کنیم.

Error Based SQL Injection

اگر روش Union Based رو به خاطر داشته باشید میدونید که مبنای به دست آوردن اطلاعات ستون هایی بود که توسط برنامه نویس در داخل برنامه استفاده و در خروجی چاپ میشد ، حال فرض کنید برنامه نویس هیچ کدوم از ستون ها را در خروجی چاپ نکند؟! در این زمان چه راهی وجود دارد که ما اطلاعات را بدست آوریم !
بله درست فهمیدید ! به علت اینکه به Query دسترسی داریم میتونیم در قالب یک خطا اطلاعات را بدست آوریم !

برنامه آسیب پذیر:

در کد بالا که بر گرفته از قسمت ۵ اسکریپت SQL LAB میباشد مشاهده میکنید که ورودی در صورتی که درت باشد عبارت Run و در صورتی که غلط باشد مقداری را در صفحه چاپ نمیکند !

اگر آموزش روش Time Based و Boolean Based را در سایت مشاهده کرده باشید متوجه خواهید شد که با اون ۲ روش هم میتوان از این تارگت بهره برداری کرد .

در روش Error Based ما از یکی از اشکالات MySQL سوء استفاده میکنیم و در واقع این مشکل هست که باعث میشود که اطلاعات را میتوان در قالب یک خطا بدست آورد.

برای مرتب سازی اطلاعات علاوه بر دستور order by که از آن برای فهمیدن تعداد ستون ها میتوان استفاده کرد دستور group by هم در روش error based injection کاربرد دارد.
فرض کنید ما جدولی با این مقادیر داریم :

برای اینکه تفاوت Group by و Order by رو متوجه شید خروجی دستور زیر را ببینید:

مشاهده میکنید که دستور group by از تکرار پرهیز کرد ! پس عمده تفاوت بین این ۲ دستور در همین هست !

اما چه اتفاقی میافتد که ما با استفاده از این روش اطلاعات را در قالب خطا بیرون میکشیم !
به Query زیر دقت کنید:

در Query بالا مشاهده میکنید که در بار اول ارور نداد و در بار دوم به ما اروری را برگرداند ! علت این اتفاق چیست؟ Group_key در واقع یک ستون موقت است.
در واقع علت این پدیده تناقض بین ۲ دستور count(*) و group by هست . دستور count همه ستونن ها را بررسی میکنید تا تعداد آن ها را بیابد و از طرفی دستور group by تکرار پذیری را قبول نمیکند و زمانی که ۲ بار مقدار یک ستون پشت سر هم تکرار شود به ما ارور duplicate entry را بر میگرداند . در واقع این ارور فقط مختص به اینجا نیست و جا های دیگر هم وقتی ورودی تکراری وارد شود این ارور رخ میدهد.
اگر دقت کرده باشید خروجی ارور “۰” همان خروجی ستون x میباشد . ما اگر مقدار این ستون را تغییر دهیم میتوانیم اطلاعات مورد نیاز را در قالب یک خطا بگیریم. به Query زیر توجه کنید:

همانطور که مشاهده کردید ورژن دیتابیس و نام آن را بدست اوردیم ! به همین شکل میتوانیم بقیه اطلاعات مورد نظر را نیز بدست بیاوریم.
اما چند نکته اینجا حائز اهمین است.

نکته ۱ : همیشه ارور بازگردانده نمیشود و مگر زمانی که ۲ خروجی یکسان پست سر هم از مقدار ستون x خارج شود.
نکته ۲ : از عبارت as x به منظور تغییر نام جدول از عبارت طولانی استفاده میشود.

علاوه بر روش بالا که Double Query نامیده میشود روش دیگری نیز برای بهره برداری از این آسیب پذیری وجود دارد که نسبتا سریعتر میباشد. ما در این روش از عبارت شرطی having استفاده میکنیم.
به Query زیر دقت کنید:

در واقع روش بالا بیشتر در inject ها کاربرد دارد ! در روش اولیه ما ستون را ساختیم و اسم آن را تغییر دادیم و سپس در دستور group by به کار بردیم و در رو ش دوم بر عکس ! در واقع ما جای اینکه بسازیم و بعد در group by به کار ببریم مستقیما به کار بردیم و سپس برای گرفتن ارور از having count(*) استفاده کردیم که همان تناقضی که در روش اول رخ داد ، رخ دهد.

ارسال نظر

ایمیل شما منتشر نخواهد شد. پر کردن ورودی ها الزامی است. *

*

17 + 20 =