مدیریت نادرست نشستها و حملات Session Fixation / Session Hijacking
مقدمه
در برنامههای وب، نشست (Session) برای نگهداری وضعیت ورود کاربر و اطلاعات او بین درخواستهای مختلف استفاده میشود. اگر این نشستها بهدرستی مدیریت نشوند، مهاجم میتواند کنترل آنها را به دست بگیرد. دو حمله مهم در این حوزه Session Fixation و Session Hijacking هستند.
Session چیست؟
Session یک شناسه موقت است که سرور برای هر کاربر ایجاد میکند تا او را در طول استفاده از سایت شناسایی کند. معمولاً این شناسه در قالب یک کوکی ذخیره میشود:
session_id=abc123xyz
اگر این شناسه به دست مهاجم بیفتد، او میتواند خود را به جای کاربر جا بزند.
Session Hijacking چیست؟
در حمله Session Hijacking، مهاجم شناسه نشست فعال کاربر را سرقت کرده و از آن برای دسترسی غیرمجاز استفاده میکند.
روشهای رایج سرقت نشست:
- شنود شبکه (Packet Sniffing) در HTTP
- بدافزار روی سیستم کاربر
- XSS (تزریق اسکریپت در مرورگر)
- دسترسی به مرورگر یا کوکیها
- فیشینگ و صفحات جعلی
نتیجه حمله:
مهاجم میتواند:
- وارد حساب کاربر شود
- عملیات به نام کاربر انجام دهد
- اطلاعات حساس را مشاهده یا تغییر دهد
Session Fixation چیست؟
در حمله Session Fixation، مهاجم از قبل یک شناسه نشست معتبر میسازد و آن را به کاربر قربانی تحمیل میکند. سپس کاربر با همان شناسه وارد سیستم میشود و مهاجم بعداً از همان نشست استفاده میکند.
مثال ساده از سناریو:
-
مهاجم یک Session ID تولید میکند:
session_id=FIXED123 - این شناسه را به قربانی ارسال میکند (مثلاً لینک یا کوکی)
- قربانی وارد سایت و لاگین میشود
- سرور همان Session ID را برای حساب کاربر معتبر میکند
- مهاجم با همان ID وارد حساب قربانی میشود
تفاوت Session Fixation و Hijacking
| ویژگی | Session Hijacking | Session Fixation |
|---|---|---|
| زمان حمله | بعد از لاگین | قبل از لاگین |
| هدف | سرقت نشست فعال | مجبور کردن استفاده از نشست مشخص |
| نیاز به کنترل قبلی | ندارد | دارد |
| روش رایج | XSS، sniffing | لینک یا کوکی آلوده |
دلایل وقوع این آسیبپذیریها
1. عدم تغییر Session بعد از لاگین
اگر شناسه نشست بعد از ورود کاربر تغییر نکند:
$_SESSION['user'] = $user;
در حالی که Session ID همان قبلی باقی بماند، خطر افزایش مییابد.
2. استفاده از HTTP به جای HTTPS
در HTTP دادهها رمزگذاری نمیشوند و قابل شنود هستند.
3. ضعف در تنظیم کوکیها
-
عدم استفاده از
HttpOnly -
عدم استفاده از
Secure -
عدم تنظیم
SameSite
4. پذیرش Session ID از URL
مثلاً:
site.com/profile?session_id=abc123
این روش بسیار ناامن است.
پیامدهای حمله
در صورت موفقیت حمله:
- دسترسی کامل به حساب کاربر
- انجام تراکنشهای مالی غیرمجاز
- تغییر اطلاعات شخصی
- سرقت دادههای حساس
- افزایش سطح دسترسی در سیستم
روشهای پیشگیری
1. تغییر Session ID پس از لاگین
یکی از مهمترین اقدامات:
session_regenerate_id(true);
2. استفاده از HTTPS
تمام ارتباطات باید رمزگذاری شوند تا امکان شنود وجود نداشته باشد.
3. تنظیم صحیح کوکیها
HttpOnly = true
Secure = true
SameSite = Strict یا Lax
4. جلوگیری از ارسال Session در URL
Session فقط باید در کوکیها ذخیره شود، نه در لینکها.
5. تعیین زمان انقضا برای نشست
- Session timeout
- Logout خودکار پس از عدم فعالیت
6. بررسی IP و User-Agent (با احتیاط)
برخی سیستمها تغییرات غیرعادی را بررسی میکنند:
- تغییر IP ناگهانی
- تغییر مرورگر
(البته این روشها باید با دقت استفاده شوند چون ممکن است باعث خطا شوند)
جمعبندی
حملات Session Hijacking و Session Fixation از خطرناکترین تهدیدهای امنیتی در وب هستند که هدف آنها تصاحب نشست کاربر و دسترسی غیرمجاز به حساب او است. این حملات معمولاً ناشی از مدیریت ضعیف Session، استفاده از ارتباطات ناامن و تنظیمات اشتباه کوکیها هستند.
با استفاده از HTTPS، بازسازی Session پس از لاگین، تنظیم صحیح کوکیها و جلوگیری از افشای Session ID میتوان تا حد زیادی از این حملات جلوگیری کرد.