

السمعة:
- إنضم3 سبتمبر 2023
- المشاركات 8
- مستوى التفاعل 32
- النقاط 13
السلام عليكم ورحمة الله تعالى و بركاته
في هذا المقال سنستكمل حل تحدي Compare الذي تكلمنا عنه في المقال الفائت | الجزء الأول ... |
كنا قد توقفنا عند الـFunction isset و ما هي وظيفتها في الـConditions و الآن سوف نُكمل باقي الكود :
طيب خلوني اوضح نقطة قبل الاستمرار في شرح الكود :
طبعا يا جماعة عندنا أنواع كثيرة من الريكويستات لكن اشهر أنواع بينها هي الـGET و الـPOST و لكل واحد منهم خصائصه التي تميزه عن غيرة في ارسال البيانات و استقبالها من قبل السيرفر في هيئاته المختلفة فالنوع المستخدم في اي ريكويست سوف ترسله الي السيرفر محدد ففي الصورة التي نراها حاليا ان الBackend لا يقبل الا نوع واحد من الريكويستات وهو الGET وهذا بناء على الفانكشن $_GET التي يعد من وظائفها التحكم في نوع الاستقبال الخاص بالريكويست نفسه فلا يمكن للسيرفر الاستلام الا من خلال الـGET و ان لم يتم استلامها كما تري فان القاعدة العكسية سوف تفعل بشكل مباشر (Else) .
لنُكْمِل موضوع المقالِ :
كما ترون انه يوجد تناقض واضح جدًّا في السطر الرابع فبيقول الـBackend ان فيه شرط لو اتحقق و بقي True بشكل مباشر سيستكمل باقي عملياته و يعرض لي الفلاج ثم يخرج من الـCondition
طيب نعمل ايه هل هي دائرة مغلقة ؟
لنفكر خارج الصندوق قليلا و نذهب لتحليل هذا السطر ` if ($_GET['p1'] == "1e3" && $_GET['p1'] !== "1e3") ` حسنا ما مكونات هذا السطر و المعاني التي يتضمنها ؟
1. يبدأ السطر ب Condition في حالت تساوي القيمة المرسلة من المستخدم في الريكويست و التي تكون المحتوي الداخلي لقيمة الباراميتر `p1` التي ارسلها الشخص الي السيرفر مع القيمة الخاصة لهذة الValue (1e3) و ثم استخدم && ليخبرنا انه يوجد شرط اخر يجب ان يكون موجودا وهو ان القيمة المرسلة مع ال`p1` لا تساوي القيمة او النوع وفي هذا استخدم ==! ليقول هذا الشئ عن القيمة (1e3)
قد لا تكون لاحظتها ايها القارئ لكنه في هذا الـCondition استخدم اضافة غير متوقعة سوف تراها بسهوله عندما تقرأ الكود بتمعن والعلاقة المستخدمة بين الشرطين هي [==] , [==!] ان ركزت علي الشروط هنا سوف تجد مفاجأه انه يوجد تغير بين كل شرط فيهم حيث ان في الشرط الاول يوجد تساوي عادي سأوضحه لك ببساطة :
أولا في الـphp من المعروف ان علامات مثل = لها استعمالات مختلفة فاذا كان :
لو انت استخدمت = واحدة فانت هتستخدمها في حالة اضافة قيمة فقط يعني مثلا لو عندك متغير و عايز تديلو قيمة هتستخدمها
لو انت استخدمت == فانت هتستخدمها في حالت التطابق بس غير الصارم بحيث انو بيركزلك علي القيم لكن ملوش علاقة بالنوع الي هتستخدمو كما في الصورة الموضحة هنا :
فكما تري لقد عرفنا 5 علي انها String في الB و عرفناها علي اساس النوع Int في الA و عندما طبقنا عليها الCondition لقد تساوت بنجاح
اما لو انت استخدمت === فببساطة هتطبق مطابقة صارمة في الCondition بحيث انه هيركز علي القيمة و النوع وليس القيمة فقط كما في الصورة التالية :
فهذا كان شرح مبسط للاشياء الاساسية في الـPHP
طيب في الحالة بتاعتنا بيقولك انه عادي لو اتغير النوع لكن بنفس القيمة ($_GET['p1'] == "1e3") عشان استخدم علامتين يساوي فقط
اما في الشرط الثاني فهو يعتبر استخدم المعايير الصارمة فهو بيدقق علي النوع و القيمة بس هو مش بيدور علي القيمة و النوع! هتقولي مش فاهم ؟
ببساطة لما نحط علامة تعجب (!) في عملية التطابق فهي بكل بساطة بتاخد مكان الجزء الثالث من الشرط يعني ببساطه === هي نفسها ==! لكن علامة التعجب بتقولك اعكس شرطك يعني في حالتنا دي :
( $_GET['p1'] !== "1e3") هو بيقولك مش عايز ولا القيمة ولا النوع يكونو متشابهين يعني مش عايزة String ولا عايز القيمة الي هي 1e3 طيب ايه الحل ؟
لو مكنتش بتغيب في حصة الرياضيات يا معلم
فكنت هتعرف ان القيمة 1e3 هي قيمة رياضية في الاساس وليست مجرد كلمة كما كنت متوقع.
طبعا انت مخدتش بالك منها و بتسال نفسك هي معناها ايه ؟
بص اول حاجه هعرفهالك بشكل علمي بعدها هبسطهالك
هي عبارة عن طريقة لكتابة الأعداد الكبيرة أو الصغيرة بطريقة مضغوطة باستخدام الأسس لتقليل المسافة التي تأخذها الاصفار في الأرقام الكبيرة.
و بتتكون من :
1. رقم الاساس
2. رقم الأس
مفهمتش بشكل كبير طيب هبسطهالك ! :
فببساطة لما تيجي تكتب 1e3 بيكون يقصد رقم الاساس الي هو ال1 و الe ترمز للرقم 10 و الي بيجي بعدها بنقول عليه اس يعني في حالتنا جات 3 بعد الe يبقا تنكتب كدا "
" في حالت مظهرش الكود في الموقع هرفق ليكم صورة للأس لما يكون علي رقم معين :
وده هو شكل الرقم لما يكون عليه اس في الحالة بتاعتنا دي هنضرب رقم 1 ضرب 10 اس 3 هيكون بالشكل ده :
فالنتيجة ببساطة هتكون رقم 1000 لو حسبتها حتي علي الآلة الحاسبة
فبالتالي طالمه الكلمة دي بترمز لرقم معين او عملية حسابية و العملية الحسابية دي معرفة في لغة الـPHP يبقا ببساطة يبقا القيمة بتاعت ال1e3 هي عبارة عن الرقم 1000 وده في حالت الـ== الي بتسمح ليه بتطابق مع تغير النوع في حالت التعرف عليه من اللغة نفسها اما في حالت المطابقة القاسية فهو يا معلم مش هيتحول بل هيفضل متعرف في السكربت بتاعك ككلمة اسمها 1e3 و لن يسمح لها بالتحويل
و من هنا خطرتلي فكرة الاستغلال لتلك النقطة العمياء التي لم تخطر علي بال معظم من كان معي في الاختبار وهي التلاعب علي الCondition بحيث اني سوف اطبق الشرطين المستحيلين بطريقة سهله جدا وهي اني هعمل ريكويست بقيمة 1000 باستخدام البراميتر بتاعي الي هو p1 و هعدي الشرط الاول بكل سهولة
لكن باقي معايا شرط تاني بعده الي هو "if(md5($_GET['p2']) == '0e734627975726664180692657231716')" هشرحة ببساطه هو فيه باراميتر تاني لازم اجيب قيمتو فانا ببساطة عملت BruteForce علي القيمة الخاصة بالهاش الي هو مديهولي مع الاخذ في الاعتبار انه يبدأ بقيمة ال0e الي ممكن تكون زي الحالة الاولي الخاصة بتحويل الانواع او زي ما نقول الـType Juggling و تقدر تبحث عن الموضوع ده بشكل متعمق اكتر و ببساطة بعد ما عملت BruteForce بسيط طلعتلي الValue دي "240610708"
وبعد مجبت القيمتين و ظبطت كل حاجه هبدأ اني اعمل ريكويست بيهم من نوع Get بحيث اني احط الـValue الخاصه بيهم في الـURL و اديهم قيمة زي كدا بالظبط :
- http://206.81.16.10:8443/?p1=1000&p2=240610708
و بعدها يا معلم مبروك و طلعلك الفلاج بتاعك في Print عادية في الصفحة الي هو (EGCERT{Typ3_Juggl!ng_0cc6d17_is_Awes0me!}) وكدا نعتبر حلينا التحدي الاول في الـWeb Exploitaion
قناتي على اليوتيوب :
www.youtube.com
في هذا المقال سنستكمل حل تحدي Compare الذي تكلمنا عنه في المقال الفائت | الجزء الأول ... |
كنا قد توقفنا عند الـFunction isset و ما هي وظيفتها في الـConditions و الآن سوف نُكمل باقي الكود :
طيب خلوني اوضح نقطة قبل الاستمرار في شرح الكود :
طبعا يا جماعة عندنا أنواع كثيرة من الريكويستات لكن اشهر أنواع بينها هي الـGET و الـPOST و لكل واحد منهم خصائصه التي تميزه عن غيرة في ارسال البيانات و استقبالها من قبل السيرفر في هيئاته المختلفة فالنوع المستخدم في اي ريكويست سوف ترسله الي السيرفر محدد ففي الصورة التي نراها حاليا ان الBackend لا يقبل الا نوع واحد من الريكويستات وهو الGET وهذا بناء على الفانكشن $_GET التي يعد من وظائفها التحكم في نوع الاستقبال الخاص بالريكويست نفسه فلا يمكن للسيرفر الاستلام الا من خلال الـGET و ان لم يتم استلامها كما تري فان القاعدة العكسية سوف تفعل بشكل مباشر (Else) .
لنُكْمِل موضوع المقالِ :
كما ترون انه يوجد تناقض واضح جدًّا في السطر الرابع فبيقول الـBackend ان فيه شرط لو اتحقق و بقي True بشكل مباشر سيستكمل باقي عملياته و يعرض لي الفلاج ثم يخرج من الـCondition
طيب نعمل ايه هل هي دائرة مغلقة ؟
لنفكر خارج الصندوق قليلا و نذهب لتحليل هذا السطر ` if ($_GET['p1'] == "1e3" && $_GET['p1'] !== "1e3") ` حسنا ما مكونات هذا السطر و المعاني التي يتضمنها ؟
1. يبدأ السطر ب Condition في حالت تساوي القيمة المرسلة من المستخدم في الريكويست و التي تكون المحتوي الداخلي لقيمة الباراميتر `p1` التي ارسلها الشخص الي السيرفر مع القيمة الخاصة لهذة الValue (1e3) و ثم استخدم && ليخبرنا انه يوجد شرط اخر يجب ان يكون موجودا وهو ان القيمة المرسلة مع ال`p1` لا تساوي القيمة او النوع وفي هذا استخدم ==! ليقول هذا الشئ عن القيمة (1e3)
قد لا تكون لاحظتها ايها القارئ لكنه في هذا الـCondition استخدم اضافة غير متوقعة سوف تراها بسهوله عندما تقرأ الكود بتمعن والعلاقة المستخدمة بين الشرطين هي [==] , [==!] ان ركزت علي الشروط هنا سوف تجد مفاجأه انه يوجد تغير بين كل شرط فيهم حيث ان في الشرط الاول يوجد تساوي عادي سأوضحه لك ببساطة :
أولا في الـphp من المعروف ان علامات مثل = لها استعمالات مختلفة فاذا كان :
لو انت استخدمت = واحدة فانت هتستخدمها في حالة اضافة قيمة فقط يعني مثلا لو عندك متغير و عايز تديلو قيمة هتستخدمها
لو انت استخدمت == فانت هتستخدمها في حالت التطابق بس غير الصارم بحيث انو بيركزلك علي القيم لكن ملوش علاقة بالنوع الي هتستخدمو كما في الصورة الموضحة هنا :
فكما تري لقد عرفنا 5 علي انها String في الB و عرفناها علي اساس النوع Int في الA و عندما طبقنا عليها الCondition لقد تساوت بنجاح
اما لو انت استخدمت === فببساطة هتطبق مطابقة صارمة في الCondition بحيث انه هيركز علي القيمة و النوع وليس القيمة فقط كما في الصورة التالية :
فهذا كان شرح مبسط للاشياء الاساسية في الـPHP
طيب في الحالة بتاعتنا بيقولك انه عادي لو اتغير النوع لكن بنفس القيمة ($_GET['p1'] == "1e3") عشان استخدم علامتين يساوي فقط
اما في الشرط الثاني فهو يعتبر استخدم المعايير الصارمة فهو بيدقق علي النوع و القيمة بس هو مش بيدور علي القيمة و النوع! هتقولي مش فاهم ؟
ببساطة لما نحط علامة تعجب (!) في عملية التطابق فهي بكل بساطة بتاخد مكان الجزء الثالث من الشرط يعني ببساطه === هي نفسها ==! لكن علامة التعجب بتقولك اعكس شرطك يعني في حالتنا دي :
( $_GET['p1'] !== "1e3") هو بيقولك مش عايز ولا القيمة ولا النوع يكونو متشابهين يعني مش عايزة String ولا عايز القيمة الي هي 1e3 طيب ايه الحل ؟
لو مكنتش بتغيب في حصة الرياضيات يا معلم

