Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
wix-kickstartx-challenge-writeup — شرح مفصّل لتحدي CTF: هندسة عكسية لتطبيق SPA مبني على React، وتحليل صور SVG، وبناء حلّال آلي باستخدام المطابقة الجشعة، وتحقيق علامة كاملة. | Kitploit
أدوات/GitHubGitHub/d0rb/wix-kickstartx-challenge-writeup
الهندسة العكسيةCTFالتعلم والتعليم
GitHubd0rb/wix-kickstartx-challenge-writeup

wix-kickstartx-challenge-writeup

شرح مفصّل لتحدي CTF: هندسة عكسية لتطبيق SPA مبني على React، وتحليل صور SVG، وبناء حلّال آلي باستخدام المطابقة الجشعة، وتحقيق علامة كاملة.

عرض المستودع

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
9منذ 4 أشهرلم تتم المراجعة بعد

Wix KickstartX Challenge 2026 — الشرح الكامل

النتيجة: 200/200 (100%) — الرمز: WKX-9245FA70-200 التاريخ: 24 مارس 2026


1. الاكتشاف والاستطلاع

الإعلان عن التحدي

أعلن منشور على LinkedIn عن تحدٍّ خاص لبرنامج Wix KickstartX — وهو برنامج للمطوّرين المبتدئين. القواعد:

  • 30 دقيقة، محاولة واحدة فقط
  • أفضل 10 درجات أعلى يتأهلون مباشرة إلى مرحلة الامتحان
  • تم توفير رابطين: wix-kickstartx-challenge-2026.base44.app/ و wixkickstart.com

العثور على نقطة دخول التحدي

الموقع الرئيسي wixkickstart.com هو موقع مستضاف على Wix (يُقدَّم من جانب الخادم بواسطة محرك Thunderbolt الخاص بـ Wix). لا يُرجع أمر curl العادي سوى هيكل JavaScript — دون أي محتوى فعلي. استخدمنا متصفح Chromium بدون واجهة رسومية (headless) لعرضه:

chromium --headless --disable-gpu --no-sandbox --virtual-time-budget=10000 \
  --dump-dom "https://wixkickstart.com" > /tmp/wix_rendered.html

من DOM المعروض، استخرجنا iframe مضمّنًا:

اتضح أنه رسم متحرك جسيمات p5.js (عنصر جمالي في القسم الرئيسي)، وليس التحدي نفسه. التحدي الفعلي موجود في تطبيق Base44.


2. الهندسة العكسية لتطبيق التحدي

المنصة: Base44

يعمل التحدي على Base44 — وهي منصة تطبيقات منخفضة الكود (low-code). التطبيق هو تطبيق React أحادي الصفحة، وكل المنطق في حزمة JS واحدة:

https://wix-kickstartx-challenge-2026.base44.app/assets/index-oTG160r9.js

الحجم: 410,809 بايت (React مُصغَّر + منطق التطبيق + Base44 SDK)

استخراج سطح الـ API

من خلال البحث في حزمة JS، قمنا بتخطيط الـ API بالكامل:

Functionالغرض
startGameينشئ جلسة لعبة، ويعيد 200 صورة + 200 وصف
scoreGameيقبل {matches: {}, sessionId: ""}، ويعيد {correctCount: N}
generateTokenيأخذ معرّف الجلسة، ويعيد رمز الإكمال
getLeaderboardيعيد أعلى الدرجات
saveNicknameيحفظ الاسم المعروض للوحة المتصدرين

الكيانات: GameSession، Participant

نمط عنوان API:

POST /api/apps/{appId}/functions/{functionName}

معرّف التطبيق: 69aea07cbcb9a3dd1039a58d

الثوابت الأساسية من الحزمة

const or = 1800;   // Time limit: 1800 seconds (30 minutes)
const rm = 200;    // Total items: 200 image-description pairs

اكتشاف آلية الإرسال JSON

اكتشاف بالغ الأهمية — التطبيق يحتوي على وضع إرسال جماعي JSON. من المصدر المُصغَّر:

function Ik({onSubmit:r, onClose:n}) {
    // ...
    h = JSON.parse(s)  // Parse JSON input
    // Validation: must be object like { "IMG-001": "DESC-042", ... }
    r(h)  // Submit all matches at once
}

النص النموذجي داخل النافذة المنبثقة:

{
  "IMG-001": "DESC-042",
  "IMG-002": "DESC-017",
  ...
}

هذا يعني أننا لا نحتاج إلى النقر 200 مرة في الواجهة — يمكننا إرسال خريطة JSON لجميع المطابقات الـ200 برمجيًا.

تدفق المصادقة

يستخدم SDK الخاص بـ Base44 مصادقة JWT:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

حمولة JWT تحتوي على:

{
  "sub": "[email protected]",
  "exp": 1782162460,
  "iat": 1774386460
}

الترويسات المطلوبة لجميع استدعاءات API:

Content-Type: application/json
Authorization: Bearer {jwt_token}
X-App-Id: 69aea07cbcb9a3dd1039a58d
Base44-Functions-Version: prod
X-Origin-URL: https://wix-kickstartx-challenge-2026.base44.app/

