اذهب إلى المحتوى

السؤال

نشر

فرضا لو انني كمبرمج خزنت اي دي المستخدم في كوكيز من أجل التعرف عليه لاحقا، وفرضا احد المستخدمين تعرض لسرقة كوكيزه من احد الاعضاء او اختراقه باي شكل، طبعا الكوكيز يحمل اي دي المستخدم فقط، فماذا سيستفيد هذا المخترق برقم اي دي هذا المستخدم، وكيف يمكنه الدخول باسم هذا المستخدم، بما انه حصل على الكوكيز واي دي ذلك المستخدم، 

هل تخزين اي دي المسخدم في كوكيز والاعتماد على هذا الكوكيز في التعرف على المستخدم، يعد ثغرة امنيه، وماهي الحلول لتفادي هذه الثغره ان كانت ثغره. 

Recommended Posts

  • 1
نشر

إن كنت تخزن Token تسجيل الدخول الخاص بمستخدم معين في الـ Cookies وقام شخص ما بالوصول إلى هذا رمز Token هذا فيستطيع أن يقوم هذا الشخص بإضافة رمز Token في متصفح الويب لديه ويقوم بطلب الصفحات على أساس أنه هو المستخدم الحقيقي صاحب رمز Token وحينها سيكون من الصعب للغاية التعرف إن كان هذا الشخص هو فعلًا المستخدم الحقيقي أم مخترق Hacker يحاول التسلل إلى الموقع.

لذلك الحل الأفضل هو جعل الـ Cookies غير قابلة للقراءة من قِبل JavaScript، حيث أنها الطريقة الأشهر التي يتم إستخدامها من قبل المخترقين Hackers، ولجعل الـ Cookies غير قابلة للقراءة من خلال JavaScript يجب أن يتم جعلها من نوع HTTP-Only من الخادم الذي يرسلها في الأساس.

الأمر الآخر هو جعل محتوى الـ Cookies مؤقت بمعنى أنها صالحة للإستخدام لفترة قصيرة، وعندما تنتهي هذه الفترة يقوم المستخدم بطلب رمز Token جديد (تتم هذه العملية بشكل تلقائي من خلال ما يسمى Refresh Token) وبالتالي حتى إن أستطاع أحد المخترقين أن يصل إلى رمز Token بطريقة ما، فلن يستطيع إستخدامه إلا لفترة وجيزة، بفرض أن رمز Token مازال صالحًا في الأساس.

الخلاصة هي أن تخزين رمز Token في الـ Cookies ليس ثغرة، ولن إن كان الموقع نفسه مصاب بثغرة مثل CSRF فلن يفيد تخزين رمز Token في الـ Cookies كثيرًا، حيث يتم إرسالها تلقائيًا مع كل طلب، وسيكون تخزين رمز Token في LocalStorage/SessionStorage أفضل في هذه الحالة مع العلم تخزين رمز Token في LocalStorage/SessionStorage سيكون خطيرًا أن كان الموقع مصاب بثغرة XSS، وبالتالي يجب إهتيار أحد الطريقتين والتأكد من آمان الموقع نفسه في المقام الأول.

ملاحظة: كل طرق الحماية السابقة -وغيرها- يمكن تخطيها من خلال بعض التقنيات المتقدمة مثل إستخدام المخترق لخادم وسيط للحصول على الـ cookies أو رمز Token من خلال ثغرات XST، لذلك يجب التأكد من خلو الموقع من ثغرات XSS 

  • 0
نشر
بتاريخ 15 دقائق مضت قال سامح أشرف:

إن كنت تخزن Token تسجيل الدخول الخاص بمستخدم معين في الـ Cookies وقام شخص ما بالوصول إلى هذا رمز Token هذا فيستطيع أن يقوم هذا الشخص بإضافة رمز Token في متصفح الويب لديه ويقوم بطلب الصفحات على أساس أنه هو المستخدم الحقيقي صاحب رمز Token وحينها سيكون من الصعب للغاية التعرف إن كان هذا الشخص هو فعلًا المستخدم الحقيقي أم مخترق Hacker يحاول التسلل إلى الموقع.

