גישה לפרטי התלמידים

לאחר רפרוף בקוד האתר הגעתי לקטע הקוד הבא:

בקטע ניתן לראות פונקציה המחזירה נתונים מממאגר התלמידים לפי פילטר מסויים, הרכבתי את הurl המצוי בקטע הקוד והגעתי אל הכתבות הבאה:

https://eduil.org/api/students/GetAll?searchQuery= 

החלטתי להכנס אליו ולראות את התוצאות, אך לא קיבלתי תשובה לזמן מה, החלטתי לנסות להכניס ערך לפרמטר searchQuery הכנסתי את התו x.

וברגע שקיבלתי תגובה מהשרת הבנתי שנגלה לעיני בעיה חמורה, עשרות ואף מאות רשומות המכילות פרטים רגישים הופיעו על המסך, התחלתי לשחק עם ערך הפרמטר, הגעתי למסקנה שכל רשומה שיש בשם הפרטי / משפחה שלה או בשם המשתמש את ערך הפרמטר תוחזר.

הכנסתי את התו / מכיוון שהוא לא קיים בשמות הנמצאים ברשומות וקיבלתי את התשובה הבאה:

תשובה זאת העידה על כך שיש כ 13735 תלמידים במאגר.

על מנת לצפות בכל התלמידים הנמצאים במאגר הכנסתי לערך את התו . אשר נמצא בכל שם משתמש במאגר ואכן פעולה זו עבדה, נחשפו לעיני פרטים אישיים של מעל כ 13 אלף תלמידים.

הפרטים אשר נחשפו כוללים:

  • תעודת זהות
  • מספר הטלפון האישי
  • מזהה בית הספר (אשר ניתן להצליב עם נתוני המשוב ולקבל את שם בית הספר)
  • המייל הפרטי
  • שם המשתמש
  • שם פרטי
  • שם משפחה
  • עיר מגורים

איפוס סיסמה ללא צורך באימות:

כאשר אנו ניגשים לאפס את סיסמת המשתמש מתבצעת בקשה המכילה את מזהה המשתמש

POST https://eduil.org/api/localaccount/ForgotPassword HTTP/1.1
{username: "CENSORED@office.eduil.org"}

התשובה המתקבלת

{
    "localPasswordResetToken":
    {
        "resetToken": "CENSORED",
        "userId": "CENSORED",
        "personalEmail": "CENSORED@gmail.com",
        "maskedEmail": "CENSORED@gmail.com",
        "callbackUrl": "https://eduil.org/login/passwordreset?userid=CENSORED&token=CENSORED"
    },
    "isSuccess": true,
    "correlationId": null,
    "message": null
}

השדה המעניין הוא callbackUrl אשר מחזיר לנו את קישור האימות אשר נשלח למייל המקושר לחשבון, הקישור מאפשר לנו לאפס את סיסמת המשתמש ומאפשר גישה לחשבון

אימות מייל / טלפון ללא אימות

כאשר אנו מעדכנים את מספר הטלפון / כתובת המייל המקושרים לחשבון אנו נשאלים באיזו דרך היינו רוצים לקבל את קוד האימות. אציג לכם מקרה מאחורי שירות רגיל ואילו פעולות מתרחשות מאחוריו (תיאורטית):

המקרה שלנו טיפה שונה, אצלנו אין אימות פרטים ובנוסף המזהה לא נשלח רק אל הטלפון / מייל אלא הוא מוחזר גם אל הדפדפן ופעולה זאת מאפשרת לנו לאמת את הפרטים ללא כל צורך בגישה לטלפון / מייל

ניתן לראות את הבקשה לעדכון מספר הטלפון של המשתמש:

POST https://eduil.org/api/userdata/UpdatePersonalPhoneTokenRequest HTTP/1.1
{
    "username": "CENSORED@office.eduil.org",
    "phoneNumber": "This isn't a real phone number",
    "educationObjectType": "Student"
}

אך התגובה לבקשה היא החלק הבעייתי:

{
    "updatePersonalPhoneNumberToken":
    {
        "confirmationToken": "711746",
        "userId": "CENSORED",
        "phoneNumber": "This isn't a real phone number",
        "callbackUrl": null
    },
    "isSuccess": true,
    "correlationId": null,
    "message": null
}

ניתן לראות בגוף התגובה את המפתח confirmationToken אשר מכיל בתוכו את הערך של קוד האימות האמור להישלח למספר, כאשר נזין אותו לשדה המבקש את קוד האימות ונלחץ אישור נקבל הודעה אשר מתריעה על כך שהפרטים עודכנו.

גישה לנתוני המשוב

לאחר חיטוט מתמשך בקוד האתר הגעתי לקובץ המכיל קוד המקשר את המערכת למערכת המשוב

הרכבתי url עם נתונים על התיכון, השכבה ומספר הכיתה בה אני לומד ואכן קיבלתי את הפרטים הנכונים.

הפרטים אשר הצלחתי לראות לא מציגים משהו מיוחד אלא דוח פעילות של שיעורים בכיתה:

  • שם המקצוע
  • נושא השיעור
  • שם המורה
  • האם היו שב
https://eduil.org/api/mashov/ClassAssignments?instituteSymbol={school_id}&classroomNumber={class_number}&classroomCode={grade_number}

ניתן להציב את הפרטים של כל בית ספר המחובר למערכת המשוב ולקבל את המידע

גישה לנתוני מסודות בערים

על ידי שימוש ב endpoint הבא:

https://eduil.org/api/municipalities/schools?cityName={city_name}

נקבל רשימה של שמות בתי הספר בעיר מסויימת, רשימה זו כוללת:

  • שם המוסד
  • סוג המוסד
  • מזהה המוסד
  • שם המנהל

דברים נוספים שראיתי:

המשכתי לחקור והגעתי ל endpoint הבא ב api:

https://eduil.org/api/communities/GetAllAvailable

כאשר ניגשים אליו מקבלים מידע על הקבוצות הקיימות ובמידע אשר היה שם ניתן לראות מי יוצר הקבוצה ואת פרטיו המלאים.

המידע אשר קיבלתי הכיל קבוצה לדוגמא ושם המשתמש אשר יצר את הקבוצה היה משתמש האדמין. כמובן שעל ידי ניצול השיטה שהצגתי בעמודים הקודמים ניתן להכנס למשתמש על ידי איפוס סיסמתו (פעולה שלא ביצעתי).

** אני משער שקיימות עוד בעיות, בעיקר בעיות הקשורות בהרשאות המשתמש אך לא המשכתי לבדוק מכיוון שפעולת בדיקה כזו תאלץ אותי לערוך את המשתמש ויכולה לגרום לפגיעה במערכת **

תוספת: (5/11/2018)

לאחר שהבעיות הקודמות תוקנו אותגרתי לחפש בעיה חדשה, באותו הרגע אמרתי לעצמי challenge accepted וברגע שחזרתי מהלימודים התחלתי לחפש, לאחר זמן קצר הצלחתי לשנות את הnav bar של העמוד

```

sess.post('https://eduil.org/api/tenantdata/', json={
    'headerStyle': {
        'id': 15,
        'displayName': None,
        'logoPhoto': b64encode(open('xyz.png', 'rb').read()).decode(),
        'logoPosition': 'right',
        'logoUrl': 'https://github.com/avramit/',
        'backgroundColorFrom': '#FF0000',
        'backgroundColorTo': '#000000',
        height: 70
    }
})

# https://eduil.org/tenant-style.module.chunk.js

כיום (שנה לאחר הדיווח) יש במאגר כ 62981 תלמידים