أهلا إخواني الكرام في أول درس من دورة حماية مواقع وسكربتات php ،
من الدروس التي سنتطرق إليها هي الحماية من تغرة XSS ، والتي تعتبر من أخطر التغرات على الإطلاق ،
لنبدأ على بركة الله ،
XSS أو Cross-Site --SS--ing ، تغرة جد خطيرة على موقعك أو سكربتك ، في أسوء الحالات هده التغرة تمكن المخترق من جعل العضو يُحول إلى صفحة أخرى وسرقة الكوكييز الخاصة به بنجاح .. ، كما تعلمون بإستخدامك للكوكييز فيمكنك عمل نظام عضويات أعني بهدا Login / logout ، أو مثلا تكون هناك الكوكيز الخاصة بخاصية remember me ألتي بداخل الكوكييز يكون بها كود مشفر يجعل العضو إدا أعاد الدخول إلى الموقع يتم تسجيل دخوله بدون السؤال عن الباسورد واليوزر وهدا الأمر جد خطير للأسف ، أو بشكل عام يمكن القول أن المخترق يمكنه أن يسرق أي معلومات حول الجلسة التي دخل بها ، عبر هده التغرة ،
في هدا الدرس إن شاء الله سوف نتعامل مع وضع الكوكييز ورؤيتها ، أظن سوف أعمل على شرح طريقة السرقة ، لكي نرى أحسن طريقة للحماية منها كدلك :]
فأظن معرفة التغرة جيدا يأتي في المرتبة الأولى تم بعدها نرى الطريقة التي يجب أن نحمي بها السكربت الخاص بنا :] ، أولا سوف أقوم بعمل جدول بقاعدة البيانات الخاص بالأعضاء.
ونضع به بعض البيانات كالتالي :

كما ترون فوق عملنا جدول بإسم Users ، وعملنا 5 حقول ، الأول الأيدي ، الثاني إسم المستخدم ، الثالت الكلمة السرية ، الرابع الإميل ، الخامس التوقيع :]
وأدخلت عضويين في قاعدة البيانات ولكن جعلت التوقيع فارغ لهما الإثنين ، لأننا في هدا الدرس سوف نقوم بإدخال القيم بشكل يدوي بعد حين ، إن شاء الله ،
ما يكون عادة في التوقيع ، هو بعض البيانات التي تخص العضو ، او التوقيع كما هو مشار إليه ، ولكن نحن سوف نقوم بإدخال كود جافاسكربت ، سنعمل كأننا المخترق صراحة ، ونرى النتائج :]
أولا في مجلد ما نعمل ملف index.php ، ويكون به إتصال بقاعدة البيانات ، على هدا الشكل :

، الأن نرى النتيجة في المتصفح :

كل شيئ تمام ، الأن الطريقة التي أريد العمل بها ، هي أن تكون لنا الإمكانية بإتباع هدا الرابط :
localhost/phpsecurity/index.php?id=1 ، ويطلع لنا المعلومات الخاصة بالعضو رقم 1 وهكدا :] ــ لدلك لنبدأ بهدا الأمر في الأندكس ، أولا نعمل تحقق هل هناك _GET['id'] ، لكي نتفادا خطأ undefined index ،

نعمل else ، ونقتل السكربت خخ ، بهدا الشكل :

تم بداخل الIf الأولى ، نعمل select سريع عن الأيدي في الجدول الدي إسمه Users ، على هدا الشكل :

كما ترون في الأعلى وضعنا متغير بإسم member وعملنا prepare لselect where id = :memberid ،
بخصوص هدا الأمر فهو يسمى الbinding ودلك للحماية من تغرة الSQL injection التي سنراها في درس لاحق في هده الدورة إن شاء الله ، المهم ليس موضوعنا الأن ،
بخصوص السطر الثاني فعملنا execute للأمر الدي هيأناه ، وأدخلنا قيمة الbind ، ففي السطر الأولى عملنا هده العلامة قبل الbind ، " : " ودلك للإشارة على أنه bind ، تم في السطر الثالت أدخل إسم الbind و قيمته ، وحددنا أن تكون القيمة رقمية فقط ، اقصد integer :D، لدلك الكود حاليا تمام ، مازلنا لم نقم بعرض شيئ فقط عملنا select ، لجلب البيانات نعمل التالي :

