מה זה העלאת קבצים לא מאובטחת - כשתמונת פרופיל הופכת לדלת אחורית¶
כמעט כל אתר מודרני נותן למשתמשים להעלות קבצים - תמונת פרופיל, קורות חיים, מסמך. זה נשמע כמו הפעולה הכי תמימה שיש. אבל אם האתר לא בודק כמו שצריך מה בדיוק הועלה, הפיצ'ר התמים הזה יכול להפוך לדרך הישירה ביותר להשתלט על השרת כולו.
אז מה זה בעצם קורה שם¶
כשאתר מאפשר להעלות קובץ, הוא בדרך כלל שומר אותו איפשהו על השרת, ולפעמים אפילו הופך אותו לנגיש דרך כתובת אינטרנט משלו. הבעיה מתחילה כשהאתר לא בודק באמת מה סוג הקובץ שהועלה - הוא רק בודק, למשל, שהסיומת של הקובץ היא jpg. אבל סיומת קובץ היא רק שם, לא הוכחה אמיתית לתוכן.
תוקף יכול לקחת קובץ קוד שרת - למשל קובץ PHP שמריץ פקודות מערכת הפעלה - ולשנות לו את הסיומת ל-jpg, או לנסות לעקוף בדיקות דומות בדרכים יצירתיות אחרות. אם השרת מקבל את הקובץ ושומר אותו בתיקייה שממנה אפשר להריץ קוד, התוקף פשוט ניגש לכתובת של הקובץ שהעלה, השרת מריץ אותו כאילו הוא קוד לגיטימי, וזהו - יש לתוקף בעצם יכולת להריץ כל פקודה שהוא רוצה על השרת.
למה זה כל כך מסוכן¶
זו לא חולשה שנותנת גישה לפיסת מידע אחת - היא נותנת בפועל יכולת הרצת קוד מרחוק - Remote Code Execution - שנחשבת לאחת מהחולשות החמורות ביותר שקיימות בכלל. ברגע שתוקף מצליח להריץ קוד משלו על השרת, הוא בעצם בעל שליטה מלאה - יכול לקרוא ולשנות כל קובץ, לגשת למסד הנתונים, ולהשתמש בשרת כבסיס לתקיפות נוספות.
למה מפתחים בכל זאת נופלים בזה¶
הבדיקה הנפוצה והשגויה ביותר היא הסתמכות על סיומת הקובץ בלבד, כי היא הכי פשוטה לממש. בדיקות מעט טובות יותר בודקות את סוג התוכן - Content-Type - שהדפדפן שולח, אבל גם את זה קל לתוקף לזייף, כי הוא בסך הכל שדה טקסט שהדפדפן שולח ואין שום דבר שבאמת אוכף שהוא נכון. גם בדיקות שמנסות לפתוח את הקובץ כתמונה כדי לוודא שהוא באמת תמונה תקינה, לפעמים ניתנות לעקיפה עם קבצים שמשלבים תוכן תמונה תקין יחד עם קוד זדוני נסתר בתוכו.
מה עוד יכול להשתבש בהעלאת קבצים¶
מעבר להרצת קוד, יש עוד כמה בעיות שכדאי להכיר. שם קובץ שלא מסונן יכול לפתוח פתח לחולשת Path Traversal, אם התוקף שם בשם הקובץ עצמו ניסיון "לצאת" מהתיקייה שאליה הוא אמור להישמר. קובץ ענק שמעלים בכוונה יכול לגרום לעומס ולתקיפת מניעת שירות. ואפילו קובץ SVG, שנחשב תמונה, יכול להכיל קוד JavaScript ולהוביל לחולשת XSS אם הוא נפתח בדפדפן בצורה לא נכונה.
איך מגנים על אתר מפני זה¶
ההגנה הטובה ביותר משלבת כמה שכבות - קודם, לבדוק את התוכן האמיתי של הקובץ ולא רק את הסיומת או סוג התוכן שהדפדפן טוען שהוא שולח. שנית, לשמור קבצים שהועלו בתיקייה שאין לה כלל הרשאה להריץ קוד, כך שגם אם קובץ זדוני הצליח לעבור, השרת פיזית לא יכול להריץ אותו. שלישית, לשנות את שם הקובץ באופן אקראי בצד השרת, כדי שהתוקף לא יוכל לשלוט בנתיב שבו הוא נשמר. שילוב של כל אלה מקטין דרמטית את הסיכון.
איך לומדים לזהות את זה בעצמכם¶
הדרך הכי טובה להבין את החולשה הזאת היא לנסות בעצמכם, בסביבת תרגול חוקית, להעלות קובץ עם תוכן שונה ממה שהסיומת שלו מרמזת, ולראות איך אתרים שונים מתמודדים עם זה, ואיפה הם נכשלים.
בקורס פריצת אתרים חולשת העלאת קבצים לא מאובטחת נלמדת בפרק חולשות צד השרת, ומודגמת עד לשלב שבו רואים בעיניים איך קובץ שנראה תמים הופך לדריסת רגל מלאה על שרת אמיתי.
לסיכום¶
טופס העלאת קובץ נראה כמו הפיצ'ר הכי פשוט באתר, אבל הוא בעצם אחד ממקומות הכניסה המסוכנים ביותר אם הוא לא מטופל נכון. כל קובץ שמגיע ממשתמש צריך להיחשב חשוד עד שהוכח אחרת, ולא רק לפי הסיומת שלו.
הצטרפו לקהילה בדיסקורד ותתרגלו את זה בעצמכם, יחד עם קהילה שלמה שלומדת את אותו נושא.