התמודדות עם העלאת תוכן גולשים ברמת הגדרות השרת

1 בJuly 2009

תגיות: ,
2 תגובות

בהרבה אתרים, בייחוד אתרים קהילתיים, ניתנת לגולשים באתר אפשרות להעלות קבצים. בין אם זה attacments להודעות פורום, קבצים עם תמונת פרופיל שלהם או מסמכים, יש להכל מכנה משותף – אנחנו נותנים לגולש אפשרות לשים קובץ ב FileSystem של השרת שלנו.

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

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

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

בעוד שלאפליקציית ASP.NET רגילה נדרשות מעט מאד הרשאות בשביל לרוץ (בד”כ מספיק Read), לתיקייה הספיציפית אליה מועלים הקבצים נרצה לתת הרשאות Write בנוסף, מסיבות מובנות. לשם כך, צריך לתת הרשאות לחשבון Network Service ב IIS6 (בעבר זה היה בחשבון ASPNET). אם הפעלתם את  אפשרות ה impersonate, אז במידה ומשתמש אנונימי זה יהיה המשתמש IUSR (המשתמש האנונימי של IIS). כדי לעשות את זה, פשוט ב properties של התיקייה, תוודאו שאין ירושה של הרשאות מתיקיות האב ותגדירו את ההרשאות המתאימות רק ליוזרים הנחוצים.

השלב הבא, הוא להגדיר ב iis. הצילומי מסך פה הם מ IIS6 – מטעמי נוחות. דרך ה IIS Manimageagement Console (בקיצור, inetmgr), לכו ל website של האתר שלכם, הקליקו ימנית בנחישות על התיקייה בה יהיו הקבצים של המשתמשים, בחרו ב properties ובטאב Directory במקטע Application Settings תלחצו על Create. בשלב הזה למעשה הפרדתם את התיקייה הזאת ל”אפליקציה” נפרדת, ככה שיהיה אפשר להגדיר לה הגדרות שונות בצורה ספיציפית.

בנוסף, באותו המקום, יש להגדיר ב Execute premissions כ- None. בסופו של דבר, שום דבר לגיטימי לא יכול לרוץ מהתיקייה הזאת.

 

לאחר מכן, לחצ על הכפתור Configuration הנמצא באותו מקום. בחלון שנפתח, הטאב הראשון (שפתוח אוטומטית) הוא Mappings. למעשה, יש שם את המיפוי של סיומות הקבצים השונות ל ISAPI Extension המתאים (במילים אחרות – המנוע שאחראי להריץ אותם). ייתכן שבאפליקציה שלכם יש שימוש ב ISAPI’s שונים משלכם, או שאתם משתמשים בדיפולט – בכל מקרה, אין שום דבר שאתם באמת רוצים שירוץ מהתיקייה הזאת. אז פשוט תעשו Remove לכולם.

כעת, לאחר שהגדרתם את כל ההגדרות כפי שכתבתי, אם מישהו ינסה להיכנס לקובץ asp או aspx או כל קובץ אחר שמכיל סקריפט זדוני שלו שאיכשהו מצא את מקומו בתיקייה הזאת – זה פשוט לא יעבוד. קבצי ASP יחזירו שגיאת 404 (ליתר דיוק 404.2) וקבצי ASP.NET פשוט לא יפורשו ויוחזרו איך שהם ל client. בצורה הזאת, גם אם מישהו יצליח להעלות איזשהו shell דרך מנגנון העלאת הקבצים שלכם, הוא לא יצליח להריץ אותו.

בהצלחה.

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

2 תגובות

  1. משה2 בJuly 2009 ב 8:57

    יפה כתבת, והייתי מוסיף בנוסף לשים איזה ASHX או (ב-IIS7 זה מובנה) כלי אחר שיבדוק Referer לפני השליחה ללקוח – השרת שלכם הוא לא אחסון חינמי.

    Reply
  2. משה2 בDecember 2009 ב 18:34

    ועכשיו שמתי לב קצת באיחור

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

    Reply