نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

11 آوریل 2020

آسیب پذیری های از نوع Deserialization در اکثر زبان ها وجود دارند و در این پست قصد داریم به بررسی مختصر و مفیدی از این آسیب پذیری در زبان NodeJS بپردازیم، بهره برداری Deserialization در NodeJS نسبت به زبان های دیگه ساده تر هست.

در صورتی که ورودی ارسالی به تابع Unserialize داده بشه، این آسیب پذیری رخ میده و حتی موجب RCE یا اجرای کد برروی سرور میشه اما برای بالا بردن شانس بیشتر در بهره برداری بهتره که از تکنیک Immediately invoked function expression یا IIFE هم استفاده بشه.

قطعه کد آسیب پذیر:

در اینجا قطعه کد آسیب پذیری رو آماده کردم تا بهتر متوجه بشید:

توضیح کد آسیب پذیر:

در ابتدا بررسی میشه که آیا کاربر درحال حاضر دارای کوکی به اسم Token هست یا خیر، در صورتی که وجود نداشته باشه پیغامی مبنی بر “Reload the Page” قابل مشاهده هست که باید صفحه رو رفرش کنید:

و در صورتی که که کوکی نداشته باشید، برروی مرورگرتون ست میشه و با صفحه زیر مواجه میشید:

اگر به کد بالا توجه کرده باشید، میبینید که مقدار Token ست شده در فضای کوکی داره دیکد و بعد Unserialize میشه که آسیب پذیری مذکور همینجا رخ میده که دیتای ارسالی به این تابع توسط کاربر قابل کنترل بوده و بررسی امنیتی در سمت سرور برروی اون انجام نشده.

مقدار Token بعد از Base64 دیکد شدن به شکل زیر هست:

حالا همونجوری که میبینید این Object به تابع Unserialize ارسال میشه و بعد Property به اسم username از داخل اون خونده میشه، حالا کاری که ما باید انجام بدیم این هست که یه Malicious Object بسازیم و بعد اون رو Serialize کنیم، تا بعد از اینکه توسط اپلیکیشن آسیب پذیر Unserialize شد بتونیم کد دلخواه رو اجرا کنیم.

قطعه کد بالا رو اجرا میکنیم تا بتونیم در خروجی کد اکسپلویت رو داشته باشیم:

اما اکسپلویت بالا مشکل داره و اجرا نمیشه، چون کد اکسپلویت هیچوقت اجرا نمیشه، دلیلش هم این هست که تابعی که اون رو تعریف کردیم و داخلش دستور سیستم عامل وجود داره هیچوقت صدا زده نمیشه و به همین دلیل اکسپلویت اجرا نمیشه و اگر اکسپلویت بالا رو Base64 Encode کنیم و بعد اون رو ارسال کنیم با صفحه زیر مواجه میشیم.

برای اینکه کاری کنیم که اکسپلویتمون اجرا بشه باید از تکنیک Immediately invoked function expression یا IIFE استفاده کنیم:

تعریف این تکنیک هم این هست که IIFE یک تابع جاوا اسکریپت هست که در زمان تعریف(Define) اجرا (Call) میشه.

برای انجام اینکار هم کافیه که پرانتز هایی که برای صدا زدن توابع هستن رو در زمان تعریف Object اضافه کنیم.

حالا در صورتی که بیایم و کد بالا رو اجرا کنیم تا نتیجه اون یعنی کد اکسپلویت رو برای ارسال دریافت کنیم، با خروجی زیر مواجه میشیم.

دلیل اینکه مثل دفعه ی قبل آبجکت Serialize شده تابع اکسپلویت رو مشاهده نمیکنیم این هست که متاسفانه اگر بیایم و پرانتزها رو اضافه کنیم، کد خودمون اجرا میشه و دیگه نمیتونیم کد اکسپلویت رو داشته باشیم، برای اینکه این مشکل رو حل کنیم کافیه که فقط بیایم و اکسپلویت قبلی رو اجرا کنیم و خودمون در خروجی پرانتز ها رو اضافه کنیم.

حالا اگه کد بالا رو Base64 Encode و در کوکی قرار بدیم و صفحه رو رفرش کنیم در سمت سرور کد ما اجرا میشه.

حالا چطور میتونیم این رو ارتقا بدیم و بتونیم Reverse Shell دریافت کنیم؟

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

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

سینا خیرخواه
9 پست نوشته شده
دوست دارم بیشتر رو بیشتر یاد بگیرم ، سر درآوردن از سیستم هایی که پیچیده هستن برام خیلی باحاله.
اینجا از تجربیات و باگ های که پیدا میکنم براتون مینویسم.
دسته‌ها: امنیت وب
  • به اشتراک بگذارید:
  1. Avatar علی گفت:

    سلام عالی بود فقط نود جی اس یه پلتفورمه زبان نیست

  2. Avatar رضا گفت:

    عالیه
    لطفا از این دست مطالب زیاد تر بگذارید

  3. Avatar Cinna گفت:

    ممنون سینا. خوب و جامع توضیح دادی. ادامه بده لطفا

  4. Avatar امیر گفت:

    حال کردم واقعا، ممنون میشم از این دسته مطالب رو بیشتر پوشش بدین و در صورت امکان اگه روی PHP هم همین کار رو توضیح بدین عالی میشه

  5. Avatar پیام گفت:

    سلام
    این موردی که شما تشریح کردید درصورتیه که اگر session رو با token ارسال کنیم موضوع صادقه ولی درصورتی که session بر اساس session id ست بشه احتمالا مطلب فرق می کنه درسته ؟

    • سینا خیرخواه سینا خیرخواه گفت:

      تمرکز session نیست، هر دیتایی که کاربر روی اون کنترل داشته باشه که میتونه حتی API Endpoint باشه که پارامتر های دریافتی JSON هستن و Serialize شاید انجام بشه

  6. Avatar محمد گفت:

    آموزش هاتون عالیه

  7. Avatar حسام گفت:

    خوب بود ولی نود زبان نیس یه پلتفرمه داداچ