PDA

View Full Version : جلوگیری از session fixation



abolfazl-z
جمعه 18 مرداد 1392, 11:14 صبح
سلام دوستان


https://www.owasp.org/images/9/9c/Fixation.jpg


دوستان من این وسط یک چیز رو متوجه نشدم !

***ر با دادن آدرس بالا به کاربر و در نهایت کلیک کاربر بر روی آن ادرس و ارسال یک کوئری sessionid به سمت سرور چه نفعی برای ***ر دارد ؟
یعنی اینجا sessionidکه ارسال میشه توسط خود سرور بصورت اتوماتیک ایجاد میشه ؟ و یا نه اگر برنامه نویس برنامه اش رو نوشته باشه!؟

-------یک واقعیت
دوستان من در یکی از انجمن های سایت بزرگی (نمیدونم asan یا p30 ) برای اولین بار ثبت نام کردم که ناگهان بطور اتفاقی بعد از refresh صفحه ادمین شدم !! و بعد از ریفرش دوباره خارج شدم !
دوستان به این نوع حمله چی میگن ؟
برای جبوگیری از این نوع حملات که ***ر خود رو به جای کاربر اصلی جا میزنه باید چکار کنیم ؟(کوکی ذخیره کنیم اون هم از نوع هش شده و)

مهرداد سیف زاده
جمعه 18 مرداد 1392, 12:22 عصر
این که بجای ادمین وارد شدید قبلا در سایت مانشت (http://www.manesht.ir/forum)هم بهش برخورد کرده بودم(به گفته یکی از اعضای سایت). البته فک کنم از باگ انجمن ساز MyBB باشه.

abolfazl-z
جمعه 18 مرداد 1392, 12:40 عصر
ین که بجای ادمین وارد شدید قبلا در سایت مانشت (http://www.manesht.ir/forum)هم بهش برخورد کرده بودم(به گفته یکی از اعضای سایت). البته فک کنم از باگ انجمن ساز MyBB باشه

خوب باید چکار کنیم ؟

AliRezaPro
جمعه 18 مرداد 1392, 12:42 عصر
دوستان من در یکی از انجمن های سایت بزگی (نمیدونم asan یا p30 ) برای اولین بار ثبت نام کردم که ناگهان بطور اتفاقی بعد از refresh صفحه ادمین شدم !! و بعد از ریفرش دوباره خارج شدم !

بارها برای من و دوستانی که از یک isp استفاده مینکنیم و در یک سایت فعالیت میکنیم هم پیش آمده که بخاطر کش سرور باید باشه

abolfazl-z
جمعه 18 مرداد 1392, 12:55 عصر
دوستان سوال اصلی من همون session fixation هست.

مهرداد سیف زاده
جمعه 18 مرداد 1392, 14:08 عصر
برای جلوگیری از حمله session fixation بیشتر کارها باید در سرور و بر روی php.ini انجام بشه.
حمله بصورت دادن شناسه session از طریق url صورت می‌گیره. که برای جلوگیری باید ارسال مقادیر از طریق url رو خاموش کرد با قرار دادن مقادیر زیر:
session.use_trans_sid = 0
session.use_only_cookies = 1

تغییر مقدار بیتهای ساختن رشته hash که بر مدت زمان حدس زدن توسط نفوذگر تاثیر داره
session.hash_bits_per_character = 5


در هر بار قرار دادن مقادیر جدید در session بهتره یک id جدید ساخته بشه
session_regenerate_id (http://us2.php.net/manual/en/function.session-regenerate-id.php)

همه ما میدونیم نام session که بر روی کوکی کاربران ساخته میشه PHPSESSID پس اون رو با تابع session_name (http://us2.php.net/manual/en/function.session-name.php) به نام دلخواه دیگری تغییر بدیم.

سنجیدن session کاربر در هر لحظه که از همان session استفاده میشه. در لحظه ورود مشخصات کاربر مثل ip و یا مشخصات سیستمی (http://php.net/manual/en/reserved.variables.server.php) رو ذخیره میکنیم. خب این کاربر داره به سیستم لاگین میکن با فلان session و این مشخصات و سایت ما هم طوری برنامه‌نویسی شده تا بصورت همزمان با یک نام کاربری از دو نقطه نشه به سیستم وارد شد. شما با سنجیدن و مقایسه session کاربر و مشخصات سیستم وی و همچنین استفاده همزمان از یک session و نام کاربری در دو سیستم متفاوت پی به حمله میبرید و میتونید کلا در اون لحظه کاربر را بصورت موقت بلوکه کنید تا مقداری شدت نفوذ رو گرفته باشید. التبه گوگل با برخورد چنین چیزی یک نوشته قرمز زیر صفحه میزنه و به کاربر اعلام میکنه در نقطه ای دیگر با فلان ip به کاربری شما وارد شده. البته به نظرم باید هوشمندتر باشه چون من با پروyxo تحت وب امتحان کردم دیدم نتونست تشخیص بده که شخصی به کمک سرور دیگری داره وارد میشه(تشخیص کاربر واقعی با سرور).

در آخر در سایت stackoverflow (http://stackoverflow.com/questions/5081025/php-session-fixation-hijacking)جواب بهتری دادن و همچنین تابع زیر رو برای حذف کامل session پیشنهاد دادن



function destroySession() {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
session_destroy();
}

abolfazl-z
جمعه 18 مرداد 1392, 15:21 عصر
چند سوال ؟
سشن بر اساس چی ساخته میشه ؟
و وقتی ساخته میشه به سمت کلاینت ارسال میشه درسته ؟
خوب حالا وقتی دریافت شد بصورت کوکی ذخیره میشه ؟ که در مرحله بعد توسط همین کوکی شناخته میشه!

خوب ه_کر هم میاد و این کوکی را بدست میاره و هنگامی که کاربر اصلی لاگین بود ***ر هم لاگاین میشه.

اگر گفته هایم درست باشه و طبق گفته های شما من فکری به ذهنم رسید :

ما بر فرض اینکه بیاییم نام کوکی PHPSESSID رو به هرچی دیگر تغییر بدهیم باز هم قابل دسترسی هست!

و این روش زیاد کار آمدی نیست!

ولی یک روش خوب این هست (حالا نمیدونم درست باشه یا نباشه) که بیاییم هر کاربری که لاگ این میکنه سشن آی دی اش رو در داخل دیتابیس نگه داریم بعد وقتی ه_کر قصد وارد شدن با اون session id رو داشت اول میاییم چک می کنیم که سشنی که در جدول کاربر ثبت شده در پوشه سشن ها وجود دارد یا خیر ؟
اگر وجود نداشت خوب اگر ***ر و یا هر کسی دیگری یوزر نیم و پسورد را درست زده بود وارد سیستم میشه!

خوب اینطوری امنیت میره بالا ولی فقط یک نفر میتونه وارد بشه !(از هر نقطه ای از جهان)
یعنی کاربر اگر با موزیلا لاگ ان باشه نمیتونه با کروم لاگ این کنه!
و فقط ***ر در صورت داشتن یوزر نیم و پسورد میتونه وارد بشه!
آیا این نظریه درست است؟

-------------------------
ولی روش تغییر session_regenerate_id :

خوب این یک بدی داره !

این هست که اگر ما session_regenerate_id بدون true استفاده کنیم خوب سشن برای ه_کر باز میمونه و میتونه کاراشو انجام بده! و اصلا تاثیری نداره چون آی دی سشن قبلی باز هست!

اگر هم با مقدار true مقداردهی شود این هم یک بدی دارد که اون هم این هست(حالا احتمال اش خیلی کم هست) ه_کر همزمان با کاربر لاگین بشه و قبل از اینکه کاربر کاری انجام بده ، ه_کر انجام بده سشن کاربر میپره و ه_کر کارا خودشو انجام میده!

نظر دوستان چیست ؟

abolfazl-z
یک شنبه 20 مرداد 1392, 14:17 عصر
دوستان مرسی از مشارکت قویتون :لبخند:
دوستان در هر صورت امنیت به 100 نمیرسه ولی میشه یکاری کرد که امنیت به 99 برسه!

دوستان برای حفظ جلوگیری از سرقت کوکی کاربر بیاییم با جاوا اسکریپت هر 10 ثانیه (هر چی کمتر امنیت بیشتر) یک درخواست به یک صفحه ای بفرستیم و باعث تغییر سشن آی دی شویم. البته این برای ادمین مناسب هست ولی برای کاربر سرور منفجر میشه!

ولی امنیت دیگه میره بالا

دوستان اگر سایتی برای هکری مهم باشه ما هر کاری انجام بدهیم در هر صورت هکر میتونه خودشو جا بزنه!

ولی اگر ما در هر چند ثانیه بیاییم سشن آی دی رو تغییر بدهیم هکر دیگه نمیتونه کاری کنه و سخت میشه چون براش محدودیت زمانی گذاشتیم.

colors
یک شنبه 20 مرداد 1392, 16:55 عصر
چند سوال ؟
سشن بر اساس چی ساخته میشه ؟
و وقتی ساخته میشه به سمت کلاینت ارسال میشه درسته ؟
خوب حالا وقتی دریافت شد بصورت کوکی ذخیره میشه ؟ که در مرحله بعد توسط همین کوکی شناخته میشه!

خود سشن هم برای استفاده, به کوکی نیازداره, یعنی از کوکی استفاده میکنه.
سشن رو میشه همون کوکی خودمون در نظر گرفت ولی کوکی رو سیستم کاربر ذخیره میشه و سشن در سرور ذخیره میشه.
سشن با بستن مرورگر از بین میره, یعنی عمرش بستگی به پنجره مرورگر داره ولی میشه یه زمانی(مثلا 20 دقیقه) برای از بین رفتن سشن در نظر گرفت که اگر کاربر حتی مرورگر رو هم نبده ولی تا پایان زمانی که برای از بین رفتن سشن در نظر گرفته ایم, تو سایت فعالیت نکنه, سشن از بین میره.


خوب ه_کر هم میاد و این کوکی را بدست میاره و هنگامی که کاربر اصلی لاگین بود ***ر هم لاگاین میشه.
کوکی که رو سیستم کاربر ذخیره میشه و در اصل آی دی سشن ست شده رو نگهداری میکنه رو میشه با هر بار فعالیت کاربر تو سایت یه session_regenerate_id زد که این مشکل رفع میشه.

حالا حقیقتا من چون خسته ام حوصله خوندن ندارم و به قول اشپیلن دنبال اختراع روش از خودن نباش و روشهای تست شده رو بزن و تموم.

abolfazl-z
یک شنبه 20 مرداد 1392, 17:28 عصر
حالا حقیقتا من چون خسته ام حوصله خوندن ندارم و به قول اشپیلن دنبال اختراع روش از خودن نباش و روشهای تست شده رو بزن و تموم.

این حرف رو قبول دارم اونم در بحث امنیت ولی در بحث های دیگه نه چون اگر همه اینطوری فکر کنیم چیزی اختراع نمیشه!