یک روز ، یک جمله ...

امروز به هر کاری که قراره انجام بدی، باور داشته باش

02 آبان

امنیت و راه های مقابله با نفوذ - بخش اول مطلب ویژه

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

در ابتدا می بایست متذکر شویم که این دوره آموزشی جهت یادگیری فرآیند حمله تزریق SQL به منظور تست وب سایت ها در مسیر ارتقا امنیت آنها می باشد، لذا هرگونه استفاده غیراخلاقی از این آموزش مجاز نمی باشد. با ما همراه باشید.

به منظور تست آسیب پذیری یک سایت برای حمله SQL Injection می بایست از Dork های گوگل جهت شناسایی وب سایت استفاده نماییم. کافی است یک دورک مانند زیر را در گوگل جستجو نمایید:

Inurl:News_more.php?id=

به منظور آشنایی با انواع Dork های گوگل این لینک را مشاهده نمایید.

از نتایج نمایش داده شده توسط گوگل، چند نمونه سایت باز کنید. در انتهای URL یک علامت ‘ قرار دهید و دکمه Enter را فشار دهید. در صورتیکه سایت با هرگونه تغییری اجرا شود، می توان گفت که این وب سایت در مقابل حمله SQL Injection آسیب پذیر می باشد و در غیر این صورت وب سایت مذکور در شرایط عادی باگ ندارد.

حال یک وب سایت پیدا کنید که باگ مذکور را داشته باشد. حال می خواهیم روی این وب سایت اقدام به بدست آوردن ستون های سایت نماییم. دستوری که باید استفاده شود در زیر آورده شده است:

Order+by+”یک عدد بزرگ”--

اضافه کردن این خط در انتهای URL به منظور به دست آوردن تعداد ستون های یک وب سایت است. برای درک بهتر می توانید ستون های وب سایت را پوشه های درون یک درایو در نظر بگیرید که می خواهیم به مهمترین آنها مثلا پوشه ویندوز دسترسی پیدا کنیم. انتخاب یک عدد بزرگ به منظور رسیدن به این مقصود است که سایت مورد هدف دارای بایپس می باشد یا خیر. به این معنا که می خواهد ما را گمراه کند یا خیر. لذا در صورتیکه این عبارت را زدیم و سایت بدون هیچ خطایی لود شد (در صورتیکه با اضافه کردن ‘ در انتهای URL سایت دچار تغییر شده بود) یعنی سایت دارای ByPass می باشد، بنابراین به انتهای این خط یک + اضافه می نماییم:

Order+by+”یک عدد بزرگ”--+

حال این عدد را آنقدر کوچک می کنیم که سایت بدون خطا و تغییر اجرا شود. ممکن است حتی این عدد به 2 و 1 نیز برسد. باید به یاد داشته باشید که می بایست به عدد برسید که یک عدد بالاتر از آن باعث بروز همان خطا و یا تغییر در سایت شود.

حال که عدد مورد نظر را به دست آوردیم، می خواهیم ورژن SQL سایت را به دست بیاوریم. برای این کار از دستور زیر استفاده می کنیم:

Union+select+1,2,3,4,5,….(تا عددی که به دست آورده اید ادامه دهید)--

با زدن عبارت بالا، 2 حالت ایجاد می شود. اولین حالت این است که سایت دارای ByPass بوده و ستون آسیب پذیر را نشان نمی دهد و یا اینکه بعد از زدن این عبارت عدد ستون آسیب پذیر در سایت نمایش داده می شود. در صورتیکه سایت دارای ByPass بود، با اضافه کردن یک – در پشت عدد مربوط به id می توان این ByPass را کنار زد.

زمانیکه عدد ستون آسیب پذیر در وب سایت نمایش داده شد، با استفاده از دستور ()Version می توان نسخه SQL را به دست آورد. برای این کار، این دستور را به جای عدد آسیب پذیر در دستور union+select قرار دهید. نام دیتابیس را نیز با دستور ()database می توانیم به دست آوریم. این دستور را نیز می توانید به جای عدد آسیب پذیر نمایش داده شده در وب سایت در دستور union+select قرار دهید.

حال می خواهیم لیست Table ها را به دست آوریم. برای این کار برای SQL های نسخه 5 دستور (group_concat(table_name را به جای یک عدد آسیب پذیر قرار می دهیم و در انتهای URL بعد از آخرین عدد دستور ()from+information_schema.tables+where+table_schema=database قرار می دهیم.

با زدن این دستور لیست جداول سایت نمایش داده می شود. در بین این جداول، جداولی که با نام admin و user و member و .... مشخص شده اند برای ما ارزشمند می باشند.

http://www.tidytowns.ie/interior.php?id=-2+union+select+1,2,group_concat%28table_name%29,4,5,6,7+from+information_schema.tables+where+table_schema=database%28%29%20--

حال می خواهیم اقدام به بدست آوردن نام کاربری و رمز عبور سایت کنیم. برای این منظور با مشخص کردن جدول مورد نظر و قرار دادن آن به جای ()database در انتهای دستور بالا می توانیم اطلاعات جدول را مشاهده نماییم. اما این نام جدول باید به صورت hex شده جایگزین ()database شود. برای این منظور برنامه Hexa Decimal Convertor را دانلود نمایید. در ادامه باید تغییرات زیر در دستور بالا ایجاد شود:

Group_concat(table_name) > Group_concat(column_name)
information_schema.tables > information_schema.columns
table_schema > table_name

با ایجاد تغییرات بالا و اعمال آنها، اطلاعات مورد نیاز ما به دست می آیند. این اطلاعات شامل ردیف های جدول می باشند. حال می خواهیم اطلاعات درون این ردیف های را به دست آوریم. این اطلاعات مهم را از روی ردیف های به دست آمده استخراج نمایید. به طور مثال درون ردیف های استخراج شده عبارت Username,Password وجود دارد. از این دو عبارت استفاده می کنیم تا اطلاعات کسب نماییم. برای این منظور این دو عبارت را درون پرانتز دستور بالا در بخش ()group_concat قرار می دهیم و در انتهای دستور بعد از from+ تمام خط را پاک کرده و به جای آن نام جدولی را که به صورت Hex درآوردیم ولی این بار به صورت text قرار می دهیم(بعد از + مربوط به from). به منظور تشخیص Username از Password می بایست بین این دو در درون پرانتز یک مقدار مانند : به صورت Hex شده قرار دهیم. مقدار Hex شده : معادل 0x3A می باشد.

ممکن است رمزعبور داده شده به صورت HASH شده نمایش داده شود. به همین دلیل می بایست پس از به دست آورن مقدار HASH آنرا به مقدار اصلی برگردانید. به این منظور می توانید از وب سایت های متعددی استفاده نمایید، اما یک وب سایت بسیار قوی وب سایت www.onlinehashcrack.com می باشد که هرنوع مقدار HASH را به مقدار اصلی تبدیل می نماید. اما نکته اینجاست که این وب سایت با دریافت وجه این کار را انجام میدهد.

نکته: به منظور ByPass کردن مرحله order+by در صورتیکه سایت مورد هدف شما بخواهد شما را گمراه کند 2 حالت زیر رخ خواهد داد:

  • با زدن ‘ شما تغییر را مشاهده می کنید اما با زدن order+by+ یک عدد بزرگ، شما سایت را به صورت کامل مشاهده می نمایید. در این صورت یک + به انتهای دستور و نگهداشتن مقدار ‘ بعد از عدد می تواند به شما کمک نماید.
  • در صورتیکه دستور order حتی تا عدد 1 نیز جوابی نداشت ولی سایت دارای باگ مربوط به SQL Injection بود می توانید از دستور group به جای order استفاده نمایید.

نکته: به منظور ByPass کردن مرحله (group_concat(table_name در صورتیکه سایت مورد هدف اطلاعات جداول را به شما نشان نداد اقدام زیر را انجام دهید:

بسیاری از سایت ها به مقدار hex حساس می باشند. لذا می بایست از دستور زیر استفاده نمایید:

Unhex(hex(group_concat(table_name)))

نکته: در صورتیکه بعد از قرار دادن دستور union+select+ با پیغام خطای Not Acceptable مواجه شدید، می بایست مقدار /*!50000*/ را برای union قرار دهیم، به این صورت:

/*!50000union*/

در صورتیکه در مراحل بعدی نیز با همین پیام خطا روبرو شدید، می بایست برای تمام دستورات از این مقدار استفاده نمایید یعنی برای Group_concat و from نیز مانند union مقدار دهی را انجام میدهیم، اما اگر باز با این پیام خطا روبرو شدید، به صورت تصادفی حروف دستورات استفاده شده را از حالت کوچک به بزرگ تغییر دهید.

نکته: ممکن است در زمان قراردادن دستور order+by با پیام خطای Forbidden مواجه شوید، در این صورت از روش زیر استفاده نمایید:

/**WORD**/

مقدار بالا را قبل از دستور order قرار دهید و به جای کلمه WORD یک حرف مانند V قرار دهید، در صورتیکه پیام خطا حذف شد که شما موفق به ByPass شده اید در غیر این صورت این مقدار را حذف کرده و آنرا قبل از by قرار دهید.

تا پایان مراحل، اگر پیام Forbidden را مشاهده کردید، از همین روش استفاده نمایید تا زمانیکه این پیام حذف شود.

نکته: در مواردی ممکن است ستون آسیب پذیر سایت درون آدرس URL یک عکس قرار داده شود! به این معنا که زمانیکه شما مراحل را طی کرده و به جایی رسیده اید که باید شماره ستون آسیب پذیر روی وب سایت نمایش داده شود ولی این اتفاق رخ نمیدهد، باید به تصاویر وب سایت توجه کنید. اگر تصویری در وب سایت وجود داشت که بعد از گذراندن مراحل تا قبل از اجرای دستور مشاهده ستون های آسیب پذیر اجرا می شده و بعد از دستور نمایش ستون ها اجرا نمی شود، کافیست آن عکس را درون یک تب جدید بازکنید و به آدرس URL آن دقت کنید. در انتهای این آدرس شماره ستون آسیب پذیر نمایش داده می شود. با زدن دستور Version و Database باز همین کار را انجام دهید. در انتهای URL این عکس، نتیجه شما قرار داده می شود.

همین فرآیند تا انتهای مسیر دستورات ادامه پیدا خواهد کرد و شما می بایست تمام نتایج را درون URL تصویر جستجو نمایید. 

رضا اردانه

مدیریت وب سایت آموزش دیجیتال

نظر دادن

خبرنامه

برای دریافت جدیدترین خبرهای سایت در خبرنامه عضو شوید