مضى على الشبكة و يوم من العطاء.
  • تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

[ شرح ] الجزء الثاني تحدي الـCTF التابع الي الكلية الفنية العسكرية في مصر (ICMTC 2024)

elharam4

./عضو جديد
>:: v1p ::<

السمعة:

السلام عليكم ورحمة الله تعالى و بركاته

في هذا المقال سنستكمل حل تحدي Compare الذي تكلمنا عنه في المقال الفائت | الجزء الأول ... |

كنا قد توقفنا عند الـFunction isset و ما هي وظيفتها في الـConditions و الآن سوف نُكمل باقي الكود :


1_2kimDkBHc4OtdJhmUbCqlQ.webp


طيب خلوني اوضح نقطة قبل الاستمرار في شرح الكود :

طبعا يا جماعة عندنا أنواع كثيرة من الريكويستات لكن اشهر أنواع بينها هي الـ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 من المعروف ان علامات مثل = لها استعمالات مختلفة فاذا كان :

لو انت استخدمت = واحدة فانت هتستخدمها في حالة اضافة قيمة فقط يعني مثلا لو عندك متغير و عايز تديلو قيمة هتستخدمها

لو انت استخدمت == فانت هتستخدمها في حالت التطابق بس غير الصارم بحيث انو بيركزلك علي القيم لكن ملوش علاقة بالنوع الي هتستخدمو كما في الصورة الموضحة هنا :


Capture - Copy.webp



فكما تري لقد عرفنا 5 علي انها String في الB و عرفناها علي اساس النوع Int في الA و عندما طبقنا عليها الCondition لقد تساوت بنجاح

اما لو انت استخدمت === فببساطة هتطبق مطابقة صارمة في الCondition بحيث انه هيركز علي القيمة و النوع وليس القيمة فقط كما في الصورة التالية :



Capture - Copy (2).webp


فهذا كان شرح مبسط للاشياء الاساسية في الـPHP


طيب في الحالة بتاعتنا بيقولك انه عادي لو اتغير النوع لكن بنفس القيمة ($_GET['p1'] == "1e3") عشان استخدم علامتين يساوي فقط

اما في الشرط الثاني فهو يعتبر استخدم المعايير الصارمة فهو بيدقق علي النوع و القيمة بس هو مش بيدور علي القيمة و النوع! هتقولي مش فاهم ؟

ببساطة لما نحط علامة تعجب (!) في عملية التطابق فهي بكل بساطة بتاخد مكان الجزء الثالث من الشرط يعني ببساطه === هي نفسها ==! لكن علامة التعجب بتقولك اعكس شرطك يعني في حالتنا دي :

( $_GET['p1'] !== "1e3") هو بيقولك مش عايز ولا القيمة ولا النوع يكونو متشابهين يعني مش عايزة String ولا عايز القيمة الي هي 1e3 طيب ايه الحل ؟


لو مكنتش بتغيب في حصة الرياضيات يا معلم 😅 فكنت هتعرف ان القيمة 1e3 هي قيمة رياضية في الاساس وليست مجرد كلمة كما كنت متوقع.

طبعا انت مخدتش بالك منها و بتسال نفسك هي معناها ايه ؟

بص اول حاجه هعرفهالك بشكل علمي بعدها هبسطهالك

هي عبارة عن طريقة لكتابة الأعداد الكبيرة أو الصغيرة بطريقة مضغوطة باستخدام الأسس لتقليل المسافة التي تأخذها الاصفار في الأرقام الكبيرة.

و بتتكون من :
1. رقم الاساس
2. رقم الأس


مفهمتش بشكل كبير طيب هبسطهالك ! :

فببساطة لما تيجي تكتب 1e3 بيكون يقصد رقم الاساس الي هو ال1 و الe ترمز للرقم 10 و الي بيجي بعدها بنقول عليه اس يعني في حالتنا جات 3 بعد الe يبقا تنكتب كدا "
HTML:
 <p>10<sup>3</sup></p>
" في حالت مظهرش الكود في الموقع هرفق ليكم صورة للأس لما يكون علي رقم معين :
Captureسسس.webp
وده هو شكل الرقم لما يكون عليه اس في الحالة بتاعتنا دي هنضرب رقم 1 ضرب 10 اس 3 هيكون بالشكل ده :
Captureغغغغغغ.webp
فالنتيجة ببساطة هتكون رقم 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


لا تنسونا من صالح دعواتكم بالخير مع تحياتي

كان معكم في هذا المقال اخوكم طه صاحب قناة Technology Makers
قناتي على منصة تلغرام :



قناتي على اليوتيوب :

 
التعديل الأخير بواسطة المشرف:
أستمر يا وحش 💪
جزاك الله خيراً على مجهودك
 
