جدول محتوا
![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-1.png)
Internal Recon
در بحث Bug Hunting یکی از مهمترین فازها، ریکان هست که میتونیم دو دستهی External Recon و Internal Recon رو در نظر بگیریم که اینجا به صورت مختصر هر کدوم رو توضیح میدم. در فاز external هدف شناسایی ساب دامینهای تارگت هست و سعی میکنیم با استفاده از Automation و داشتن یک Recon Workflow به این کار سرعت بدیم. در فاز Internal تمرکز ما بر روی مپ کردن اپلیکیشن است تا با Functionalityها و زیرساخت هدف بهتر آشنا بشیم. بعد از مپ کردن قسمتهای مختلف این هدف، سعی کردم به دنبال نقاطی باشم که ممکن بود برای من کشف یک آسیبپذیری با Impact بالا رو به دنبال داشته باشه. تعداد زیادی از Functionalityها در وب اپلیکیشنهای مختلف، تنها برای کاربران Authenticated در سیستم فعال هستند و آسیبپذیریهای خوبی رو در این قسمتها میشه پیدا کرد. من بعد از لاگین در این اپلیکیشن، یکی از جاهایی که برای تست انتخاب کردم مسیر /MyInfo/MemberInfo بود که در این مسیر یک کاربر میتونه از طریق فرم Personal Info که در تصویر زیر میبینیم، اطلاعات یا بخشی از اطلاعات خودش رو به روز کنه:![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-2.png)
آسیبپذیری منطقی در Personal Info
من داخل این فرم سناریوهای حملهی مختلفی رو در نظر داشتم که یکی از اونها تغییر ایمیل کاربران دیگر این وب اپلیکیشن بود تا بتونم به Account Takeover برسم. قبل از تست این سناریوها، من متوجه شدم اگر روی Edit در جلوی ایمیلم کلیک کنم، یک پیام نمایش داده میشه که اپلیکیشن از من میخواد برای تغییر ایمیلم به یک ایمیل دیگه، Verification Code که به ایمیل جاری من ارسال میشه رو وارد کنم تا ایمیلم تغییر کنه:![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-3.png)
![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-4.png)
![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-5.png)
تست آسیبپذیری CSRF در Personal Info
سامانهی هدف به صورت Cookie-Based کار میکرد و یکی از سناریوهای حملهای که در نظر گرفتم، استفاده از CSRF برای تغییر اطلاعات شخصی قربانی و ایمیل بود. در درخواست بالا یک CSRF Token ارسال میشد (personal_key) و در نتیجه شروع کردم به بررسی راههای ممکن برای دور زدن Anti-CSRF Token. فارغ از روشهای رایجی که برای تست توکن مورد نظر وجود داره، ما میتونیم از آسیبپذیریهای دیگه کمک بگیریم تا به CSRF Token قربانی دسترسی پیدا کنیم. استفاده از CORS برای دسترسی به توکن قربانی در اینجا ممکن نبود. در مسیر بالا که اشاره کردم، سعی کردم یک آسیبپذیری دیگه پیدا کنم تا بتونم توکن قربانی رو بخونم. در اینجا حملهی Web Cache Deception به ذهنم رسید.تست حملهی Web Cache Deception
همونطور که میدونید وب اپلیکیشنها از قابلیت Caching System استفاده میکنند تا منابعی که به صورت مرتب توسط کاربرها درخواست داده میشه، کش شده و در درخواستهای بعدی کاربر سریعتر به منبع دسترسی پیدا کنه. فایلهایی که عموما کش میشن فایلهای استاتیک و عمومی هستند مثل فایلهای js، css و فایلهای استاتیک دیگر. در سناریوی حملهی Web Cache Deception، هکر عموما دنبال صفحهای میگرده که شامل اطلاعات حساس و یا اطلاعات مفیدی از کاربر باشه و بعد با دستکاری Path و ارسال لینک دستکاری شده به قربانی، به اطلاعات حساس و کش شدهی کاربر توسط Caching System دسترسی پیدا میکنه. پیشنهاد میکنم برای آشنایی بیشتر با این آسیبپذیری، اول با مکانیزم Caching آشنا بشید (میتونید از این مرجع استفاده کنید) و بعد این مقاله رو بخونید تا در خوبی از این آسیبپذیری پیدا کنید. برای تست Web Cache Deception در این هدف، مراحل زیر رو انجام دادم: - ابتدا مسیری رو پیدا کردم که شامل اطلاعات حساسی از کاربر بود. در واقع همین مسیری بود که بالاتر دربارش صحبت کردیم یعنی MyInfo/MemberInfo - در انتهای مسیر بالا یک فایل استاتیک رو اضافه کردم و درخواست رو به سمت سرور ارسال کردم تا ببینم سرور چه نوع پاسخی بهم بر میگردونه و آیا همون صفحه رو دوباره میبینم یا نه: target.com/MyInfo/MemberInfo/test.css - بعد از ارسال درخواست بالا، پاسخی از سمت سرور دریافت کردم که همون محتوای صفحهی MemberInfo بود (بر اساس نوع فناوری و پیکربندی، ممکنه نوع پاسخی که دریافت میکنیم متفاوت باشه و ما با حالتی کار داریم که همان محتوای صفحه یعنی MemberInfo در اینجا برای ما برگردونده بشه). زمانی که URL بالا رو در یک مرورگر دیگه باز کردم متوجه شدم که این مسیر توسط Caching System کش شده و به صورت پابلیک قابل دسترس هست و میتونم اطلاعات کش شدهی کاربر رو ببینم. در ویدیوی زیر مراحلی که توضیح دادم رو میتونید ببینید: من تا اینجا متوجه شدم که اپلیکیشن نسبت به حملهی Web Cache Deception آسیبپذیره. در اقع من میتونستم یک گزارش تنظیم کنم و برای تیم امنیتی ارسال کنم ولی نکتهای که ابتدای این رایتآپ هم بهش اشاره کردم این بود که سعی کنیم همیشه قبل از ارسال گزارش یک آسیبپذیری، فکر کنیم که راهی وجود داره بشه شدت آسیبپذیری رو بالاتر برد یا نه.ترکیب Web Cache Deception با آسیبپذیریهای قبلی
هدف من این بود که با تغییر ایمیل قربانی، بتونم به Account Takeover برسم و دیدیم که سناریوی CSRF به صورت مستقیم جواب نمیداد و من دنبال یک آسیبپذیری بودم تا با کمک اون بتونم به توکن قربانی دسترسی پیدا کنم. حالا یه سوال مطرح میشه و اینکه چطور میشه با استفاده از Web Cache Deception به توکن قربانی دسترسی پیدا کرد؟ نکته اینجاست که صفحهی کش شده، به جز اطلاعات کاربر مثل ایمیل و غیره، شامل personal_key هم میشه. این نکته رو میتونیم در تصویر زیر ببینیم:![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-6.png)
https://gmemberssl.gmarket.co.kr/MyInfo/MemberInfo/<Random_Number>.css
در URL بالا، Random_Number به صورت داینامیک ساخته میشه و هر کاربری که از دامین من بازدید کنه، یک درخواست GET به مسیر بالا ارسال میشه تا بتونم به ازای کاربران مختلف، مسیرهای کش شدهی هر کاربر رو ببینم و بتونم به اطلاعات کش شدهی هر کاربر دسترسی پیدا کنم. فاز دوم: یک درخواست از دامین هکر به URL کش شده ارسال میشه تا CSRF Token یا Personal Key خونده بشه که اینکار به سادگی قابل انجام هست، چون هم مسیر مورد نظر رو میدونیم و هم فایلی که در انتهای مسیر اضافه شده و به راحتی میشه از URL کش شده به CSRF Token دسترسی پیدا کرد. فاز سوم: در این مرحله باید CSRF Token که از مرحلهی قبل گرفته شده به صورت داینامیک در داخل فرم تغییر اطلاعات کاربر یا فرم Edit My Info قرار داده باشه تا حملهی CSRF انجام بشه. این فرم هم به صورت اتوماتیک توسط جاوا اسکریپت Submit میشه و در نهایت ایمیل قربانی تغییر پیدا میکنه. دقت کنید در این مرحله از آسیبپذیری منطقی که در ابتدای فرایند پیدا کرده بودم هم استفاده کردم تا ایمیل قربانی بدون ارسال Verification Code تغییر پیدا کنه:![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-7.png)
![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-8.png)
![](https://ravinacademy.com/wp-content/uploads/2024/01/ebay-9.png)