لذلك الحل الأفضل هو جعل الـ Cookies غير قابلة للقراءة من قِبل JavaScript، حيث أنها الطريقة الأشهر التي يتم إستخدامها من قبل المخترقين Hackers، ولجعل الـ Cookies غير قابلة للقراءة من خلال JavaScript يجب أن يتم جعلها من نوع HTTP-Only من الخادم الذي يرسلها في الأساس.

الأمر الآخر هو جعل محتوى الـ Cookies مؤقت بمعنى أنها صالحة للإستخدام لفترة قصيرة، وعندما تنتهي هذه الفترة يقوم المستخدم بطلب رمز Token جديد (تتم هذه العملية بشكل تلقائي من خلال ما يسمى Refresh Token) وبالتالي حتى إن أستطاع أحد المخترقين أن يصل إلى رمز Token بطريقة ما، فلن يستطيع إستخدامه إلا لفترة وجيزة، بفرض أن رمز Token مازال صالحًا في الأساس.

الخلاصة هي أن تخزين رمز Token في الـ Cookies ليس ثغرة، ولن إن كان الموقع نفسه مصاب بثغرة مثل CSRF فلن يفيد تخزين رمز Token في الـ Cookies كثيرًا، حيث يتم إرسالها تلقائيًا مع كل طلب، وسيكون تخزين رمز Token في LocalStorage/SessionStorage أفضل في هذه الحالة مع العلم تخزين رمز Token في LocalStorage/SessionStorage سيكون خطيرًا أن كان الموقع مصاب بثغرة XSS، وبالتالي يجب إهتيار أحد الطريقتين والتأكد من آمان الموقع نفسه في المقام الأول.

لا استخدم التوكين، اقصد استخدام الكوكيز بشكل مباشر 

  • 0
نشر
بتاريخ 6 دقائق مضت قال علي الكاسر:

لا استخدم التوكين، اقصد استخدام الكوكيز بشكل مباشر 

ينطبق الأمر على الـ Cookies بشكل مباشر، حيث يجب أن يتم جعلها من نوع HTTP-Only، والتأكد من أن الموقع خالي من ثغرات CSRF تمامًا. أيضًا يفضل إستخدام الخاصية SameSite=strict (أو SameSite=lax حيث الحاجة)عند تخزين الـ Cookies، يمكنك أن تقرأ أكثر حول هذه الخاصية من خلال هذه المقالة:

أو من خلال توثيق MDN.

  • 0
نشر
بتاريخ منذ ساعة مضت قال سامح أشرف:

ينطبق الأمر على الـ Cookies بشكل مباشر، حيث يجب أن يتم جعلها من نوع HTTP-Only، والتأكد من أن الموقع خالي من ثغرات CSRF تمامًا. أيضًا يفضل إستخدام الخاصية SameSite=strict (أو SameSite=lax حيث الحاجة)عند تخزين الـ Cookies، يمكنك أن تقرأ أكثر حول هذه الخاصية من خلال هذه المقالة:

اخي لدي موقع ضعيف الحمايه ويستخدم الكوكيز بدون حمايه، حاولت اختراقه بشفرت جافا سكربت ادناه ولكن فشل رغم انه لا يوجد اي نوع من الحمايه به

