توی پست قبلی به این اشاره داشتیم که عرف یه ثبتنام به چه شکله و اگه یه فلو مخالف داشتیم چه تستهایی رو میتونیم روی اون فلو بزنیم. پس ما نسبت به سیستم احراز هویتی که جلومونه تغییر جهت میدیم و تستهای مربوط به اون سیستم رو اجرا میکنیم. سناریوی من یه سناریو روی یه تارگت واقعی Real-World هستش؛ پس آماده بشید بریم سراغ یه سناریوی کمی پیچیدهتر.
سناریوی من یه ثبتنام عادی بود با چند تا مرحله اضافهتر:
صفحه ریجستر تارگت از من یه ایمیل + شماره موبایل و پسورد میخواست. زمانی که من روی confirm کلیک میکردم، منو میبرد به یه صفحهای که ازم سوال میپرسید: «کدت رو به شماره موبایلت اساماس کنم یا به ایمیل بفرستمش؟»
روی ایمیل کلیک کردم. همونطور که داشتم با فرآیند آشنا میشدم، برپسوییت Burp Suite هم دونه به دونه درخواستها رو میگرفت. در واقع زمانی که من روی continue کلیک کردم، یه درخواست زده شد مشابه این:
یه درخواست POST زده میشد به این ای پی آی 👈 (/api/authentication/sign-in)
کانتنت بادی من جیسون JSON بود که این دیتا رو میفرستاد:
{
"LoginType": "email",
"password": "mypass",
"user": "dagen@gmail.com",
"session": "randommmmmmmmmmmmmmmmmm",
"locale": "en_us"
}تا اینجا درست. سرور بهم میگه تو لاگین تایپت ایمیله، درستم میگه چون خودم انتخابش کردم. ولی یه چیزیو نمیگه؛ اینکه آیا ما فقط دو حالت داریم؟ یعنی فقط SMS و ایمیل؟
زیاد واردش نمیشیم چون هدف ما فعلاً تست کردن این قسمت نیست و ازش رد میشیم.
توی پارامتر بعدی ما یه پسورد داریم که خودمون فرستادیمش. پارامتر بعدی یه سشن (session) داشتیم که توی هر درخواست ارسال میشد و بعد از وریفای شدنم تبدیل به access-token میشد.
بسیار خب، پارامترهای مهم رو بهش پرداختیم. نوبت به این میرسه که درخواست رو فوروارد کنم. وقتی فوروارد رو زدم، یه صفحه برام باز شد که من باید OTP که به ایمیلم ارسال شده بود رو وارد میکردم. اینتر رو زدم و اومدم توی برپ؛ یه درخواست POST دیگه زده شد که مربوط به کانفِرم کد تایید بود: (/api/authentication/confirm-otp)
توی دیتای جیسون هم دو تا پارامتر بیشتر نداشتیم:
{
"otp": "11111",
"session": "randommmmmmmmmmmmmmmmmm"
}پارامتر otp همون کد ولیدیه که به ایمیل من ارسال شد و پارامتر سشن هم همون سشنیه که توی هر درخواست ارسال میشه.
همین درخواست رو بردم توی تب Repeater و روی دکمه Send کلیک کردم. انتظار میره همهچیز درست باشه؛ ریسپانس سرور من یه 200 بود با یه بدنه جیسون که از کلاس usersigninsession توی پارامتر access-token توکن احراز شده منو بهم میداد:
{
"usersigninsession": {
"access-token": "myToken"
}
}(اینم اضافه کنم که اگه اشتباه وارد میکردم به من ۵۰۰ میداد با یه جیسون که ارور مسیج داشت). ثبتنام با این فلو به پایان رسید و قدم آخر اینکه سایت یه چیزیو از من ذخیره کنه تیک خورد ✅
بریم سراغ مغز آسیبپذیری
من تمام مراحل رو طی کردم. اینجا یه OTP ولید داشتم، درسته؟ زمانی که درست بود سرور به من یه اکسس توکن میداد و زمانی که اشتباه بود من ارور مسیج داشتم. توی ذهن من مدام یادآوری میشه که من باید کاری کنم که این منطق دور زده بشه و در نهایت سشن من آپگرید بشه و تبدیل به access-token بشه.
چه تستی کردم؟ "Array in SMS code"
توی کانتنت جیسون تستهای ما محدوده چون سمت سرور ما جیسونپارس داریم و این پارامترها میشینن توی آبجکت. برعکس خیلیها که میان اینجوری تست میکنن و کد دلبخواهی رو توی ارایه میزارن:
{
"otp": ["false-code"],
"session": "randommmmmmmmmmmmmmmmmm"
}و بعدش یه ارور مسیج خوشگل میگیرن و بیخیال ادامه میشن، من اومدم اینجوری تست کردم: کد ولیدی که به ایمیلم ارسال شده بود رو گذاشتم توی آرایه!
{
"otp": ["true-code"],
"session": "randommmmmmmmmmmmmmmmmm"
}دکمه Send رو زدم و بوممم! access-token برام برگشت! داستان جذاب شد؛ این به این معناست که من الان میتونم دونه به دونه کدهای مختلف رو تست کنم؟
{
"otp": ["true-code", "111", "222", "333"],
"session": "randommmmmmmmmmmmmmmmmm"
}ولی من نمیخوام دستی این کار رو انجام بدم چون عاقلانه نیست. در آخر اومدم یه پکت ارسال کردم که توش ۱۵,۰۰۰ کد با کاما توی این آرایه از هم جدا شده بود و وقتی سند رو میزدم یکی از کد با کد ولیدی که برای ایمیل اومده بود مچ میشد و باگ در میومد