Web API Diagnostics: Looking Behind the UI Freeze
מאת שי מרדכי | 16 באפריל 2026
באפריל 2026, הייתה אמורה להיפתח הרשמה משמעותית לפרויקט "מחיר למשתכן" של משרד השיכון. עבורי, כלוחם במילואים, זו הייתה נקודת ציון קריטית (לאור עדכון מכסות הזכאות ל-50%). השעה הגיעה, אבל האתר קפא. ה-UI לא איפשר הרשמה.
כחוקר אבטחה, כשאתר אומר לי "אי אפשר", האינסטינקט הראשון שלי הוא לשאול: איפה בדיוק מתרחשת החסימה? האם זה רק ה-Frontend שמסתיר כפתור, או שה-Backend באמת למטה?
The Diagnostic Process: Intercept & Replay
החלטתי לעשות Bypass ל-UI כדי לבדוק את זמינות ה-API. פתחתי את ה-DevTools והתחלתי לנטר את תעבורת ה-Network. גיליתי שהדפדפן שולח בקשה מעניינת:
GET https://dira.moch.gov.il/api/InvokerAuth?method=Projects¶m=%3FfirstApplicantIdentityNumber...%26ProjectStatus%3D4...
הסטטוס שחזר היה 200 OK. כלומר, ה-API Gateway למעלה ומתפקד! אבל ה-Response Body היה מאכזב:
{
"OpenLotteriesCount": 0,
"ActionStatus": 1,
"ProjectItems": []
}
Fuzzing the Backend Logic
כאן התחיל שלב המחקר. הבנתי שמבנה השאילתה מבוסס על Wrapper API שמעביר מתודות ופרמטרים ב-URL. הפרמטר הקריטי היה ProjectStatus=4, שמייצג סטטוס "פתוח להרשמה".
כדי לבדוק מה המערכת מסתירה ממני, השתמשתי ב-cURL Capture מהדפדפן וייבאתי את הבקשה (כולל כל ה-Auth Headers, ה-Tokens וה-Cookies) לתוך Postman ב-Fedora Kinoite שלי. התחלתי לבצע "Fuzzing" (דיג) על שדה הסטטוס.
כאשר שיניתי את הסטטוס מ-4 ל-2, הפלט התמלא במידע:
"LotteryNumber": "2667",
"CityDescription": "אופקים",
"HU_Reservists_L": 0,
"HU_CombatReservist_L": 0
שלב האימות: השוואת נתונים (מאי 2026)
חזרתי לבדוק את ה-API לאחר פתיחת ההרשמה הרשמית. הנתונים שחזרו (JSON) אישרו את ההשערה שלי: המערכת עובדת לפי State Machine נוקשה. בעוד שבאפריל המערך היה ריק, כעת ה-API מחזיר את כל נתוני ההגרלה המלאים, כולל שדות שלא היו חשופים ב-UI, כגון HU_CombatReservist_L (מכסות למשרתי מילואים קרביים).
השליפה הטכנית בוצעה באמצעות cURL והעברה ל-jq, מה שחשף שדות קריטיים המאפשרים לבצע אופטימיזציה של סיכויי הזכייה. המסקנה הטכנית: המערכת לא קרסה באפריל – היא פשוט עבדה במצב Draft, וה-API הגיב בהתאם להרשאות ה-Backend שטרם הופעלו.
עדכון מאוחר (Post-Mortem: מאי 2026)
במבט לאחור, התובנה הראשונית שלי לגבי ה"קריסה" הייתה חלקית. כשהרצתי את השאילתה מול ה-API בזמן אמת (לאחר פתיחת ההרשמה הרשמית), גיליתי שהמערכת מעולם לא קרסה – היא פשוט עבדה לפי State Machine נוקשה. ה-"0 Lotteries" שראיתי בתחילת אפריל לא נבעו מ-DB נעול, אלא מהעובדה שהנתונים החדשים פשוט טרם שוחררו ל-Public API. הלקח המרכזי כאן עבורי כחוקר הוא שלפעמים "חוסר נתונים" הוא התנהגות מתוכננת של ה-Backend, ולאו דווקא תקלה ב-Frontend. כעת, כשההרשמה פתוחה, ה-API מחזיר את כל הנתונים המלאים – מה שמוכיח שהארכיטקטורה עמידה ומתפקדת היטב.