<p id="title"></p>
<script>
function setCookie(cname, cvalue, exdays) {
  var d = new Date();
  d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
  var expires = "expires="+d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for(var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "-1"; // أو فارغة
}

function checkCookie() {
  var user = getCookie("username");
  if (user != "") {
    alert("Welcome again " + user);
  } else {
    user = prompt("Please enter your name:", "");
    if (user != "" && user != null) {
      setCookie("username", user, 365);
    }
  }
}
setCookie('userNameChat', 5, 67);
document.getElementById('title').innerHTML= getCookie('userNameChat');

</script>
بتاريخ 11 دقائق مضت قال علي الكاسر:

setCookie('userNameChat', 5, 67);
document.getElementById('title').innerHTML= getCookie('userNameChat');

المفترض ان هذا السكربت يضيف الكوكيز في متصفحي وهو ينجح في اضافتها ولكن الموقع يتجاهل هذه الكوكيز المزروعه ولا يتعرف عليها رغم انه وضعت نفس المفتاح، هل هناك سكربت اخر مخصص لهذا الامر او كيف

  • 0
نشر
بتاريخ 24 دقائق مضت قال علي الكاسر:

اخي لدي موقع ضعيف الحمايه ويستخدم الكوكيز بدون حمايه، حاولت اختراقه بشفرت جافا سكربت ادناه ولكن فشل رغم انه لا يوجد اي نوع من الحمايه به


<p id="title"></p>
<script>
function setCookie(cname, cvalue, exdays) {
  var d = new Date();
  d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
  var expires = "expires="+d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for(var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "-1"; // أو فارغة
}

function checkCookie() {
  var user = getCookie("username");
  if (user != "") {
    alert("Welcome again " + user);
  } else {
    user = prompt("Please enter your name:", "");
    if (user != "" && user != null) {
      setCookie("username", user, 365);
    }
  }
}
setCookie('userNameChat', 5, 67);
document.getElementById('title').innerHTML= getCookie('userNameChat');

</script>

المفترض ان هذا السكربت يضيف الكوكيز في متصفحي وهو ينجح في اضافتها ولكن الموقع يتجاهل هذه الكوكيز المزروعه ولا يتعرف عليها رغم انه وضعت نفس المفتاح، هل هناك سكربت اخر مخصص لهذا الامر او كيف

الكود يعمل بدون مشكلة، إن كنت تحاول أن تضيف الـ Cookies في ملف محلي Local file فلن يتم ذلك في أغلب المتصفحات، ويجب أن يتم إضافة الـ Cookies في موقع له نطاق مثل example.com أو localhost .. إلخ.

  • 0
نشر
بتاريخ 3 ساعات قال سامح أشرف:

الكود يعمل بدون مشكلة، إن كنت تحاول أن تضيف الـ Cookies في ملف محلي Local file فلن يتم ذلك في أغلب المتصفحات، ويجب أن يتم إضافة الـ Cookies في موقع له نطاق مثل example.com أو localhost .. إلخ

جربت مع لوكال هوست وفشل الامر ايضا 

انا انشاءت الكوكيز بهذا الامر

setcookie('userNameChat', $dbt->last_id , time() + 60 * 60 * 7000 , '/');

لا يممكنني ان اصل لهذه الكوكيز بالحافا سكربت ولا يمكن ان تتعرف الكوكيز التي في الموقع على الكوكيز التي زرعتها بالجافا سكربت، ان كانوا المخترقين يستخدم هذا الشي للاختراق فشكل موقعي مصتعصي عليهم لان الكوكيز تبعه لا يتم العثور عليها بالجافا سكربت

  • 0
نشر
بتاريخ 8 ساعات قال علي الكاسر:

جربت مع لوكال هوست وفشل الامر ايضا 

انا انشاءت الكوكيز بهذا الامر

setcookie('userNameChat', $dbt->last_id , time() + 60 * 60 * 7000 , '/');

لا يممكنني ان اصل لهذه الكوكيز بالحافا سكربت ولا يمكن ان تتعرف الكوكيز التي في الموقع على الكوكيز التي زرعتها بالجافا سكربت، ان كانوا المخترقين يستخدم هذا الشي للاختراق فشكل موقعي مصتعصي عليهم لان الكوكيز تبعه لا يتم العثور عليها بالجافا سكربت

يمكنك التأكد من أنه قد تم إرسال الـ Cookies من خلال أدوات المطورين DevTools ثم  تبويبت Application ثم Cookies ثم localhost

6194431e4d015_Screenshot2021-11-17014645.thumb.png.6d570a5124eb790b9b164fe45ea3ca7d.png

عليك أيضًا أن تتأكد من أن قيمة $dbt->last_id ليست null وأنها تحتوي على نص أو رقم. مع العلم أن بعد أن تظهر لديك الـ cookie في المتصفح سيمكنك أن تصل إليها من خلال JavaScript طالما أن الخاصية HttpOnly فارغة (غير محددة).

  • 0
نشر
بتاريخ 15 ساعات قال سامح أشرف:

لذلك الحل الأفضل هو جعل الـ Cookies غير قابلة للقراءة من قِبل JavaScript

طيب اذا جعلناها غير قابله للقراءة بالجافا سكربت، فكيف يمكنني فيما بعد العثور عليها وأرسالها إلى السيرفر مع كل طلب للعميل. 

 

بتاريخ 15 ساعات قال سامح أشرف:

وعندما تنتهي هذه الفترة يقوم المستخدم بطلب رمز Token جديد (تتم هذه العملية بشكل تلقائي من خلال ما يسمى Refresh Token)

ماذا اذا انتهت تلم الفتره والعميل غير متصل ولم يدخل الموقع منذ ايام او اشهر، فكيف سيحصل على رمز جديد وه مش موجود. 

  • 0
نشر
بتاريخ منذ ساعة مضت قال علي الكاسر:

طيب اذا جعلناها غير قابله للقراءة بالجافا سكربت، فكيف يمكنني فيما بعد العثور عليها وأرسالها إلى السيرفر مع كل طلب للعميل. 

حينها سوف يقوم المتصفح بإرسالها تلقائيًا مع كل طلب بدون تدخل من المبرمج.

اقتباس

ماذا اذا انتهت تلم الفتره والعميل غير متصل ولم يدخل الموقع منذ ايام او اشهر، فكيف سيحصل على رمز جديد وه مش موجود. 

سوف يتم إعادة توجيه المستخدم لصفحة تسجيل الدخول، لكي يقوم بتسجيل الدخول مرة أخرى والحصول على Token جديد.

  • 0
نشر
بتاريخ 18 دقائق مضت قال سامح أشرف:

حينها سوف يقوم المتصفح بإرسالها تلقائيًا مع كل طلب بدون تدخل من المبرمج.

بتاريخ 20 دقائق مضت قال سامح أشرف:

حينها سوف يقوم المتصفح بإرسالها تلقائيًا مع كل طلب بدون تدخل من المبرمج.

هذا سيجعل الموقع مصاب بثغرة CSRF

الامر في غاية التعقيد 

 

  • 0
نشر
بتاريخ 21 دقائق مضت قال علي الكاسر:

 

لهذا يقوم الخادم بإرسال CSRF Token مع كل صفحة ويجب أن يتم إرسال هذا الرمز مع كل طلب وإذا لم يكن الرمز صحيحًا، سيتم تجاهل الطلب، وبالتالي نضمن أن الطلب قادم من المستخدم الحقيقي. تقوم إطارات العمل مثل Laravel بهذا الأمر بشكل تلقائي وتسهل على المبرمج الكثير من العمل مثل توليد CSRF Token وكذلك التحقق منه، حيث يتم هذا الأمر بشكل تلقائي.

يمكنك أن تلقي نظرة على هذه الصفحة في موسوعة حسوب.

  • 0
نشر
بتاريخ 6 ساعات قال سامح أشرف:

لهذا يقوم الخادم بإرسال CSRF Token مع كل صفحة ويجب أن يتم إرسال هذا الرمز مع كل طلب وإذا لم يكن الرمز صحيحًا، سيتم تجاهل الطلب، وبالتالي نضمن أن الطلب قادم من المستخدم الحقيقي. تقوم إطارات العمل مثل Laravel بهذا الأمر بشكل تلقائي وتسهل على المبرمج الكثير من العمل مثل توليد CSRF Token وكذلك التحقق منه، حيث يتم هذا الأمر بشكل تلقائي.

يمكنك أن تلقي نظرة على هذه الصفحة في موسوعة حسوب.

لم افهم حاجه ، على العموم شكرا لمجهودك اخي

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...