السلام عليكم ورحمة الله و بركاته في هذا المقال سنستكمل حل تحدي Compare الذي تكلمنا عنه في المقال الفائت | الجزء الأول ... |

كنا قد توقفنا عند الـFunction isset و ما هي وظيفتها في الـConditions و الان سوف نستكمل باقي الكود :


مشاهدة المرفق 13214

طيب خلوني اوضح نقطة قبل الاستمرار في شرح الكود :

طبعا يا جماعة عندنا أنواع كثيرة من الريكويستات لكن اشهر أنواع بينها هي الـ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 من المعروف ان علامات مثل = لها استعمالات مختلفة فاذا كان :

لو انت استخدمت = واحدة فانت هتستخدمها في حالة اضافة قيمة فقط يعني مثلا لو عندك متغير و عايز تديلو قيمة هتستخدمها

لو انت استخدمت == فانت هتستخدمها في حالت التطابق بس غير الصارم بحيث انو بيركزلك علي القيم لكن ملوش علاقة بالنوع الي هتستخدمو كما في الصورة الموضحة هنا :


مشاهدة المرفق 13215


فكما تري لقد عرفنا 5 علي انها String في الB و عرفناها علي اساس النوع Int في الA و عندما طبقنا عليها الCondition لقد تساوت بنجاح

اما لو انت استخدمت === فببساطة هتطبق مطابقة صارمة في الCondition بحيث انه هيركز علي القيمة و النوع وليس القيمة فقط كما في الصورة التالية :



مشاهدة المرفق 13216

فهذا كان شرح مبسط للاشياء الاساسية في الـPHP


طيب في الحالة بتاعتنا بيقولك انه عادي لو اتغير النوع لكن بنفس القيمة ($_GET['p1'] == "1e3") عشان استخدم علامتين يساوي فقط

اما في الشرط الثاني فهو يعتبر استخدم المعايير الصارمة فهو بيدقق علي النوع و القيمة بس هو مش بيدور علي القيمة و النوع
هتقولي مش فاهم ؟

ببساطة لما نحط علامة تعجب (!) في عملية التطابق فهي بكل بساطة بتاخد مكان الجزء الثالث من الشرط يعني ببساطه === هي نفسها ==! لكن علامة التعجب بتقولك اعكس شرطك يعني في حالتنا دي :

( $_GET['p1'] !== "1e3") هو بيقولك مش عايز ولا القيمة ولا النوع يكونو متشابهين يعني مش عايزة String ولا عايز القيمة الي هي 1e3 طيب ايه الحل ؟


لو مكنتش بتغيب في حصة الرياضيات يا معلم 😅 فكنت هتعرف ان القيمة 1e3 هي قيمة رياضية في الاساس وليست مجرد كلمة كما كنت متوقع.

طبعا انت مخدتش بالك منها و بتسال نفسك هي معناها ايه ؟

بص اول حاجه هعرفهالك بشكل علمي بعدها هبسطهالك

هي عبارة عن طريقة لكتابة الأعداد الكبيرة أو الصغيرة بطريقة مضغوطة باستخدام الأسس لتقليل المسافة التي تأخذها الاصفار في الأرقام الكبيرة.


و بتتكون من :
1. رقم الاساس
2. رقم الأس


مفهمتش بشكل كبير طيب هبسطهالك ! :

فببساطة لما تيجي تكتب 1e3 بيكون يقصد رقم الاساس الي هو ال1 و الe ترمز للرقم 10 و الي بيجي بعدها بنقول عليه اس يعني في حالتنا جات 3 بعد الe يبقا تنكتب كدا "
HTML:
 <p>10<sup>3</sup></p>
"
في حالت مظهرش الكود في الموقع هرفق ليكم صورة للأس لما يكون علي رقم معين : مشاهدة المرفق 13217 وده هو شكل الرقم لما يكون عليه اس في الحالة بتاعتنا دي هنضرب رقم 1 ضرب 10 اس 3 هيكون بالشكل ده : مشاهدة المرفق 13218 فالنتيجة ببساطة هتكون رقم 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


لا تنسونا من صالح دعواتكم بالخير مع تحياتي

كان معكم في هذا المقال اخوكم طه صاحب قناة Technology Makers
قناتي علي منصة تلغرام :



قناتي علي اليوتيوب :

بطل بمعنى الكلمة, بننتظر جديدك عيوني
تحياتي للجميع ❤️ 🌹
 
الكلام يبان تقيل شوية من اول مره اقرأه بس لما قريت تاني لقيت الدنيا سلكت
تسلم يا كبير علي مجهودك الرائع, استمر​
 
التعديل الأخير:

آخر المشاركات

فانوس

رمضان
عودة
أعلى