لینکهای مفید برای شرکت در مسابقه:
در طول مسابقه، میتوانید سؤالات خود را از قسمت «سؤال بپرسید» مطرح کنید.
یک هکر کلاهسفید قصد دارد سایتهای مختلف برای برای آسیبپذیری Log4jShell بررسی کند. همانطور که میدانید، این یک آسیبپذیری از نوع RCE است و میتواند بسیار مخرب باشد؛ بنابراین باید به سرعت تشخیص داده شود.
این هکر برای بررسی یک سایت، باید تمام مسیرهای ممکن آن را بررسی کند. برای این که از روی آدرس سایت تمام مسیرهای آن را پیدا کند، از HATEOAS استفاده میکند (فرض کنیم همهی سایتها HATEOAS دارند).
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
هکر تاکنون یک تابع Retrieve
در فایل utils.go
نوشته که با دریافت آدرس یک مسیر، مسیرهای دیگری که از این مسیر امکان رفتن بهصورت مستقیم دارند را به او میدهد. مثلاً به ازای ورودی snapp.ir/
، آدرسهای زیر را برمیگرداند:
snapp.ir/blog
snapp.ir/contact
snapp.ir/about
و به ازای ورودی snapp.ir/blog
، آدرس های زیر را برمیگرداند:
snapp.ir/blog/post1
snapp.ir/blog/post2
نسخهی اصلی این تابع که هکر پیادهسازی کرده، به آدرس موردنظر درخواست HTTP ارسال میکند و نتیجه را پردازش کرده و لینک مسیرها را استخراج گرده و برمیگرداند. همانطور که حدس میزنید، هر بار اجرای این تابع با توجه به این که از شبکه استفاده میکند تا به سرور دسترسی پیدا کند، بسیار زمانبر است.
علاوه بر تابع Retrieve
، یک تابع به نام Hack
نوشته که قرار است به شکل بازگشتی، از ریشهی یک سایت شروع کرده و تمام مسیرهایی که به شکل مستقیم یا غیرمستقیم میتوان به آنها رسید را پیدا کند (به شکل بدون ترتیب). پیادهسازی اولیهای نیز از این تابع در اختیار ما قرار گرفته، اما متأسفانه با توجه به کندی تابع Retrieve
، بسیار کند است.
هکر کلاهسفید از شما خواسته تا بدون تغییر عملکرد و امضا، تابع Hack
را برایش سریعتر کنید. با توجه به این که تابع Retrieve
تابع ایمنی در مقابل همروندی است، میخواهیم از امکانات همروندی Go استفاده کنیم تا زمان اجرای تابع Hack
کمینه شود.
runtime
زبان Go را ندارید.Retrieve
را در فایل ارسالی قرار ندهید.main.go
هستید.main.go
تعریف کنید.پس از پیادهسازی موارد خواستهشده، فایل main.go
را آپلود کنید.