فرایند کشف آسیب پذیری PDF-based Stored XSS روی یک وبسایت فروشگاهی ایرانی ✍
اول از همه بریم ببینیم اصلاً PDF-based Stored XSS چیه.
همونطور که میدونید Stored XSS جزو آسیبپذیریهای خطرناک محسوب میشه، چون Payload روی سرور ذخیره میشه و هر کسی که بهش دسترسی داشته باشه، اکسپولیت میشه.
معمولاً برای پیدا کردنش سراغ پروفایل کاربری، احراز هویت، کامنتها، تیکتهای پشتیبانی و جاهایی که از کاربر ورودی گرفته میشه میریم.
ولی خیلی وقتها WAF ( Application Firewall) اجازه نمیده Payload های مخرب xss جواب بدن و باعث بلاک کردن پیلود میشن .
اینجاست که آپلود فایل PDF مخرب میتونه راه خوبی برای رسیدن به Stored XSS باشه، چون PDF میتونه javascript parsing داشته باشه و خیلی از سایتها این موضوع رو جدی نمیگیرن.
چطور به این آسیبپذیری میرسیم؟
اول باید Payload یا کد کد مخرب جاوا اسکریپت رو داخل یک فایل PDF تزریق کنیم. بعد اون فایل رو توی بخشهایی که سایت اجازه آپلود فایل میده، آپلود میکنیم؛
مثل:
حساب کاربری، تیکتهای پشتیبانی، ارسال مدارک، نظرات و موارد مشابه
وقتی فایل مخرب پشت صحنه آپلود میشه، اگه سایت فایل PDF رو مستقیم داخل مرورگر نمایش بده و محدودیتی روی محتوای فعالش نداشته باشه، مرورگر میاد کدهای JavaScript داخل PDF رو اجرا میکنه. Payload ما (مثلاً alert) اجرا میشه و یعنی به Stored XSS رسیدیم.
نکته مهم: این رفتار معمولاً روی مرورگر Chrome بهتر دیده میشه.
چه زمانی باگ حساب نمیشه؟
بعضی وقتها بعد از آپلود فایل مخرب، مرورگر بهجای اجرا کردن PDF، فایل رو دانلود میکنه یا اصلاً اجازه اجرای کد رو نمیده. این یعنی سایت تنظیمات امنیتی بهتری داره و عملاً به Self XSS یا عدم بهرهبرداری میخوریم و باگ قابل سوءاستفادهای وجود نداره.
چطوری این باگ رو کشف کردم؟
داشتم یکی از فروشگاههای اینترنتی ایرانی رو بررسی میکردم که دیدم توی بخش تیکت پشتیبانی امکان آپلود فایل PDF وجود داره. فایل PDF مخرب خودم رو اونجا آپلود کردم و به محض اینکه روی فایل کلیک کردم، Payload اجرا شد و به باگ رسیدم.
این آسیبپذیری روی یکی از Subdomainها بود. طبیعتاً اگه همین مشکل روی دامنه اصلی وجود داشت، شدت باگ خیلی بالاتر حساب میشد و پاداش بیشتری هم میشد گرفت.
@dagen_security
اول از همه بریم ببینیم اصلاً PDF-based Stored XSS چیه.
همونطور که میدونید Stored XSS جزو آسیبپذیریهای خطرناک محسوب میشه، چون Payload روی سرور ذخیره میشه و هر کسی که بهش دسترسی داشته باشه، اکسپولیت میشه.
معمولاً برای پیدا کردنش سراغ پروفایل کاربری، احراز هویت، کامنتها، تیکتهای پشتیبانی و جاهایی که از کاربر ورودی گرفته میشه میریم.
ولی خیلی وقتها WAF ( Application Firewall) اجازه نمیده Payload های مخرب xss جواب بدن و باعث بلاک کردن پیلود میشن .
اینجاست که آپلود فایل PDF مخرب میتونه راه خوبی برای رسیدن به Stored XSS باشه، چون PDF میتونه javascript parsing داشته باشه و خیلی از سایتها این موضوع رو جدی نمیگیرن.
چطور به این آسیبپذیری میرسیم؟
اول باید Payload یا کد کد مخرب جاوا اسکریپت رو داخل یک فایل PDF تزریق کنیم. بعد اون فایل رو توی بخشهایی که سایت اجازه آپلود فایل میده، آپلود میکنیم؛
مثل:
حساب کاربری، تیکتهای پشتیبانی، ارسال مدارک، نظرات و موارد مشابه
وقتی فایل مخرب پشت صحنه آپلود میشه، اگه سایت فایل PDF رو مستقیم داخل مرورگر نمایش بده و محدودیتی روی محتوای فعالش نداشته باشه، مرورگر میاد کدهای JavaScript داخل PDF رو اجرا میکنه. Payload ما (مثلاً alert) اجرا میشه و یعنی به Stored XSS رسیدیم.
نکته مهم: این رفتار معمولاً روی مرورگر Chrome بهتر دیده میشه.
چه زمانی باگ حساب نمیشه؟
بعضی وقتها بعد از آپلود فایل مخرب، مرورگر بهجای اجرا کردن PDF، فایل رو دانلود میکنه یا اصلاً اجازه اجرای کد رو نمیده. این یعنی سایت تنظیمات امنیتی بهتری داره و عملاً به Self XSS یا عدم بهرهبرداری میخوریم و باگ قابل سوءاستفادهای وجود نداره.
چطوری این باگ رو کشف کردم؟
داشتم یکی از فروشگاههای اینترنتی ایرانی رو بررسی میکردم که دیدم توی بخش تیکت پشتیبانی امکان آپلود فایل PDF وجود داره. فایل PDF مخرب خودم رو اونجا آپلود کردم و به محض اینکه روی فایل کلیک کردم، Payload اجرا شد و به باگ رسیدم.
این آسیبپذیری روی یکی از Subdomainها بود. طبیعتاً اگه همین مشکل روی دامنه اصلی وجود داشت، شدت باگ خیلی بالاتر حساب میشد و پاداش بیشتری هم میشد گرفت.
@dagen_security
❤11👍1
چجوری یه sqli توی سرویس api تارگتم زدم !؟
داستان از این قراره که توی پرورگرم پابلیکی که سه ماه توش مشغول به کار بودم یه باگ خیلی خطرناک پیدا کردم. چجوری این باگو پیدا کردم ؟
پرورگرم هر اشکال امنیتی از سابدامین های خودش رو به عنوان یه باگ لجیت قبول میکرد .
به عنوان یه مهاجم همیشه دوس دارم برم و نقاط کور رو تست کنم و جایی مشغول به کار شم که هانتر کم تری به اونجا سر زده
پس من به عنوان اولین قدم خودم یه واید ریکان سنگین انجام دادم و یه سری سابدامین در اختیارم اومد , بعده دونه به دونه چک کردن همه سابدامین ها من به سابدامین سرویس ای پی آی رسیدم .!
وقتی صفحه رو باز کردم چیزی به چشمم نخورد و با صفحه خالی مواجه شدم . چیزی که هر هانتری برای تست میره سراغش این مورداست :
1 - فاز معمولی و فاز با اکستشن های مختلف
2- وی بک
3 - گوگل دورکینگ با انجین های مختلف
4- سرچ توی گیتهاب یا بیت باکت و ..
همه اینکارارو انجام دادم و در اخر هیچ چیزی دست گیرم نشد و یه سری مسیر چرت رسیدم که بدرد من نمیخورد .
خب من میدونستم که قبل از من کلی هانتر اینکارو هزارن بار انجام دادن و شاید نتیجه ای نگرفتن و گفتن شاید این سابدامین باگی نداره و رهاش کردن
ولی من به شاید ها کاری ندارم , من باید به عنوان یه هانتر برم و باگو پیداش کنم و گزارشش بدم .
Time based SQL injection :
پکت رو توی برپ سوییت باز کردم و فقط به پکت نگاه کردم .
گوشه ذهنم میدونستم که وبسایت ها میتونن یه سری داده و اطلاعات رو از کاربر ذخیره کنن و یدونه از اون اطلاعات User-agent هستش و این User-agent ممکنه بشینه توی دیتابیس و یا نوعی insert بشه .
پس ترت مدل من این بود که برم یه time-base-sqli توی user-agent تست کنم و با خواب رفتن سرور متوجه این بشم که اسیپ پذیری وجود داره .
خب بیایم یه شبیه سازی تو ذهنمون داشته باشیم فرض بگیریم یه همچین چیزی(insert) توی دیتابیس وجود داره :
اگه همچین چیزی اون پشت داشته باشیم پس من باید با ' بریک کنم و کوعری sleep رو اجرا کنم . پیلودی که به ذهنم رسید رو تست کردم :
اتفاقی که واسه پشت صحنه میوفته :
این دقیقا چیزی بود که من تستش کردم و کاملا منطقی بود, ما از پلاس توی sql استفاده میکنیم تا رشته ها رو به هم کانکت و به نوعی عملیات جمع انجام بدیم . تست کردم ولی هیچ اتفاقی نیوفتاد ✖️
سریع از لابراتور انلاین sql استفاده کردم و همین کد با همین فرضیه رو تست کنم و به یه خطای مهم رسیدم :
پارسر sql میگفت من گیج شدم و نمیتونم اینو اجرا کنم. چرا ؟ چون تو میخوای یه استرینگ خالی رو با استرینگ پر و یه اسلیپ رو با هم کانکت کنی ! همچین کاری رو نمیتونی انجام بدی !
اهاا. یه تریک ریز به ذهنم رسید. چی میشه اگه من مقدار User-agent رو پاک کنم و پیلود خودمو بزارم ؟
15 ثانیه رفت به کما و تمام. باگ تایید شد ☺️
تمام نکته این بود که باید رشته پاک میشد تا جواب بگیری . فقط کپی پیست پیلود کافی نیست باید تحلیل کنی .🫡
امیدوارم از این سناریوی باگ ریل ورد دید خوبی گرفته باشید انرژی فراموش نشه ⚡️
@Dagen_security
داستان از این قراره که توی پرورگرم پابلیکی که سه ماه توش مشغول به کار بودم یه باگ خیلی خطرناک پیدا کردم. چجوری این باگو پیدا کردم ؟
پرورگرم هر اشکال امنیتی از سابدامین های خودش رو به عنوان یه باگ لجیت قبول میکرد .
به عنوان یه مهاجم همیشه دوس دارم برم و نقاط کور رو تست کنم و جایی مشغول به کار شم که هانتر کم تری به اونجا سر زده
پس من به عنوان اولین قدم خودم یه واید ریکان سنگین انجام دادم و یه سری سابدامین در اختیارم اومد , بعده دونه به دونه چک کردن همه سابدامین ها من به سابدامین سرویس ای پی آی رسیدم .!
برای مثال : api-prod.target.com
وقتی صفحه رو باز کردم چیزی به چشمم نخورد و با صفحه خالی مواجه شدم . چیزی که هر هانتری برای تست میره سراغش این مورداست :
1 - فاز معمولی و فاز با اکستشن های مختلف
2- وی بک
3 - گوگل دورکینگ با انجین های مختلف
4- سرچ توی گیتهاب یا بیت باکت و ..
همه اینکارارو انجام دادم و در اخر هیچ چیزی دست گیرم نشد و یه سری مسیر چرت رسیدم که بدرد من نمیخورد .
خب من میدونستم که قبل از من کلی هانتر اینکارو هزارن بار انجام دادن و شاید نتیجه ای نگرفتن و گفتن شاید این سابدامین باگی نداره و رهاش کردن
ولی من به شاید ها کاری ندارم , من باید به عنوان یه هانتر برم و باگو پیداش کنم و گزارشش بدم .
Time based SQL injection :
پکت رو توی برپ سوییت باز کردم و فقط به پکت نگاه کردم .
گوشه ذهنم میدونستم که وبسایت ها میتونن یه سری داده و اطلاعات رو از کاربر ذخیره کنن و یدونه از اون اطلاعات User-agent هستش و این User-agent ممکنه بشینه توی دیتابیس و یا نوعی insert بشه .
پس ترت مدل من این بود که برم یه time-base-sqli توی user-agent تست کنم و با خواب رفتن سرور متوجه این بشم که اسیپ پذیری وجود داره .
خب بیایم یه شبیه سازی تو ذهنمون داشته باشیم فرض بگیریم یه همچین چیزی(insert) توی دیتابیس وجود داره :
insert into table ('user-agent') VALUE ('$INPUT')اگه همچین چیزی اون پشت داشته باشیم پس من باید با ' بریک کنم و کوعری sleep رو اجرا کنم . پیلودی که به ذهنم رسید رو تست کردم :
' + sleep(15) + '
اتفاقی که واسه پشت صحنه میوفته :
insert into table ('user-agent') VALUE ('$INPUT' + sleep(15) + '')این دقیقا چیزی بود که من تستش کردم و کاملا منطقی بود, ما از پلاس توی sql استفاده میکنیم تا رشته ها رو به هم کانکت و به نوعی عملیات جمع انجام بدیم . تست کردم ولی هیچ اتفاقی نیوفتاد ✖️
سریع از لابراتور انلاین sql استفاده کردم و همین کد با همین فرضیه رو تست کنم و به یه خطای مهم رسیدم :
پارسر sql میگفت من گیج شدم و نمیتونم اینو اجرا کنم. چرا ؟ چون تو میخوای یه استرینگ خالی رو با استرینگ پر و یه اسلیپ رو با هم کانکت کنی ! همچین کاری رو نمیتونی انجام بدی !
اهاا. یه تریک ریز به ذهنم رسید. چی میشه اگه من مقدار User-agent رو پاک کنم و پیلود خودمو بزارم ؟
User-agent: ' + sleep(15) + '
insert into table ('user-agent') VALUE ('' + sleep(15) + '')15 ثانیه رفت به کما و تمام. باگ تایید شد ☺️
تمام نکته این بود که باید رشته پاک میشد تا جواب بگیری . فقط کپی پیست پیلود کافی نیست باید تحلیل کنی .🫡
امیدوارم از این سناریوی باگ ریل ورد دید خوبی گرفته باشید انرژی فراموش نشه ⚡️
@Dagen_security
🔥13❤7⚡2
وقتی رایتاپ های هانتر هایی مثل اورنج , سم کری و فرنس روزن رو میخونی و از این هانترای فوق العاده یاد میگیری ناخود اگاه حس خوشحالی بهت دست میده چون هر تیکه ای از رایتاپ های این افراد لذت خالصه
بهت یاداور میشه که تو به عنوان یه هانتر کجای مسیرو توی تستایی که انجام میدی داری میس میدی و از کنارشون بی تفاوت میگذری ؟
+ رایتاپ رو مداوم بخون و اگه میخوای هانتر موفقی بشی حتما به تاپ صد هکروان رجوع کن ✔️
@Dagen_security
بهت یاداور میشه که تو به عنوان یه هانتر کجای مسیرو توی تستایی که انجام میدی داری میس میدی و از کنارشون بی تفاوت میگذری ؟
+ رایتاپ رو مداوم بخون و اگه میخوای هانتر موفقی بشی حتما به تاپ صد هکروان رجوع کن ✔️
@Dagen_security
❤15👍4
اوضاع اینترنت هنوز بلاتکلیفه و امیدوارم که زودتر اینترنت (حق حیاتی ما) وصل بشه
نزدیک دو هفتر یا بیشتره که هیچ هانتی نکردم و دارم مطالعه میکنم
به بچهای هانتر پیشنهادم اینه که توی این روزا فارغ از احساستون مطالعه کنید و از گلدن تایم روزتون بیشترین استفاده رو ببرین تا از مسیر خارج نشدید و اپدیت بمونید
منم کنارتونم و سعی میکنم هر چیز ارزشمندی که باعث میشه به دانشتون اضافه کنه رو توی چنل قرار بدم
به امید روزای درخشان تر ⚡️
نزدیک دو هفتر یا بیشتره که هیچ هانتی نکردم و دارم مطالعه میکنم
به بچهای هانتر پیشنهادم اینه که توی این روزا فارغ از احساستون مطالعه کنید و از گلدن تایم روزتون بیشترین استفاده رو ببرین تا از مسیر خارج نشدید و اپدیت بمونید
منم کنارتونم و سعی میکنم هر چیز ارزشمندی که باعث میشه به دانشتون اضافه کنه رو توی چنل قرار بدم
به امید روزای درخشان تر ⚡️
❤🔥10👍4❤1
سطح سوالا رو دوست دارید ؟ :)
سعی کردم سولایی بیارم که ذهنتونو مشغول کنه و ایزی نباشه , ادامه بدیم یا کافیه ؟
@Dagen_Security
سعی کردم سولایی بیارم که ذهنتونو مشغول کنه و ایزی نباشه , ادامه بدیم یا کافیه ؟
@Dagen_Security
👍19❤2👎1
سوال 1 از دید فنی اشتباهه رفقا
میدونم که پیش خودتون گفتید مرورگر که jwt رو خودکار نمیزاره توی درخواست ها پس چجوری ممکنه csrf بشه ؟
مگه نباید اندپوینت با کوکی کار کنه ؟
درسته . csrf غیر ممکنه .
ولی یه شرطی داره اگه توی اون سایت xss داشته باشیم چطوریه داستان ؟
با تزریق کد جی اس ما میتونیم با وب سایت سیم اورجین بشیم و jwt رو از داخل لوکال استوریج بخونیم و یه درخواستی بنویسیم که هدر Authorization رو بگیره و اضافه کنه و ما با هویت کاربر درخواست بفرستیم و تیک اورش کنیم .
ولی باگ اصلی میشه Account Takeover via XSS
میدونم که پیش خودتون گفتید مرورگر که jwt رو خودکار نمیزاره توی درخواست ها پس چجوری ممکنه csrf بشه ؟
مگه نباید اندپوینت با کوکی کار کنه ؟
درسته . csrf غیر ممکنه .
ولی یه شرطی داره اگه توی اون سایت xss داشته باشیم چطوریه داستان ؟
با تزریق کد جی اس ما میتونیم با وب سایت سیم اورجین بشیم و jwt رو از داخل لوکال استوریج بخونیم و یه درخواستی بنویسیم که هدر Authorization رو بگیره و اضافه کنه و ما با هویت کاربر درخواست بفرستیم و تیک اورش کنیم .
ولی باگ اصلی میشه Account Takeover via XSS
❤4
کدوم گزینه دقیقترین توصیف از دلیل خطرناک بودن Insecure Deserialization هست؟
Anonymous Quiz
7%
چون باعث نشت اطلاعات از حافظه Heap میشه
81%
چون مهاجم میتونه Object دلخواهش رو بسازه و منطق برنامه رو دور بزنه
10%
چون Deserialize کردن همیشه کندتر از JSON parsing هست
2%
چون فقط روی زبان PHP اتفاق میافته
Race Condition معمولاً دقیقاً کی اتفاق میافته؟
Anonymous Quiz
59%
وقتی دو تا Thread همزمان به یه تابع Stateless دسترسی دارن
30%
وقتی ترتیب اجرای عملیاتها روی نتیجه نهایی تأثیر میذاره
4%
وقتی برنامه روی CPU چند هستهای اجرا میشه
7%
وقتی از Global Variable استفاده بشه
کدوم مورد نشونهی Security Misconfiguration در یه وبسرویسه؟
Anonymous Quiz
11%
استفاده از JWT بهجای Session
28%
نداشتن Rate Limit روی API
56%
فعال بودن Directory Listing روی وبسرور
5%
استفاده از HTTP بهجای WebSocket
❤1
چرا باز گذاشتن HTTP Methodهایی مثل PUT و DELETE روی وبسرور میتونه خطرناک باشه؟
Anonymous Quiz
81%
چون مهاجم میتونه فایل آپلود یا حذف کنه بدون احراز هویت
5%
چون مرورگرها درست ساپورتشون نمیکنن
1%
چون باعث کندی سرور میشه
13%
چون باعث Memory Leak میشه
فرض کن یه وباپلیکیشن روی Cloud Deploy شده و S3 Bucket یا Blob Storage اون Public مونده. این مشکل بیشتر به چی برمیگرده؟
Anonymous Quiz
15%
Broken Access Control
28%
Sensitive Data Exposure
47%
Security Misconfiguration
10%
Insecure Design
یه وباپلیکیشن ورودی کاربر رو فقط داخل Server-Side Template استفاده میکنه.
هیچ exec یا systemای در کار نیست و میگن «Sandbox فعاله».
کدوم حالت میتونه به RCE ختم بشه؟
هیچ exec یا systemای در کار نیست و میگن «Sandbox فعاله».
کدوم حالت میتونه به RCE ختم بشه؟
Anonymous Quiz
12%
XSS که باعث اجرای JavaScript میشه
12%
SQL Injection بدون دسترسی به فایل
3%
تغییر محتوای HTML خروجی
73%
Template Injection که به Runtime یا ClassLoader برسه