درود دوستان امیدوارم حالتون خوب باشه٬ من شادمهرم 20 سالمه و تقریبا یک سال و پنج ماه هست که وارد فیلد امنیت شدم.
من همیشه وقتی میخوام کارمو شروع کنم از Register شروع میکنم و علاقه خاصی به این قسمت دارم٬ توی این پروژه Pentest هم اولین کاری که کردم ساخت دوتا حساب کاربری بود.
این برنامه برای تایید ایمیل و ورود از OTP استفاده میکرد و بلافاصله با استفاده از چک لیستی که داشتم شروع کردم که فرایند ارسال OTP رو دور بزنم.
اولین کاری که کردم این بود که با ابزار ffuf کد رو brute force کنم٬ بلاک نمیکرد اما نمیدونم چرا نمیتونست به درستی خروجی بده٬ علاوه بر ffuf با burp intruder هم امتحان کردم اما نتیجه ای نداشت.
کار بعدی که کردم این بود توی request های burp دنبال کد بگردم شاید تو یکی از endpointها کد باشه اما اینم جواب نداد!
یکی دیگه از کارهایی که کردم٬ این بود که javascript برنامه رو خوندم چون امکان دادم که شاید OTP ها به صورت کاملا رندوم تولید نشه و اون تابع افشا بشه یا فقط از چندتا OTP(مثلا 100 تا) استفاده کنند اما باز هم جواب نداد!
خب دیگه وقته خلاقیت و تفکره:
من برنامه نویس نیستم اما سعی کردم خودمو جای برنامهنویس قرار بدم و ببینم چطور میشه این OTP هارو رو ذخیره کرد٬ یا تشخیص بده کدوم OTP برای کدوم ایمیل هست.
با کمی خلاقیت یه تست اومد تو ذهنم به این صورت که اگر برای دوتا ایمیل همزمان درخواست OTP کنم چی میشه؟
هر دوتا کد یکیه؟
امکان داره که هردو کد رو یکجا ذخیره کنه؟
کد هارو جایگزین کنم جواب میده؟
تست میکنیم .🤷🏽♂️
خب من دوتا حساب کاربری داشتم یکی attacker@gmail.com یکی هم victim@gmail.com و میخواستم به حساب victim دسترسی بگیرم اما خب میدونید که به OTP دسترسی نداشتم.
به OTP حساب victim دسترسی نداشتم ولی به attacker دسترسی داشتم که!
پس اومدم دوتا درخواست همزمان باهم فرستادم و OTP حساب attacker رو برای victim زدم و یک 500 کوبید تو صورتم.
کاملا بی دلیل پیش خودم گفتم بزار تایم تموم شه (60 ثانیه) و بعد این حرکتو انجام بدم و خیلی زیبا وارد حساب کاربری victim شدم، یعنی اون OTP که برای attacker ارسال شد رو بعد از اینکه تایم تموم شد برای حساب victim زدم.
بعد از صحبت با تیم برنامهنویسی و بررسی کد متوجه شدیم چیزی که باعث شد همچین آسیبپذیری به وجود بیاد این بود که بعد از تموم شدن تایم دیگه چک نمیکردن OTP برای اون ایمیل هست یا نه و برای همین میتونستیم با OTP که بهش دسترسی داشتیم حساب قربانی رو تصاحب کنیم.
بعد از اینکه تایم تموم میشد همونطور که تو عکس زیر معلومه یک همچین اتفاقی میوفتاد و برای همین کافی بود اون کدی که وارد میکنیم تو OTP Storage باشه:
چیزی که Severity این آسیب پذیری رو بالاتر میبره اینه که هر حساب یک Wallet داره و برای انتقال پول در آخر یک OTP به ایمیل ارسال میکنه٬ از اونجایی که اینجاهم همین Misconfig وجود داشت attacker بدون دسترسی به ایمیل victim میتونست 2FA رو دور بزنه و پول رو به Wallet خودش بزنه.
فکر میکنم تا الان نحوه پچ کردن این آسیبپذیری رو متوجه شده باشید٬ همهی کد هارو یکجا ذخیره میکردن٬ منقضی نمیشد و بعد از اینکه تایم تموم میشد دیگه هیچ فانکشنی برای چک کردن درست یا غلط بودن کد نداشتن و کافی بود بعد از اینکه تایم تموم میشد اون کد دیگه جایی ذخیره نباشه و منقضی بشه.
خودتون رو جای برنامه نویس بزارید خیلی وقتها نتیجه خوبی میگیرید.
امیدوارم که از این رایتاپ لذت برده باشید.
واقعا دمت گرم خلاقیت به این میگن
یک سوال ابتدایی دارم میشه بگی چجوری فایل js میخونی؟
فایل هایی که تو صفحه لینک شده، فاز کردن فایل js و…
عالی
بسیار عالی
جالب بود
ولی واقعا سامانه خیلی داغون بوده که این otp code نه به سشن و نه به ایمیل بایند نبوده. فقط میومده میدیده تو storage هست یا نه اکسپایر هم نمیشده
ممنونم، قبل از اینکه تایم تموم بشه به jwt بایند بوده ولی بعد از اتمام تایم کلا هیچ checker function نداشت.