طبعا انت مخدتش بالك منها و بتسال نفسك هي معناها ايه ؟
بص اول حاجه هعرفهالك بشكل علمي بعدها هبسطهالك
هي عبارة عن طريقة لكتابة الأعداد الكبيرة أو الصغيرة بطريقة مضغوطة باستخدام الأسس لتقليل المسافة التي تأخذها الاصفار في الأرقام الكبيرة.
و بتتكون من :
1. رقم الاساس
2. رقم الأس
مفهمتش بشكل كبير طيب هبسطهالك ! :
فببساطة لما تيجي تكتب 1e3 بيكون يقصد رقم الاساس الي هو ال1 و الe ترمز للرقم 10 و الي بيجي بعدها بنقول عليه اس يعني في حالتنا جات 3 بعد الe يبقا تنكتب كدا "
HTML:
<p>10<sup>3</sup></p>
فبالتالي طالمه الكلمة دي بترمز لرقم معين او عملية حسابية و العملية الحسابية دي معرفة في لغة الـPHP يبقا ببساطة يبقا القيمة بتاعت ال1e3 هي عبارة عن الرقم 1000 وده في حالت الـ== الي بتسمح ليه بتطابق مع تغير النوع في حالت التعرف عليه من اللغة نفسها اما في حالت المطابقة القاسية فهو يا معلم مش هيتحول بل هيفضل متعرف في السكربت بتاعك ككلمة اسمها 1e3 و لن يسمح لها بالتحويل
و من هنا خطرتلي فكرة الاستغلال لتلك النقطة العمياء التي لم تخطر علي بال معظم من كان معي في الاختبار وهي التلاعب علي الCondition بحيث اني سوف اطبق الشرطين المستحيلين بطريقة سهله جدا وهي اني هعمل ريكويست بقيمة 1000 باستخدام البراميتر بتاعي الي هو p1 و هعدي الشرط الاول بكل سهولة
لكن باقي معايا شرط تاني بعده الي هو "if(md5($_GET['p2']) == '0e734627975726664180692657231716')" هشرحة ببساطه هو فيه باراميتر تاني لازم اجيب قيمتو فانا ببساطة عملت BruteForce علي القيمة الخاصة بالهاش الي هو مديهولي مع الاخذ في الاعتبار انه يبدأ بقيمة ال0e الي ممكن تكون زي الحالة الاولي الخاصة بتحويل الانواع او زي ما نقول الـType Juggling و تقدر تبحث عن الموضوع ده بشكل متعمق اكتر و ببساطة بعد ما عملت BruteForce بسيط طلعتلي الValue دي "240610708"
وبعد مجبت القيمتين و ظبطت كل حاجه هبدأ اني اعمل ريكويست بيهم من نوع Get بحيث اني احط الـValue الخاصه بيهم في الـURL و اديهم قيمة زي كدا بالظبط :
- http://206.81.16.10:8443/?p1=1000&p2=240610708
و بعدها يا معلم مبروك و طلعلك الفلاج بتاعك في Print عادية في الصفحة الي هو (EGCERT{Typ3_Juggl!ng_0cc6d17_is_Awes0me!}) وكدا نعتبر حلينا التحدي الاول في الـWeb Exploitaion
لا تنسونا من صالح دعواتكم بالخير مع تحياتي
كان معكم في هذا المقال اخوكم طه صاحب قناة Technology Makers
كان معكم في هذا المقال اخوكم طه صاحب قناة Technology Makers
قناتي على منصة تلغرام :
قناتي على اليوتيوب :
Technology Makers
مرحبا بكم في قناة صناع التكنلوجيا , تختص هذه القناه في نشر مقاطع تعليميه متخصصه في مجال السايبر سيكيوريتي و البرمجه بشكل خاص و المجالات التقنيه بشكل عام و التوعيه الامنيه بخصوص كل ما هو جديد و حصري ,من قبل صناع محتوي متخصصين في هذه المجالات علي اعلي مستوي من الخبره و بطريقه شرح ممتازه مبسطه...

التعديل الأخير بواسطة المشرف: