PracticU

פריצה לאתר דרך כתובת URL

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › פריצה לאתר דרך כתובת URL
מילון מושגים:
URL - הכתובת שמזהה משאב באינטרנט, למשל דף אתר, וכוללת פרוטוקול, שם מארח ונתיב.
מפתח ראשי - עמודה או צירוף עמודות שמזהים באופן ייחודי כל שורה בטבלת מסד נתונים.
מפתח זר - עמודה בטבלה שמפנה למפתח הראשי בטבלה אחרת, ובכך יוצרת קשר בין הטבלאות.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
npm - מנהל החבילות של Node.js, המשמש להתקנה ולניהול ספריות JavaScript בפרויקט.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
ראוט - הגדרה שמקשרת כתובת בקשה לקוד שמטפל בה באפליקציה. גם מסלול שדרכו עוברות חבילות ברשת.
רשומה - שורה בטבלת מסד נתונים שמרכזת את כל השדות של פריט אחד, למשל כל הפרטים של לקוח יחיד.

פריצה לאתר דרך כתובת URL
חשיפה של מזהה מספרי של משתמש בכתובת מאפשרת לשנות אותו ולראות פרטים של אחרים. בעיה זו נקראת Insecure Direct Object Reference, ובקצרה IDOR. ההרצאה מראה איך מחליפים את ה-ID המספרי ב-UUID.
הבעיה
אחרי login ועדכון פרטים רואים בכתובת את ה-ID של המשתמש, למשל 1. שינוי ל-2 או 3 מציג פרטים של משתמשים אחרים. קודי מוצרים אינם מידע חסוי, אבל משתמשים כן, ובדומה לזה נתוני קופת חולים.
הפתרון: UUID לצד ה-ID
1. שמירת ה-ID הראשי: ה-ID המספרי נשאר מפתח ראשי ומפתח זר בטבלאות אחרות. מוסיפים לטבלת המשתמשים עמודה uuid מסוג char(36) עם ערכים ייחודיים. המרצה מכין סקריפט שמריצים ב-SQL.
2. יצירה בהרשמה: מתקינים npm i uuid, ובלוגיקת ה-auth מייצרים UUID בגרסה 4 ומשלבים אותו בשאילתת ההוספה. אין צורך להחזיר את ה-ID ללקוח.
3. החזרה בלוגין: מחזירים uuid במקום id.
4. לוגיקת המשתמשים: בשאילתות שליפה ועדכון משתמשים משתמשים ב-where uuid = '...', בתוך גרשיים, כי הערך הוא מחרוזת.
5. קונטרולרים וראוטים: לוקחים את uuid מה-params במקום id, ובקובץ האפליקציה הראוט של העריכה מקבל uuid.
6. צד הלקוח: ב-authentication, בלחיצה על אייקון המשתמש, עוברים לכתובת עריכה עם ה-uuid.
7. תיקון: בבדיקה התגלה שסימן + לפני הפרמטר ממיר אותו למספר, ולכן מסירים אותו.
שימו לב
בודקים ב-F12 שפרטי המשתמש המתקבלים לא כוללים את ה-ID. בנוסף, מתכנתים צריכים לשים לב לכל מקום שחושף נתיב לקובץ או קוד שאפשר לשנות כדי להגיע למשאב אחר.
אפשר עכשיו להסתיר מזהים מספריים של רשומות רגישות מאחורי UUID.
השיעור הבא בקורס: הסבר על סשן Session לאימות משתמשים

פרקי ההרצאה: פריצה לאתר דרך כתובת URL

  1. 00:00

    עדכון פרטי משתמש באתר

  2. 00:40

    הכרת Insecure Direct Object Reference

  3. 01:47

    שינוי ה-ID וחשיפת פרטי משתמשים

  4. 02:58

    הגנה בעזרת UUID במקום ID מספרי

  5. 04:16

    הוספת עמודת UUID לדאטאבייס

  6. 04:58

    שילוב UUID בתהליך ההרשמה

  7. 05:53

    התקנת חבילת uuid ויצירת מזהה

  8. 06:40

    החזרת UUID בלבד לצד הלקוח

תמלול ההרצאה: פריצה לאתר דרך כתובת URL