أوكي الأن تحت الكود الأول نعمل التالي ، نعيد تحديد متغير member ونضعه يساوي $member->fetchObject ، هدا يعني مثل mysql_fetch_object ،
تم نرى البيانات ، عملنا تحت html pre tags لجعل البيانات تظهر مرتبة ، لكون الدالة print_r و var_dump تظهر البيانات في سطر واحد ، المهم لنرى النتيجة في المتصفح ، نرى بيانات الأيدي رقم 1 :

تــم بيانات الأيدي رقم 2 :

أظن من الأحسن أن نضع الأمر مشابه لأرض الواقع ، مثلا نعمل هده البيانات في صفحة كصفحة البروفايل مثلا ، لدلك لنرى الأمر كيف سيتم :

أوكي عملنا template html بسيط جدا ، فقط أشياء معروفة h2 ، hr إلى غير دلك وضعنا إسم المستخدم ، تم التوقيع الخاص به ، لنرى النتيجة في المتصفح ، للأيدي رقم 1 :

تمام ، بخصوص التوقيع فلايظهر للأننا لو تتدكرون ، تركناه فارغا ، لدلك لم يعرض أي شيئ ، الأن كل شيئ تمام ، لنجرب الأن في الphpmyadmin ، إدخال التوقيع للأيدي رقم واحد ، ونضع فيه كوود --SS-- ، سندعي أن الأمر تم عبر مخترق قام بتعديل البروفايل الخاص به لدلك سيتم إدخال القيم في قاعدة البيانات ، ولكن حاليا لضيق الوقت سنضعها بشكل يدوي، كالتالي :

ندهب إلى المتصفح ونرى النتيجة في البروفايل للأيدي رقم 1 :

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

أوكي هنا فوق عملنا متغير date يحمل الكلاس الخاص بالتعامل مع الdates وهو DateTime وعملنا أن يعطينا تاريخ بعد أسبوع قادم ، وهدا يسمى وقت الexpiry ، أي متى تنتهي الكوكي :] ، في الكوكي أدخلنا واحدة جديدة بإسم password ، وقيمتها abc وexpiry الخاص بها هو أسبوع :] ، سندعي أن هدا الباسورد لعضو مسجل دخوله وباسورده هو abc من المفترض أن يكون الكوكي خاص بهدا العضو فقط ، إن تمت مشاركته مع شخص أخر يصبح قادرا هو الأخر على تسجيل الدخول ، المهم لنرى هل تم عمل الكوكي أم لا ، لنلاحظ الأمر في الresources الخاصة بgoogle chrome ، :] كالتالي :

أوكي كما ترون هناك الكوكي بإسم password وقيمتها abc ، بخصوص هدا الكوكي فهو يظهر للعضو المسجل فقط ، :] فمثلا في ستارتايمز تجد الكوكي الخاص بتسجيل دخولك ، وبها تاريخ إنتهاء الصلاحية ، فعندما ينتهي دلك الوقت يسجل خروجك أتوماتيكيا ،
المهم هدا ليس درسنا ، المعلومة التي أريد أن أوصلها لكم ، وهي أن القيمة abc هي قيمة تكون مشفرة ن وتكون خاصة بالعضو المسجل فقط ، يعني لو وصل إليها المخترق ، إدا قد تمت عملية إختراقه بنجاح تام ويصبح قادرا على الدخول بعضويتك الخاصة :] ،
الأن نرجع ونحدف الكود الخاص بوضع الكوكييز فقد تم وضعها بنجاح وستبقى بإدن الله لأسبوع خخخ إلا إدا حدفناها يدويا :] ، المهم الكود سيصبح كالتالي :

الأن لنمر ، نعمل مجلد داخل مجلد phpsecurity ونسميه hackersite ، تم نعمل بداخله ملف إسمه cookie.php ، الكود الدي سيكون فيه هو كالتالي :

الأن هدا الملف سندعي أنه موجود بموقع المخترق وليس بموقعك ، يعني مثلا الموقع الخاص بك هوwww.mywebsite.com ، اما موقع المخترق فهوwww.testhacking.org ;
فيwww.testhacking.org ، يوجد ملف بإسم cookie.php ، به متغير cookie يجلب القيمة التي تكون هنا على هدا الشكلwww.testhacking.org/cookie.php?cookie=hisham
إدا القيمة $cookie ستكون تساوي "hisham" ، اما في السطر الخامس فوضعنا دالة تقوم بإنشاء ملف بإسم getcookie.txt ، وتضع فيه القيمة $cookie والتي في هده الحالة ستكون هي "hisham" في الأخير وضعنا دالة لعمل redirect كما أن عملية سرقة الكوكيز لم تتم ، يعني يرجعك للصفحة التي كنت فيها ، الأن سكربت حفظ الكوكيز المسروقة موجود ، لندخل الأن ونعدل على كود الجافاسكربت ، ليصبح كالتالي :

