دوره SEC542 – بخش بیست و ششم

دوره آموزشی SEC542

در این بخش از دوره آموزشی SEC542 از موسسه SANS با مبحث حمله Out-of-Band SQLi همراه شما بوده و همچنین به دستورات لازم برای حمله SQL Injection می پردازیم.

کوری مطلق : Out-of-Band SQLi

در انتهای طیف بینایی SQLi، نوع out-of-band SQLi قرار می‌گیرد. در این آسیب‌پذیری نه هیچ چیزی می‌بینیم و نه می‌توانیم بطور مستقیم چیزی را تجربه کنیم (نه خروجی داریم و نه می‌توانیم از تکنیک‌های استنتاجی استفاده کنیم). اما غیرمستقیم چطور؟ شاید بتوانیم مثلا دیتابیس را وادار کنیم تا یک درخواست DNS به دامنه تحت کنترل ما ارسال کند، یا یک سیستم را پینگ کند، یا یک کانکشن HTTP با جایی برقرار کند. این‌ها چیزهایی هستند که به OOB SQLi مربوط می‌شوند. در واقع اصطلاح out-of-band به معنای نیاز داشتن به یک کانال ارتباطی دیگر، برای کشف و اکسپلویت این دسته از SQLi است.

کانال‌های Out-of-Band

حتی اگر احتیاجی به out-of-band SQLi نداشته باشیم، باز هم ممکن است این روش به عنوان یک گزینه برای ما در دسترس باشد. این تکنیک کشف SQLi تکنیک دشواری است اما گاهی زحمت پیدا کردن آن به دردسرهای OOB می‌ارزد. مثلا در آسیب‌پذیری‌های blind SQLi مبتنی بر زمان، این روش کارآمد است. دلیل استفاده از این روش، قابلیت انتقال حجم زیاد دیتا، نسبت به تکنیک‌های سنتی اکسپلویت SQLi می‌باشد.
رایج‌ترین تکنیک‌های out-of-band معمولا ایجاد تونل‌های ارتباطاتی HTTP و DNS به سرور تحت کنترل مهاجم می‌باشد. جزئیات اکسپلویت out-of-band SQLi به عنوان تمرین به خواننده واگذار می‌گردد.

DB Fingerprinting

تابحال راجع به تکنیک‌های کلی مورد استفاده در SQLi صرف نظر از نوع دیتابیس صحبت کردیم. اما با دقیق شدن بر روی تکنیک‌های اکسپلویت این آسیب‌پذیری، اهمیت نوع دیتابیس مورد استفاده و تاثیر آن بر روی دستورات و پیلودهای ما بیشتر مشخص می‌گردد.
اگر تا این مرحله به نوع دیتابیس مورد استفاده پی نبرده‌اید، الان وقتش رسیده تا نوع آن را مشخص کنید. راه‌های متفاوتی برای این کار وجود دارد ولی متد اصلی، inject کردن دستورات خاص SQL است. دستوراتی که در تشخیص نوع دیتابیس به ما کمک می‌کنند. به مثال‌های زیر دقت کنید:

Special functions/parameters: SELECT @@version (MySQL and SQL Server)

String concatenation: (MySQL: ‘De’ ‘nt’ , MSSQL: ‘De’+’nt’ , Oracle: ‘De’||’nt’)

Unique numeric functions: (MySQL: connection_id(), MSSQL: @@pack_received , Oracle: BITAND(1,1))

Meta یا Database Info

یکی از دلایلی که نیاز داریم نوع DBMS را بدانیم، اینست که بفهمیم به چه اطلاعاتی از metadata می‌توانیم دست یابیم. با استفاده از metadata ، دیتابیس‌ها، جداول و ستون‌ها قابل دستیابی هستند.

در بهترین شرایط، احتیاجی به دانستن جزئیات RDBMS نداریم زیرا همه آن‌ها، دیتابیس (یا view) information_schema که در استاندارد ANSI SQL وجود دارد را پشتیبانی می‌کنند.

آشنایی با Blind SQL Injection

information_schema به ما این امکان را می‌دهد تا به راحتی نام دیتابیس‌ها، جداول و حتی ستون‌ها را بدست آوریم. متاسفانه Oracle ، DB2 و SQLite استاندارد information_schema را پشتیبانی نمی‌کنند.

پیاده‌سازی information_schema در دیتابیس‌های مختلف، متفاوت است. مثلا در MS SQL Server ، به شکل یک view نشان داده می‌شود که تنها اطلاعات دیتابیس جاری را در بر دارد. در حالیکه در MYSQL ، information_schema دیتابیسی است که اطلاعات همه دیتابیس‌ها را در خود دارد.

دیتابیس‌ها / جداول / ستون‌ها

در این بخش، جزئیات کوتاهی از نحوه شمارش و دستیابی به دیتابیس‌ها، جداول و ستون‌های قابل دسترسی از طریق SQLi را می‌بینیم:

MySQL:

Databases: SELECT schema_name FROM information_schema.schemata;
Tables: SELECT table_name FROM information_schema.tables;
Columns: SELECT column_name FROM information_schema.columns;

MS SQL Server or Azure SQL:

نکته: استفاده از information_schema در MS SQL Server کمی متفاوت است. کوئری‌های ما باید بطور صریح به یک دیتابیس خاص اشاره کند زیرا information_schema یک view است که تنها اطلاعات دیتابیس جاری را ارائه می‌دهد.

Databases: SELECT name FROM sys.databases;
Tables: SELECT name FROM sys.tables;
Columns: SELECT name FROM sys.columns;

Oracle:

Schemas: SELECT owner FROM all_tables;
Tables: SELECT table_name FROM all_tables;
Columns: SELECT column_name FROM all_tab_columns;

در Oracle ، لیست کردن Schema ها، نزدیک‌ترین مفهوم به لیست کردن دیتابیس‌ها در MySQL و MS SQL Server است.

Exploiting In-Band/Inline

در بخش‌های قبل راجع به باگ inline/in-band SQLi صحبت کردیم. در این دسته از باگ‌ها، اطلاعات (مانند پیام‌های خطا) معمولا قابل مشاهده‌اند. در این حالت ما می‌توانیم قسمتی از دیتای دیتابیس را ببینیم. این دیتا مربوط به ستون‌های جدولی است که کوئری SQL به آن اشاره می‌کند.

مثلا فرض کنید که ما در یک کوئری SELECT می‌توانیم inject کنیم. این یعنی ما احتمالا می‌توانیم تمام دیتای ستون‌های کوئری و تمامی دیتای جدولی که کوئری از آن SELECT می‌کند را ببینیم. بدین ترتیب بسته به جایی که در آن inject می‌کنیم، با مرزها و محدودیت‌هایی روبرو هستیم.

اما راه‌های متفاوتی برای عبور از این مرزها و دسترسی به دیتاهای بیشتر نیز وجود دارد.

مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.

درباره نویسنده: احسان نیک آور

ممکن است دوست داشته باشید