آسیب پذیری XSS
- کورش سنایی
- ۱۵ خرداد ۱۴۰۴
- زمان مطالعه: 6 دقیقه

در دنیای امنیت وب، یکی از رایجترین و در عین حال خطرناکترین آسیبپذیریها، آسیب پذیری XSS یا Cross-Site Scripting است. این نوع از آسیبپذیری به هکرها اجازه میدهد تا کدهای مخرب جاوااسکریپت را در صفحات وب تزریق کرده و آنها را روی مرورگر کاربران اجرا کنند. در این مقاله، به زبان ساده و برای افرادی که هیچ پیشزمینهای ندارند، به بررسی کامل این آسیبپذیری، انواع مختلف آن و نحوه جلوگیری از آن خواهیم پرداخت. همچنین اگر به وب هکینگ علاقه دارید شما رو به دیدن دوره آموزشی هک سایت زیرزمین سایبری دعوت میکنیم .
آسیبپذیری XSS چیست؟

آسیب پذیری XSS یک نوع نقص امنیتی در اپلیکیشنهای وب است که به مهاجم اجازه میدهد تا اسکریپتهای مخرب را به صفحات وب تزریق کند. این کدهای مخرب معمولاً به زبان جاوااسکریپت نوشته میشوند و پس از تزریق، در مرورگر کاربران اجرا میشوند. هدف از این حملات میتواند سرقت کوکیها، هک حساب کاربری، تغییر محتوای صفحه یا هدایت کاربر به صفحات مخرب باشد.
XSS بیشتر زمانی رخ میدهد که ورودی کاربر بدون فیلتر و اعتبارسنجی مناسب در صفحه وب نمایش داده میشود. این موضوع باعث میشود که مهاجم بتواند با وارد کردن کدهای مخرب، کنترل صفحه را در اختیار بگیرد
انواع آسیبپذیری XSS
اسیب پذیری XSS در 3 دسته تقسیم بندی میشه که میشه , reflected, Dom,Stored که هرکدام با دگیری یکسری تفاوت هایی دارد نظیر این که Reflected و Stored با سرور تعامل داره ولی DOM کاملا سمت Client Side هست یا مثلا Stored در دیتابیس ذخیره میشه ولی مابقی خیر حالا کاری نداریم بریم جلوتر تا بیشتر با این مباحث اشنا بشیم .
Reflected XSS (بازتابی)
در این نوع از XSS، کد مخرب در URL یا درخواست HTTP قرار داده میشود و همان لحظه توسط سرور پردازش و به کاربر بازگردانده میشود. یعنی اسکریپت در پاسخ HTTP گنجانده شده و تنها وقتی اجرا میشود که کاربر روی لینک مخرب کلیک کند.
مثال:
https://example.com/search?q=
در این مثال، پارامتر q
مستقیماً در صفحه بدون فیلتر شدن نمایش داده میشود. اگر سایت چنین لینکی را بدون پاکسازی محتوا پردازش کند، کد جاوااسکریپت اجرا میشود و شما یک پیغام در مرورگر خودتون به شکل زیر میبینید .

Stored XSS (ذخیره شده)
در نوع ذخیرهشده، کد مخرب در دیتابیس یا فایلهای سایت ذخیره میشود و هربار که کاربر صفحه را مشاهده میکند، اسکریپت اجرا میشود. این نوع از XSS خطرناکتر است چون به کلیه کاربرانی که صفحه را باز میکنند آسیب میزند.
مثال: فرض کنید کاربری در بخش نظرات، کامنتی به شکل زیر وارد کند:
اگر سیستم بدون پاکسازی این کد، آن را ذخیره کرده و در صفحه نمایش دهد، تمامی کاربران در معرض خطر قرار میگیرند.
DOM-based XSS
این نوع XSS زمانی اتفاق میافتد که کد مخرب از طریق DOM در سمت مرورگر اجرا میشود، بدون اینکه در پاسخ HTTP از سرور اثری از آن باشد. یعنی کل پردازش روی مرورگر کاربر و از طریق جاوااسکریپت انجام میشود.
مثال:
Vulnerable Page
در کد بالا, نام کاربر به صورت مستقیم پس از دریافت در صفحه نمایش داده میشود توسط Js یا همون Java Script که زبان برنامه نویسی سمت Client هستش در وب اپلیکیشن ها, و هیچ ارتباطی در کد بالا با سرور نداریم و اتفاقی که میفته این هست :

