باگهای پنهان دنیای باگ بانتی بخش چهارم
در مقاله باگهای پنهان دنیای باگ بانتی بخش چهارم در مورد آسیبپذیری Race Conditions صحبت میکنیم که از دید افراد مخفی مانده.
بیشتر اپلیکیشنها یک فرض مشترک دارند:
«کاربران، عملیات را یکییکی انجام میدهند.»
اما مهاجمان اینطور عمل نمیکنند.
آسیبپذیریهای Race Condition زمانی رخ میدهند که دو یا چند درخواست بهصورت همزمان به یک منطق برنامه ارسال شوند و برنامه نتواند آنها را به شکل ایمن مدیریت کند.
- بدون تزریق (Injection)
- بدون ترفندهای خاص در Payload
- فقط با استفاده از زمانبندی
و اگر زمانبندی درست باشد، نتیجه میتواند این موارد باشد:
- دریافت پول رایگان
- چندین بار دریافت بازپرداخت (Refund)
- استفاده نامحدود از کدهای تخفیف
- دستکاری موجودی حساب
- سوءاستفاده از موجودی کالا
این یکی از پردرآمدترین باگهای منطق کسبوکار (Business Logic) در دنیای باگبانتی است.
🧠 Race Condition چیست؟ (توضیح ساده)
Race Condition زمانی اتفاق میافتد که:
- برنامه ابتدا یک شرط را بررسی میکند.
- سپس عملیاتی را انجام میدهد.
- اما برای آن عملیات هیچ قفل (Lock) یا مکانیزم همگامسازی (Synchronization) در نظر نگرفته است.
در نتیجه، وقتی چندین درخواست همزمان ارسال شوند، همه آنها از مرحله بررسی عبور کرده و همگی عملیات را اجرا میکنند.
به بیان ساده:
«ابتدا بررسی کن، بعد بهروزرسانی کن» ❌ بدون قفلگذاری = آسیبپذیری
🎯 چرا این باگ بسیار خطرناک است؟
Race Condition معمولاً منجر به موارد زیر میشود:
- زیان مالی مستقیم
- خرابی یا ناسازگاری موجودی کالا
- سوءاستفاده از سیستم پاداش
- افزایش غیرمجاز اعتبار یا موجودی کیف پول
و مهمتر از همه:
- این رفتارها در لاگها شبیه فعالیت عادی کاربران به نظر میرسند.
- بسیاری از سیستمهای تشخیص تقلب نیز قادر به شناسایی آنها نیستند.
به همین دلیل، شرکتها در صورت اثبات چنین آسیبپذیریهایی معمولاً آن را در سطح P1 (بحرانی) طبقهبندی میکنند.
🐞 باگهای واقعی باگبانتی که احتمالاً تاکنون ندیدهاید
اگر میخواهید بهجای یافتن باگهای تکراری که همه به دنبال آن هستند، آسیبپذیریهای خاص و کمتر شناختهشده پیدا کنید، این مجموعه برای شماست.
📹 روند واقعی سوءاستفاده (ذهنیت PoC)
مهاجم:
- 20 درخواست موازی ارسال میکند.
- به مسیر
POST /redeem-coupon
سپس سرور:
- بررسی میکند که
coupon_valid = true - اما هیچ مکانیزم قفلگذاری وجود ندارد.
نتیجه:
- همه درخواستها از مرحله بررسی عبور میکنند.
- کوپن 20 بار استفاده میشود.
💥 پیامد: خسارت مالی
نکته مهم این است که مشکل در خود Endpoint نیست؛ مشکل در فرض اشتباه برنامه است.
🧪 هنگام شکار باگ، کجا باید به دنبال Race Condition بگردیم؟
Race Condition معمولاً در عملیاتهایی دیده میشود که وضعیت سیستم را تغییر میدهند.
اهداف باارزش
- استفاده از کدهای تخفیف
- افزایش موجودی کیف پول
- درخواست بازپرداخت
- دریافت پاداش
- فعالسازی دوره آزمایشی رایگان
- توکنهای بازیابی رمز عبور
- تأیید ایمیل یا شماره تلفن
- خرید موجودی کالا
- رزرو صندلی
- بارگذاری فایلهایی با محدودیت تعداد
اگر یک قابلیت:
- موجودی را تغییر میدهد،
- شمارندهای را تغییر میدهد،
- یا دارای محدودیت است،
آن را از نظر Race Condition بررسی کنید.
🧪 چگونه Race Condition پیدا کنیم؟ (گامبهگام)
مرحله اول: یک بررسی وضعیت (State Check) پیدا کنید
به دنبال منطقهایی مانند موارد زیر باشید:
- فقط یک بار
- سقف مجاز رسیده است
- یک بار برای هر کاربر
- موجودی باقیمانده
- قبلاً استفاده شده است
نمونه Endpointها:
POST /redeem
POST /claim
POST /apply-coupon
POST /refund
مرحله دوم: درخواست معتبر را ذخیره کنید
با استفاده از Burp Suite عملیات را یک بار بهصورت عادی انجام دهید.
سپس درخواست را به یکی از این ابزارها ارسال کنید:
- Repeater
- Turbo Intruder
این درخواست، Payload پایه شما خواهد بود.
مرحله سوم: درخواستهای موازی ارسال کنید (مهمترین بخش تست)
گزینه A: Burp Turbo Intruder (پیشنهادی)
از قالب زیر استفاده کنید:
def queueRequests(target, wordlists):
engine = RequestEngine(
endpoint=target.endpoint,
concurrentConnections=20,
requestsPerConnection=1,
pipeline=False
)
for i in range(20):
engine.queue(target.req)
def handleResponse(req, interesting):
table.add(req)
این اسکریپت 20 درخواست را تقریباً همزمان ارسال میکند.
گزینه B: استفاده از curl برای اهداف ساده
for i in {1..20}; do
curl -X POST https://target.com/redeem &
done
🧰 ابزارهایی که واقعاً به آنها نیاز دارید
ابزارهای اصلی
- Burp Suite
- Repeater
- Turbo Intruder (ضروری)
- curl
- DevTools مرورگر (اختیاری)
نیازی به اسکنر یا فازر نیست.
زمانبندی مهمتر از Payload است.
🧪 Payloadها (هیچ چیز پیچیدهای وجود ندارد)
یک نکته مهم:
Race Condition به Payload خاصی نیاز ندارد.
شما دقیقاً همان درخواست معتبر را تکرار میکنید.
مثال:
POST /redeem-coupon
{
"coupon": "WELCOME100"
}
قدرت حمله در ارسال همزمان درخواستهاست، نه در تغییر Payload.
🚩 نشانههای قوی وجود آسیبپذیری
به دنبال موارد زیر باشید:
- افزایش موجودی بیش از مقدار مورد انتظار
- استفاده مجدد از کوپن پس از علامتگذاری بهعنوان مصرفشده
- منفی شدن موجودی کالا
- دریافت چند پاسخ موفق
- ترکیبی از موفقیت و خطا در درخواستها
- ناسازگاری وضعیت رابط کاربری پس از Refresh
اگر نتایج درخواستها با یکدیگر تفاوت داشتند، موضوع را عمیقتر بررسی کنید.
🧨 چگونه این باگ را به یک P1 تبدیل کنیم؟
برای افزایش شدت آسیبپذیری:
- وضعیت قبل و بعد را نشان دهید.
- قابلیت تکرار را اثبات کنید.
- تأثیر مالی یا منطقی را بهوضوح نمایش دهید.
مثال:
- موجودی قبل: 100 روپیه
- موجودی بعد: 2000 روپیه
- کوپن: فقط برای یک بار استفاده طراحی شده بود
این یک اثبات تأثیر واقعی روی کسبوکار است، نه صرفاً نمایش وجود یک باگ.
📝 نحوه گزارش این آسیبپذیری
عنوان
Race Condition Allows Multiple Coupon Redemptions Leading to Financial Impact
(شرایط رقابتی امکان استفاده چندباره از کوپن را فراهم کرده و منجر به خسارت مالی میشود)
تأثیر
مهاجم میتواند با ارسال چندین درخواست همزمان به Endpoint مربوط به استفاده از کوپن، یک کوپن را چندین بار مصرف کند.
به دلیل نبود مکانیزم همگامسازی، این موضوع میتواند منجر به خسارت مالی مستقیم و دستکاری موجودی شود.
اهمیت موضوع
- دور زدن محدودیتهای تجاری
- ایجاد خسارت مالی
- دشوار بودن شناسایی در لاگها
🧠 چرا بیشتر شکارچیان باگ این آسیبپذیری را از دست میدهند؟
زیرا:
- در تستهای تکدرخواستی قابل مشاهده نیست.
- به صبر و حوصله نیاز دارد.
- نیازمند تست موازی است.
- در نگاه اول «آسیبپذیر» به نظر نمیرسد.
بیشتر شکارچیان بررسی میکنند چه چیزی رخ میدهد.
شکارچیان حرفهای بررسی میکنند چه زمانی رخ میدهد.
🚀 بعد از خواندن این مطلب چه کاری باید انجام دهید؟
هر زمان با عبارتهایی مانند موارد زیر مواجه شدید:
- فقط یک بار
- محدودیت
- مقدار باقیمانده
- قبلاً استفاده شده
به Race Condition فکر کنید.
همین یک نوع آسیبپذیری میتواند شما را وارد برنامههای خصوصی باگبانتی کند.
🐾 قسمت بعدی این مجموعه
Prototype Pollution
چگونه تنها یک کلید در JSON میتواند بهصورت مخفیانه شما را به مدیر سیستم تبدیل کند و چرا هنوز بسیاری از برنامهها در برابر آن آسیبپذیر هستند.