الكود هو :
الأن لندهب الى المتصفح ونعيد الدخول إلى العضوية دات الأيدي رقم 1 ، كالتالي :

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

كما ترون تم إنشاءه وبه الكوكيز ، اقصد الإسم والقيمة ، يعني الأن سوف أقوم بأخد القيمة abc وأقوم بعملية إن شاء كوكي جديدة وأدخل القيمة والتي هي abc وعندما أعمل refresh أجد نفسي مسجل دخول بعضوية شخص أخر ، ودلك لأنني أدخلت التشفير الخاص به والدي يجب أن يكون يظهر له وخاص به فقط ، إدا الأن تمت عملية السرقة بنجاح ، ولقد تعلمت طريقة السرقة بنجاح خخخخ ، مع أن هدا الشيئ لا مفر منه للأسف خخ ، المهم نمر إلى موضوع الدرس الأصلي وهي طريقة الحماية من هده التغرة :]
أولا أظنكم فهمتكم التغرة بشكل كامل ، إدا أظنكم خمنتم ما هي الطريقة المثلى للحماية منها ؟!! على أيِِ ، سوف أكمل الدرس ،
المشكل الحقيقي هو أن البيانات التي تم إستخراجها من قاعدة البيانات تم عرضها بدون حماية ، وبدون مراقبة ، يمكن أن البعض سيقول نوفر لها المراقبة قبل أن تدخل لقاعدة البيانات ، هدا جيد ولكن صراحة من أفضل الأشياء عملها هي مراقبتها في عرضها بالمتصفح ، فالأمر أصعب عند دخولها لقاعدة البيانات ، لدلك سوف نوفر للبيانات المعروضة دالة للمراقبة ، وحدف الأشياء التي تعد خطيرة :] ، نعمل ملف إسمه fun ctions.php على السريع ، ونضع به دالة بإسم sanitize.php ،

عملنا دالة للتحقق أن الدالة غير موجودة في السكربت ، وهو أمر جيد لعدم الوقوع في خطأ redeclare ، وقمنا بعمل الدالة ووضعنا بها بارامتر واحد بإسم string وعملنا له return ، الأن نقوم بوضع هده الدالة في الأندكس أقصد على البيانات المعروضة خخ ، :] ،

كما ترون عملنا include لملف الدالة ، الأن نقوم بوضع الدالة على البيانات ، كالتالي :

في الحقيقة الأن تم عمل كل شيئ ولكن الدالة لا تعمل شيئ فقط ترجع نفس القيمة ، لنرجع لملف الدالة ونركز على الحماية أكثر ، خخخ ،

كما ترون إستعملنا دالة htmlspecialchars ، ووضعنا بها 3 بارامترات الأول يخص القيمة التي نريد حمايتها ، الثانية تخص على مادا نركز وركزنا على الحماية من single qoutes و double quotes ، وفي الأخير وضعنا الترميز وهدا مهم ، الترميز إن لم يكن صحيح فالكتابات العربية مثلا لن تخرج صحيحة ، ستخرج مخربطة ، لدلك وجب الإنتباه :] ،
الأن نرجع إلى المتصفح ونرى هل تم الحماية أم لا :

كما ترون كود الجافاسكربت حاليا ظهر ولم ينفد ، بحيث تم وضعه كأنه string عادي ، لو رأينا الكود السورس للصفحة المعروضة نرى هدا الشيئ :

كما ترون تم كتابته كنص ولم نعد نرى تاغ ال ript> ،
إلى هنا إخواني الكرام ينتهي الدرس ، نلتقي إن شاء الله في درس قادم ،
تحياتي ، أرجوا أن يكون الدرس واضح ومفهوم وشامل إن شاء الله :] أي إنتقاد أنا في الإستماع :] .
كملاحظة الدرس كان موجود قبل سنتين على الأقل ..
تحياتي إليكم أخوكم في الله هشام حضراوي ^_^.
0 comments:
إرسال تعليق