حالا اگر هکر بیاد و پیلود مخرب وارد کنه و بدون پردازش کردن اون در صفحه نمایش داده بشه اتفاقی که در تصویر پایین میبینید میفته و کار رو خراب میکنه : )

همونطور که دیدید بر خلاف Reflected و Stored کاربر میتونه Payload خودش رو اجرا کنه بدون اینکه با سرور ارتباطی بر قرار کنه و این ویژگی آسیب پذیری XSS DOM هستش . حالا شاید بپرسید DOM یعنی چی !؟
DOM یا Document Object Model چیست ؟

قبل از اینکه به بررسی دقیق DOM-based XSS بپردازیم، باید بدانیم که DOM چیست. DOM یا Document Object Model یک رابط برنامهنویسی است که ساختار یک سند HTML یا XML را به صورت یک درخت نمایش میدهد. این درخت از گرههایی (Nodes) تشکیل شده که هر کدام نماینده یکی از اجزای صفحه مانند تگها، محتوا، ویژگیها و… هستند.
به کمک DOM، جاوااسکریپت میتواند به اجزای مختلف صفحه دسترسی پیدا کند، آنها را تغییر دهد یا رویدادهایی را به آنها نسبت دهد. مرورگرها با استفاده از ابزارهای توسعهدهنده (مانند Inspector در Firefox یا Chrome) این ساختار درختی را نمایش میدهند.
برای مثال یک ساختار ساده DOM میتواند به شکل زیر باشد:
document
├──
└── html
├── head
│ ├── title
│ ├── meta
│ ├── style
└── body
└── div
├── h1
├── p
└── p
└── a
در این ساختار، هر عنصر HTML به عنوان یک گره در درخت DOM شناخته میشود. با فشار دادن کلیدهای Ctrl + Shift + I در مرورگر Firefox و انتخاب تب Inspector میتوانید این ساختار را به صورت بصری مشاهده کنید.
شناخت DOM برای درک بهتر آسیبپذیری DOM-based XSS ضروری است، زیرا در این نوع حملات، اسکریپتهای مخرب با استفاده از جاوااسکریپت و بدون دخالت مستقیم سرور، عناصر DOM را دستکاری میکنند.
چگونه از آسیبپذیری XSS جلوگیری کنیم؟
- برای جلوگیری از XSS، باید ورودیهای کاربران را اعتبارسنجی، پاکسازی (sanitize) و در صورت نیاز Encode کرد. در اینجا چند تکنیک کلیدی وجود دارد:
- استفاده از توابع Escape/Encode برای نمایش محتوا در HTML
- عدم استفاده مستقیم از ورودی کاربر در DOM
- استفاده از فریمورکهایی که بهطور خودکار از XSS جلوگیری میکنند مثل React
- فیلتر کردن تگها و کلمات کلیدی مشکوک با استفاده از کتابخانههایی مانند DOMPurify
- اعمال سیاستهای امنیتی مانند Content Security Policy (CSP)
ابزارهایی برای تست XSS
برای تست و شناسایی XSS ابزارهای زیادی وجود دارند که به صورت دستی یا خودکار عمل میکنند. چند نمونه از این ابزارها:
Burp Suite
OWASP ZAP
XSStrike
XSSer
همچنین بسیاری از برنامههای آموزش وب هکینگ شامل ماشینهای تمرینی برای تست XSS هستند مانند DVWA .
ابزارهایی برای تست XSS
آسیب پذیری XSS یکی از مهمترین ضعفهای امنیتی در وب است که اگر نادیده گرفته شود، میتواند منجر به سرقت اطلاعات، تزریق کدهای مخرب و حملات گسترده شود. شناخت انواع مختلف XSS مانند Reflected، Stored و DOM-based و یادگیری روشهای جلوگیری از آن برای هر توسعهدهنده و متخصص امنیت ضروری است. اگر به دنبال یادگیری بیشتر در این زمینه هستید، پیشنهاد میکنم حتماً مقالههای مربوط به آموزش هک سایت و آموزش وب هکینگ را در وبلاگ ما مطالعه کنید.
یادگیری XSS نه تنها به شما در درک بهتر امنیت وب کمک میکند بلکه یکی از مراحل مهم در ورود به دنیای هک اخلاقی و تست نفوذ است.