3. فهم بيانات اللعبة

استجابة startGame

POST /api/apps/69aea07cbcb9a3dd1039a58d/functions/startGame
Status: 200
Transferred: 62.87 kB compressed (2.20 MB decompressed)
Content-Encoding: br (Brotli)

بنية الاستجابة:

{
  "status": "active",
  "sessionId": "69c2fd218e5b26f307c941c9",
  "startedAt": "2026-03-24T21:07:45.101Z",
  "imageOrder": ["IMG-154", "IMG-102", ...],   // 200 items (display order)
  "descOrder": ["DESC-125", "DESC-109", ...],  // 200 items (display order)
  "imagesData": { "IMG-001": "data:image/svg+xml;base64,...", ... },  // 200 SVGs
  "descriptionsData": { "DESC-105": "milky field, overlaid with...", ... }  // 200 texts
}

تنسيق الصور: SVG مضمّن (مشفّر base64)

كل صورة هي SVG بأبعاد 200x200 تحتوي على:

  1. تدرّج خلفية (بثيم فاتح أو داكن)
  2. نمط تراكب اختياري (خطوط، نقاط، حلقات، إلخ)
  3. أشكال هندسية بألوان وأحجام وشفافية ودوران ومواضع محددة

مثال لـ SVG مفكوك الترميز (IMG-001):

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 200 200">
  <defs>
    <linearGradient id="bg" ...>
      <stop offset="0%" stop-color="#f5f0eb"/>
      <stop offset="100%" stop-color="#e8e0d5"/>
    </linearGradient>
  </defs>
  <rect width="200" height="200" fill="url(#bg)"/>
  <!-- Optional overlay lines/dots/rings here -->
  <polygon points="..." fill="#E2725B" transform="translate(128.6,185.7) rotate(90)"
           style="opacity:0.5;filter:drop-shadow(...)"/>
  <!-- More shapes... -->
</svg>

تنسيق الوصف: لغة طبيعية منظمة

كل وصف يتبع نمطًا صارمًا:

{background} field[, overlaid with {overlay}]. {N} elements total:
{size} {opacity} {color} {shape} ({rotation}, at {position}) ·
{size} {opacity} {color} {shape} ({rotation}, at {position}) · ...

مثال:

milky field, overlaid with tilted cross-lines. 10 elements total:
minuscule nearly solid dim gray pike (steeply angled, at center inner-left) ·
substantial solid azure pike (diagonal, at top center) · ...

4. بناء الحلّال الآلي

الخطوة 1: تخطيط جميع الثوابت

احتجنا إلى ربط خصائص SVG بمفردات الوصف. تطلّب ذلك تحليل جميع الصور الـ200 وجميع الأوصاف الـ200 للعثور على التطابقات الدقيقة.

تخطيط الخلفية (12 نوعًا)

من خلال عدّ مرات الظهور في الجانبين، أنشأنا تطابقًا 1:1:

لون بداية تدرج SVGالعددكلمة الوصفالعدد
#0a162828pitch28
#eef2f720frosted20
#0d0d0d19tenebrous19
#fef9f018pearlescent18
#1e0a2e18nocturnal18
#0a1a0a17midnight17
#1a0a0a15inky15
#f5f0eb14milky14
#f7f3ee14ethereal14
#f0f0f014radiant14
#f0f7f413glowing13
#1a1a2e10somber10

الطريقة: عدّ ألوان بداية التدرج الفريدة في جميع ملفات SVG الـ200، وعدّ الكلمة الأولى الفريدة في جميع الأوصاف الـ200، ثم المطابقة بناءً على العدد.

تخطيط التراكب (7 أنواع)

تراكبات SVG مُنفَّذة بطرق مختلفة حسب النوع:

نمط SVGطريقة الاكتشافالعدداسم الوصفالعدد
عناصر <line> أفقية (dy=0)فحص x1,y1,x2,y235striped overlay35
عناصر <line> عمودية (dx=0)فحص x1,y1,x2,y234lattice pattern34
<circle> مع opacity="0.06" (نقاط)عدّ الدوائر منخفضة الشفافية30stippled layer30
لا توجد عناصر تراكب إطلاقًالا خطوط، ولا أشكال خلفية28(none)28
عناصر <line> قطريةفحص اتجاه الميل27tilted cross-lines27
<polygon>/<path> صغيرة مع opacity="0.06"أشكال بسمة شفافية منخفضة25arrow-band texture25
<circle> مع fill="none" stroke="#888"دوائر بحدود فقط21ringed pattern21

الملاحظة الأساسية: عناصر نمط الخلفية تستخدم opacity كـ سمة XML (مثل opacity="0.06")، بينما تستخدم الأشكال الأمامية opacity داخل سمة style (مثل style="opacity:0.7"). كان هذا التمييز حاسمًا لفصل أنماط الخلفية عن الأشكال الفعلية.

تخطيط الألوان (28 لونًا)

جميع ملفات SVG الـ200 تستخدم 28 لون تعبئة hex فريدًا بالضبط. وجميع الأوصاف الـ200 تستخدم 28 اسم لون فريدًا بالضبط.

تنزيل الأداة