حمله XSS (Cross-Site Scripting) در وب
مقدمه
حمله XSS (Cross-Site Scripting) یکی از رایجترین و مهمترین آسیبپذیریهای امنیتی در وب است. در این حمله، مهاجم کد JavaScript مخرب را در صفحات وب تزریق میکند و این کد در مرورگر کاربران اجرا میشود.
نتیجه این حمله میتواند شامل سرقت اطلاعات حساس، کوکیها، تغییر محتوای صفحه و حتی انجام عملیات به نام کاربر باشد.
XSS چیست؟
XSS زمانی رخ میدهد که یک برنامه وب، دادههای ورودی کاربر را بدون بررسی یا پاکسازی مناسب در خروجی HTML نمایش دهد.
در نتیجه مرورگر کاربر آن داده را بهعنوان کد قابل اجرا تفسیر میکند، نه متن ساده.
انواع حمله XSS
1. Stored XSS (ذخیرهشده)
در این نوع، کد مخرب در سرور ذخیره میشود (مثلاً در دیتابیس) و هر بار که صفحه بارگذاری میشود، برای همه کاربران اجرا میشود.
مثال:
یک کامنت در سایت:
<script>alert('Hacked')</script>
اگر این کامنت ذخیره شود، هر کاربری که صفحه را باز کند، اسکریپت اجرا میشود.
2. Reflected XSS (بازتابی)
در این حالت، کد مخرب از طریق URL یا درخواست HTTP ارسال میشود و بلافاصله در پاسخ سرور بازتاب داده میشود.
مثال:
https://site.com/search?q=<script>alert(1)</script>
اگر سایت ورودی را بدون فیلتر نمایش دهد، کد اجرا میشود.
3. DOM-Based XSS
در این نوع حمله، آسیبپذیری در سمت مرورگر (JavaScript) رخ میدهد، نه در سرور.
مثال:
document.write(location.hash);
اگر کاربر این لینک را باز کند:
site.com/#<script>alert(1)</script>
کد در مرورگر اجرا میشود.
نحوه عملکرد حمله XSS
- مهاجم کد مخرب را در ورودی سایت تزریق میکند
- سایت بدون فیلتر آن را نمایش میدهد
- مرورگر کاربر آن را بهعنوان JavaScript اجرا میکند
- مهاجم به دادههای کاربر دسترسی پیدا میکند
اهداف مهاجم در حمله XSS
سرقت کوکیها
document.cookie
کوکیها میتوانند برای ورود غیرمجاز استفاده شوند.
سرقت اطلاعات کاربر
- فرمهای ورود
- اطلاعات شخصی
- توکنهای نشست (Session Token)
انجام عملیات به نام کاربر
مثلاً:
- ارسال پیام
- تغییر رمز عبور
- انجام تراکنش
تغییر ظاهر سایت (Defacement)
مهاجم میتواند محتوای صفحه را تغییر دهد:
document.body.innerHTML = "Hacked!";
تفاوت انواع XSS
| نوع | محل اجرا | میزان خطر |
|---|---|---|
| Stored | سرور + کل کاربران | بسیار بالا |
| Reflected | درخواست کاربر | بالا |
| DOM-Based | مرورگر کاربر | بالا |
دلایل ایجاد آسیبپذیری XSS
1. عدم Escape کردن ورودیها
نمایش مستقیم ورودی کاربر در HTML:
echo $_GET['name'];
2. عدم استفاده از فیلتر مناسب
ورودیها بدون بررسی در صفحه قرار میگیرند.
3. استفاده ناامن از JavaScript
توابع خطرناک مانند:
-
innerHTML -
document.write -
eval()
پیامدهای حمله XSS
در صورت موفقیت، مهاجم میتواند:
- سرقت کوکیها و Session
- دسترسی به حساب کاربر
- اجرای عملیات غیرمجاز
- انتشار بدافزار
- تغییر محتوای سایت
روشهای پیشگیری از XSS
1. Escape کردن خروجی (Output Encoding)
مهمترین روش جلوگیری:
htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
2. استفاده از Content Security Policy (CSP)
CSP میتواند اجرای اسکریپتهای غیرمجاز را محدود کند:
Content-Security-Policy: default-src 'self'
3. عدم استفاده از innerHTML
به جای آن:
textContent
4. اعتبارسنجی ورودیها
- حذف تگهای HTML
- محدود کردن نوع دادهها
5. HttpOnly برای کوکیها
HttpOnly = true
این کار مانع دسترسی JavaScript به کوکی میشود.
6. استفاده از فریمورکهای امن
فریمورکهای مدرن مانند React یا Angular بهطور پیشفرض از XSS جلوگیری میکنند (در بیشتر حالتها).
جمعبندی
حمله XSS زمانی رخ میدهد که ورودی کاربر بدون بررسی مناسب در صفحات وب نمایش داده شود و بهعنوان کد JavaScript اجرا شود. این آسیبپذیری میتواند منجر به سرقت اطلاعات، کنترل حساب کاربران و تخریب سایت شود.
با استفاده از Escape کردن خروجی، تنظیم CSP، استفاده از کوکیهای امن و جلوگیری از اجرای مستقیم ورودیها میتوان از این حمله جلوگیری کرد.