הטקסט המלא של הדקות הראשונות בהרצאה «פריצה לאתר דרך כתובת URL» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

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

  2. 00:33

    אבל יש פה משהו מעניין שאני מסתכל עליו על כל הדף הזה ואני רואה את בעיית הסקיוריטי שיש פה. ובעיית הסקיוריטי שקיימת פה היא בעיה שנקראת InSecureDirectObjectReferenceInSecureDirec tObjectReferenceInSecureDirectObjectRefere nce זה מצב שבו האתר שלנו חושף מידע שדרך המידע הזה אפשר לשנות אותו ולבצע דברים

  3. 01:09

    אחרים או לראות דברים אחרים. אז מה בעצם אנחנו חושפים פה? מה אנחנו רואים בכל האתר הזה שמאפשר לנו לחשוף את המידע הזה שדרכו אפשר לבצע עוד דברים או לראות עוד דברים?

  4. 01:26

    אז אם הצלחתם לראות, זה בעצם נמצא פה. מה זה המספר הזה שמופיע? המספר הזה זה ה-ID של היוזר. בואו ניכנס רגע לטבלת היוזרים ונראה שלמוישה ה-ID שלו זה אחד.

  5. 01:50

    אם משתמש, או בטח שהאקר רואה את הדבר הזה, אז הוא אומר, אוקיי, אם אני רואה איזשהו מספר, בואו נשנה אותו לשתיים, והופה, שימו לב מה אותו האקר רואה, פרטים של מישהו אחר.

  6. 02:04

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

  7. 02:26

    יוזרים זה מידע רגיש, אם היוזר משנה, הלקוח שלנו או ההאקר משנה מספר של יוזר, פתאום הוא רואה יוזרים אחרים.

  8. 02:35

    תחשבו על קופת חולים נניח, שפתאום אתם רואים ב-URL או איפשהו את הקוד שלכם ואפשר לשנות אותו בלי בעיה.

  9. 02:44

    ואז כמובן לראות פרטים חסויים של קופת חולים של מישהו אחר, אנחנו לא רוצים את זה. אז ברגע שהמידע הוא מידע רגיש, אנחנו לא רוצים לחשוף אותו, את ה-ID, כי אחרת זה Insecure Direct Object Reference ואנחנו רוצים להגן על זה.

  10. 03:04

    מה השיטה? לא להחזיר ID מספרי, להחזיר איזושהי מחרוזת שמייצגת את הרשומה המתאימה, אבל או מחרוזת כזאת שהיא דרכה אי אפשר להגיע למחרוזות דומות אחרות.

  11. 03:22

    אז אנחנו בעבר עשינו משהו עם זה, וזה נקרא UUID, Universal Unique Identifier, שזאת מחרוזת ארוכה שהמערכת מספקת לנו, וברגע שנרצה עוד מחרוזת, אנחנו לא נקבל את אותה מחרוזת בדיוק, כי זה בעצם האלגוריתם, האלגוריתם שומר על זה שכל הזמן תהיה לנו מכרוזת מאוד גדולה, ייחודית.

  12. 03:47

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

  13. 04:08

    אנחנו לא רוצים שהמחרוזת הארוכה הזאת תופיע כמפתח זר. אנחנו רוצים שה-ID ישוכפל כמפתח זר, אבל בנוסף יהיה לו איזשהו UUID. אז הכנתי כאן דאטאבייס שביחד עם ה-ID, אנחנו יכולים לראות את זה כאן, זה ה-ID Auto Increment, יש לנו UUID, char 36 ויש פה כמה UUIDs מתאימים שיצרתי.

  14. 04:38

    בואו ניקח את כל המחרוזת הזאת, ניגש לדאטה בייף שלנו נורת'ווינד sql נדביק go. עכשיו ליוזרים יש גם איי.די וגם את האוניברסל יוניק איידנטיפייר הזה אנחנו רק צריכים לבצע את ההתאמות הדרושות במערכת שלנו.

  15. 05:02

    נתחיל עם ארת' לוג'יק כאשר אנחנו עושים רג'יסטר אז אנחנו רוצים עכשיו להכניס ליוזר גם default value עבור ה-id, המספור האוטומטי רץ, ברגע שלשום פה default זה אומר שהמערכת תייצר לנו מספור אוטומטי, כי זה מה שמוגדר בדאטה בייס, אבל הוספנו עוד מכרוזת, והמכרוזת שהוספנו זה user.uuid.

  16. 05:34

    אנחנו צריכים עכשיו לעשות את ההתאמות הדרושות. עכשיו, user, כשהוא מביא לי את הנתונים, אין לו uuid, הוא לא שולח לי אותו אז כאן אני רוצה לגשת ליוזר ולהוסיף uuid אבל אני צריך את המנגנון שמייצר לי אותם אז בואו נתקין את זה npmi uuid וברגע שיש לנו אנחנו עושים

  17. 06:02

    פה required למעלה בואו ניגש לפה ונבצע קונסט של uuid שווה אמריקווייר של uuid ואז אנחנו יכולים להשתמש איתו כאן. בואו נייצר uuid, יש לו כל מיני ורז'ונים, ורז'ון 4 הוא ידוע בתור ורז'ון חזק שאנחנו יכולים להשתמש איתו.

  18. 06:32

    זאת המחוזת הארוכה עם ה-36 תווים. אז כרגע הכנסנו UUID למשתמש ושילבנו אותו בתוך השאילתא. עכשיו השאילתא אמורה להתאים לשאילתא שקיימת בדאטאבייס, למבנה של הדאטאבייס.

  19. 06:50

    דבר נוסף שאני רואה כאן זה שהחזרנו את ה-ID, אני לא צריך להחזיר את ה-ID, אז אנחנו בעצם לא צריכים את השורה הזאת, כי אני לא מחזיר יותר ID לקליינט סייד, רק UUID.

  20. 07:06

    אין לי פה צורך, גם באינפו הזה. ביי ביי. נקסט, הדבר הבא שאנחנו רוצים לבצע זה פה.

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: הסבר על Salting בסיסמה

ההרצאה הבאה: הסבר על סשן Session לאימות משתמשים

הרצאות קשורות מקורסים אחרים

  • XSS - פריצה לאתר עם Javascript
  • Open URL
  • URL Mapping
  • פריצה בכוח לאתר Wordpress עם Hydra

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React