
در این بخش از دوره آموزشی SEC542 از موسسه SANS به آشنایی با نحوه شناسایی آسیب پذیری XSS یا XSS Fuzzing می پردازیم.
XSS Fuzzing
پس از بررسی ورودیهای اپلیکیشن و یافتن نقاط مشکوک برای تست XSS، نوبت به انتخاب پیلودهای مناسب میرسد. گرچه ابزارهای مختلف هر یک اصطلاحات و واژگان مربوط به خود را دارند، اما ما به ورودیهایی که برای تست و اکسپلویت آسیبپذیری inject میکنیم، پیلود میگوییم. انواع پیلودهایی که ما در فرآیند تست خود استفاده میکنیم، پیلودهای مربوط به تست reflection، تست فیلتر و پیلودهای Proof of Concept (PoC) جهت اثبات وجود آسیبپذیری میباشند.
در تستهای reflection، یک رشته ساده و منحصر به فرد در پارامتر ورودی inject می شود. هدف از این تست پیدا کردن شواهد بازتاب شدن دیتای ورودی در پاسخ اپلیکیشن است.
برای مثال، میتوانیم پیلود 42424242 را در نقاط مختلف تزریق کنیم. دلیل انتخاب این پیلود آنست که طبیعتا انتظار وجود چنین رشتهای را در اپلیکیشن نداریم، پس با مشاهده این الگو، متوجه میشویم که ورودی ما به عنوان بخشی از اپلیکیشن بازگردانده شده است. در سادهترین حالت، پیلود مورد تست بلافاصله در پاسخ HTTP برمیگردد که این احتمال وجود reflected XSS را افزایش میدهد. توجه داشته باشید این امکان وجود دارد که پیلود وارد شده ممکن است در نقاط دیگری از اپلیکیشن نیز ظاهر شود.
تستهای فیلتر، که معمولا بعد از دریافت نتیجه مثبت از تست reflection انجام میشود، در شناسایی وجود فیلترینگ یا انکدینگ در اپلیکیشن و نوع آن به ما کمک میکند. درک و شناخت انواع فیلتریگ، ما را در بایپس فیلتر و اکسپلویت موفق آسیبپذیری یاری میکند.
اکثر افراد در هنگام fuzz یک اپلیکیشن برای کشف آسیبپذیری، از پیلودهای PoC استفاده میکنند. این پیلودها تنها یک اثبات ساده برای وجود آسیبپذیری XSS هستند. آمادهسازیهای بیشتر و پیلودهای پیچیدهتر در فاز اکسپلویت کردن به کار میآیند اما برای فاز discovery در متدولوژی ما، تنها ارائه یک PoC موفق کفایت میکند.
Burp Intruder: Reflection Tests
مانند همه آسیبپذیریهای مربوط به ورودی یا injection ها، قابلیتهای fuzzing در Burp Intruder میتواند در XSS Fuzzing بسیار موثر واقع شود. با توجه به مطالبی که در بخشهای قبل شرح داده شد، میتوانیم تست خود را با تمرکز بر روی تستهای reflection شروع کنیم. هدف ما شناسایی نقاط ورودی مشکوکی است که دارای reflection هستند.
استفاده از آسیب پذیری XSS و خواندن فایل
روش کار ما در Burp Intruder اینگونه است که ابتدا حملات نوع Battering Ram را در کنار Grep Payloads به کار میگیریم. حمله Battering Ram، حملهای در Burp Intruder است که در آن یک پیلود بطور همزمان در نقاط مختلف ارسال میشود. Grep Payloads نیز یکی از آپشنهای Burp Intruder است که پاسخهای اپلیکیشن را برای یافتن پیلود ارسال شده جستجو میکند. استفاده ترکیبی از Battering Ram و Grep Payloads به ما این امکان را میدهد تا بطور همزمان چند نقطه ورودی را fuzz کنیم و reflection را در آنها تشخیص دهیم. اگر نتایج حاکی از وجود reflection بود، آنگاه حملات خود را با Sniper ادامه میدهیم تا نقاط ورودی دارای reflection را به طور مجزا شناسایی کنیم. در ادامه به شرح روش کار و توضیح انواع این حملات میپردازیم.
Battering Ram
یکی از مزیتهای بزرگ Burp Intruder اینست که ما محدودیتی برای انتخاب مکان injection نداریم. با Burp Intruder میتوانیم در هر نقطه از درخواست HTTP، تست خود را انجام دهیم. به تصویر زیر دقت فرمائید:

همانطور که در تصویر میبینید، در تب Positions، نوع حمله Battering Ram انتخاب شده است. همچنین میبینید که ما پنج نقطه مختلف برای تست انتخاب کردهایم. نقاط انتخابی در تصویر بالا عبارتند از:
• URL Parameter
• HTTP User-Agent
• HTTP Referer
• HTTP Cookies (دو کوکی مختلف)
با استفاده از حمله Battering Ram، هر یک از این نقاط بطور همزمان با پیلود دلخواه ما جایگزین میگردند.
Grep: Payloads
یکی از مشخصههای مورد نیاز ما جهت پیدا کردن ورودیهای بازتاب شده در Burp Intruder، در تب Options این ابزار وجود دارد. درواقع این مشخصه، گزینه Grep – Payloads میباشد. با این تکنیک، Burp ترافیکهای پاسخ HTTP را برای شناسایی پیلودهای ما جستجو میکند. بدین ترتیب اگر ما رشته 42424242 را در نقاط ورودی inject کنیم، Grep – Payloads در پاسخها به دنبال نشانههای این رشته میگردد. این یعنی به راحتی میتوانیم ورودیهای reflected را پیدا کنیم.

نتایج اولیه تست Reflection

تصویر بالا، نتایج اجرای حملات Battering Ram + Grep Payloads در Burp Intruder را نشان میدهد. به ستون P grep دقت کنید. این ستون بخاطر تنظیمات ما در تب Grep Payloads، ظاهر شده است. checkbox در این ستون نشانگر آنست که پیلود ما – در اینجا رشته 42424242 است – در ترافیک پاسخ پیدا شده است.
همانطور که در تصویر میبینید، با جستجوی رشته 42424242 در پاسخ انتخابی، میبینیم که این رشته شش بار در پاسخ تکرار شده است در صورتی که ما آن را فقط در پنج نقطه تزریق کرده بودیم. با توجه به کم بودن نقاط ورودی، این امکان را داریم تا تک تک نتایج یافت شده را بررسی کنیم اما با بزرگتر شدن محدوده تست، کار ما نیز دشوار میگردد.
ادامه حمله با Sniper

بجای بررسی هر reflection در Battering Ram، میتوانیم دوباره به Burp برگشته و این بار همان نقاط قبلی را با همان پیلود ولی این بار با حمله Sniper تست کنیم. در Sniper، هر بار یک نقطه هدف حمله قرار میگیرد یعنی هر یک از پنج ورودی ما در درخواستهای جداگانه تست میشوند. این جا نیز با در نظر گرفتن ستون P grep متوجه میشویم کدام درخواستها و در نتیجه کدام نقاط ورودی، مقدار خود را در پاسخ بازتاب میدهند.
مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.