سلام، من علی هستم و این اولین رایتآپ من درباره باگ XSS است که به تازگی پیدا کردم.
من چند ماه قبل از یک کمپانی بزرگ و معروف در HackerOne یک باگ rXSS پیدا کردم و جالبی این باگ به این صورت بود که ورودی من داخل Cookie قرار میگرفت و در خیلی از صفحات Reflect میشد.
به دلیل اینکه اجازه ندارم اسم کمپانی را افشا کنم، در این رایتآپ اسم آن را تغییر میدهم و به آن company.com میگویم.
من بعد از چند ماه دوباره به همان تارگت برگشتم و شروع به هانت کردن بهصورت چریکی کردم. این بار روی Scope دیگری از سایت که از طریق Wide Recon پیدا کرده بودم کار کردم، چون این کمپانی جزو معدود کمپانیهایی بود که اعلام کرده بود به تمام دامنههایی که متعلق به خود شرکت باشند، بانتی پرداخت میکند.
فاز ریکان
برای شروع، ابتدا یک Google Dork زدم و سعی کردم یکی از Extensionهای سایتهای Legacy را پیدا کنم.
چون به دنبال Reflected XSS بودم، از این Dork استفاده کردم:
site:company2.com ext:asp | ext:aspx | ext:jsp | ext:jspx | ext:php
شروع تستها
تعداد زیادی URL پیدا شد. به صفحه آخر نتایج رفتم و از آخر شروع به بررسی کردم. چند URL را تست کردم، اما هیچ نتیجهای نگرفتم.
در نهایت به این URL رسیدم:
https://www.company2.com/search.aspx?txtKeyword=
blank%20checks%20that%20are%20cashable%20blackmarket&pg=8&srsltid=...
در مرحله اول، پارامترهای موجود در URL را تست کردم. پارامترها Reflection داشتند، اما ورودیها بهصورت کامل Sanitize شده بودند و امکان اجرای XSS وجود نداشت.
پس شروع به Fuzz کردن پارامترها با این دستور کردم:
x8 -r file.txt -w wordlist.txt
کل HTTP Request را داخل file.txt قرار دادم تا اطلاعات کاملاً صحیح و بدون دستخوردگی وارد ابزار شود .
این بار حدود ۳ یا ۴ پارامتر پیدا شدند که Reflect میشدند، اما آنها هم امن بودند.
این دفعه تصمیم گرفتم پارامترcmp را که قبلاً روی company1.com توانسته بودم با آن یک XSS پیدا کنم، روی این تارگت هم تست کنم؛ اما اینجا هم ورودی بهصورت امن پردازش میشد.
پس دوباره به بنبست خوردم، اما ناامید نشدم.
شروع Fuzzing for Hidden Files
از آنجایی که تمام فایلهایی که در Google و Bing پیدا میشوند و همچنین URLهایی که داخل Wayback Machine وجود دارند، لزوماً تمام URLهای موجود در سایت نیستند و ممکن است URLهای بیشتری وجود داشته باشند که در این سرویسها Index نشده باشند، شروع به Fuzz کردن فایلها کردم.
برای این کار از دستور زیر استفاده کردم:
ffuf -u https://www.company2.com/FUZZ.aspx -w wordlist-file.com -mc all -fw 8750
این Switch را روی 8750 دادم، چون فایلهایی که وجود نداشتند، مقدار 8750 را بهعنوان تعداد Word نشان میدادند.

بعد از مدتی، فایل زیر پیدا شد: https://www.company2.com/test.aspx

قسمت پایانی
بعد از پیدا کردن این Endpoint، شروع به Parameter Fuzzing کردم و این بار ۴ پارامتر پیدا شد که یکی از آنها پارامتر cmp بود.
ساختار سایت company2.com شباهت زیادی به company1.com داشت و به همین دلیل شروع به تست پارامترcmp کردم.
این بار متوجه شدم که ورودی من دقیقاً مانند باگ قبلی، داخل یک تگ <a> قرار میگیرد و امکان Break کردن Attribute وجود دارد، اما امکان Break کردن خود Tag وجود نداشت.

پس شروع به تست Payloadهای مختلف کردم.
WAF در بعضی Payloadها جلوی من را میگرفت و درخواستها را Block میکرد. در نهایت بعد از تست Payloadهای مختلف، به Payload زیر رسیدم
https://www.company2.com/test.aspx?CMP=mooji%22%20style=display:block;content-visibility:auto%20%20oncontentvisibilityautostatechange=%22setTimeout)(atobYWxlcnQob3JpZ2luKQ%20,%200

این Payload باعث شد بتوانم Attribute را Break کنم و JavaScript موردنظر خودم را اجرا کنم.
گزارش باگ
بعد از اینکه باگ را تأیید کردم، آن را برای برنامه گزارش کردم.
کمتر از ۲۴ ساعت بعد، Triager آن را بررسی و تأیید کرد و دومین Bounty خودم را از این برنامه دریافت کردم.
متأسفانه این Subdomain جایی برای Login نداشت که بتوانم Impact باگ را افزایش بدهم و آن را به Severity بالاتر ارتقا دهم، بنابراین به Medium بسنده کردم.
ممنونم که وقت گذاشتید و این رایتآپ را خواندید.
امیدوارم شما هم همیشه پیروز و پر از بانتی باشید. ❤️