יישומי אינטרנט המאפשרים העלאת קבצים הפכו חיוניים עבור ארגונים רבים, ומשמשים כפורטלים עבור לקוחות, שותפים ועובדים לשיתוף סוגים שונים של מסמכים וקבצים. לדוגמה, חברת משאבי אנוש עשויה לאפשר למשתמשים להעלות קורות חיים, או חברה יכולה להקל על שותפים לשתף קבצים באמצעות פלטפורמת אינטרנט ייעודית.
אפילו עם אמצעי אבטחה משופרים ותהליכי אימות מחמירים יותר, תוקפים ממשיכים לנצל פגיעויות באמצעות שיטות מתוחכמות. קבצים שנראים שפירים, כגון תמונות, ניתנים למניפולציה כדי לפגוע באבטחת שרת האינטרנט.
קבצי פוליגלוט הם קבצים שיכולים להיות תקפים כמספר סוגים בו זמנית, מה שמאפשר לתוקפים לעקוף אמצעי אבטחה מבוססי סוג קובץ. דוגמאות לכך כוללות GIFAR, שמתפקד גם כקובץ GIF וגם כקובץ RAR, פוליגלוטים של JavaScript/JPEG המתפרשים גם כקובץ JavaScript וגם כקובץ JPEG, וקבצי Phar-JPEG, המזוהים גם כארכיון Phar וגם כתמונת JPEG. קבצי פוליגלוט אלה יכולים להישאר בלתי מזוהים עם סיומות מטעות או ריקות ש"מטעות" מערכות לחשוב שמדובר בסוג קובץ שפיר (כמו תמונה או PDF) תוך שהם מכילים קוד זדוני שלא זוהה.
אימות העלאת קבצים
מתן אפשרות להעלאת קבצים ממשתמשים ללא אימות ראוי או מקיף מהווה איום משמעותי על יישומי אינטרנט. אם תוקף מצליח להעלות קובץ זדוני, כגון Web Shell, הוא עלול להשתלט על השרת, ולסכן הן את המערכת והן את הנתונים הרגישים. כדי למתן סיכונים אלה, נקבעו שיטות עבודה מומלצות כדי להנחות מפתחים ביישום אמצעי אימות יעילים. שיטות אלה מסייעות להבטיח עיבוד מאובטח של העלאות קבצים, ובכך למזער את הסיכון לניצול לרעה.
תחומי המיקוד העיקריים לאבטחת העלאות קבצים כוללים:
- אימות סיומת: הטמע רשימת חסימה או רשימת היתרים של סיומות קבצים כדי להבטיח שרק סוגי קבצים מותרים יתקבלו.
- ניקוי שמות קבצים: צור מחרוזות אקראיות עבור שמות קבצים בעת העלאה.
- אימות סוג תוכן: אמת את סוג ה-MIME של הקובץ שהועלה כדי לוודא שהוא תואם לפורמט הצפוי.
- אימות כותרת תמונה: עבור העלאות תמונות, ניתן להשתמש בפונקציות כמו getimagesize() ב-PHP כדי לאשר את תקפות הקובץ על ידי בדיקת הכותרת שלו.
עקיפת מסנן העלאת קבצים
למרות יישום אמצעי הגנה אלה, תוקפים ממשיכים לשפר את שיטותיהם כדי לעקוף מנגנוני אימות. טכניקות כגון הזרקת תווים ריקים, סיומות כפולות וסיומות ריקות עלולות לפגוע באימות הסיומות: קובץ עשוי להופיע עם שם כמו "file.php.jpg", "file.php%00.jpg", "file.PhP" או "file.php/" כדי להתחמק מגילוי. ניתן לעקוף אימות מסוג MIME על ידי שינוי בתים קסומים ראשוניים של הקובץ, כגון שינוים ל-GIF89a, הכותרת המשויכת לקבצי GIF, מה שיכול להערים על המערכת לזהות את הקובץ כפורמט לגיטימי. בנוסף, ניתן להעלות קובץ .htaccess זדוני כדי לתמרן את תצורות השרת, מה שמאפשר ביצוע של קבצים עם סיומות לא מורשות.

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

קובץ פוליגלוט פשוט עם ExifTool
טכניקה פשוטה ליצירת תמונה רב-לשונית היא להשתמש ב-ExifTool. יישום רב עוצמה זה נועד לקרוא, לכתוב ולשנות פורמטים שונים של מטא-נתונים, כגון EXIF, XMP, JFIF ו-Photoshop IRB. עם זאת, אנשים זדוניים עלולים לנצל את ExifTool כדי לבצע פעולות מזיקות, כולל יצירת תמונה רב-לשונית בכוונה זדונית. על ידי שימוש ב-ExifTool כדי להטמיע קוד זדוני במטא-נתונים של EXIF של תמונה - במיוחד בשדות כמו UserComment ו-ImageDescription - תוקפים יכולים ליצור תמונה רב-לשונית ולהגדיל את סיכוייהם לניצול מוצלח.
להלן מטא-דאטה של ה-EXIF של התמונה, המספק מידע מקיף הקשור אליה.

באמצעות שימוש ב-ExifTool, גורם איום יכול להטמיע קוד זדוני בתוך המטא-דאטה של EXIF של תמונה, ובכך ליצור קובץ פוליגלוט שעשוי לעקוף מנגנוני אימות.

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


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

קובץ פוליגלוט של Javascript/JPEG
קובץ פוליגלוט JavaScript/JPEG בנוי כך שיהיה תקף הן כתמונת JPEG והן כסקריפט JavaScript. כדי להשיג זאת, גורם זדוני חייב להיות בעל הבנה מקיפה של המבנה הפנימי של קובץ JPEG. ידע זה מאפשר הטמעה מדויקת של נתונים בינאריים זדוניים בתוך התמונה, ומבטיח שניתן לעבד אותה על ידי מנוע JavaScript מבלי לפגוע בתקפותה כתמונת JPEG.
לתמונת JPEG יש את המבנה הבא:
| בתים | שֵׁם |
| 0xFF, 0xD8 | תחילת התמונה |
| 0xFF, 0xE0, 0x00, 0x10, … | כותרת ברירת מחדל |
| 0XFF, 0XFE, … | תגובה לתמונה |
| 0xFF, 0xDB, … | טבלת הכימות |
| 0xFF, 0xC0, … | תחילת המסגרת |
| 0xFF, 0xC4, … | שולחן האפמן |
| 0xFF, 0xDA, … | תחילת הסריקה |
| 0xFF, 0xD9 | סוף התמונה |

פורמט JPEG – מקור: https://github.com/corkami/formats/blob/master/image/JPEGRGB_dissected.png
במבנה תמונה של JPEG, הכותרת מופיעה אחריה מידע על האורך. כפי שמוצג בדוגמה הקודמת, הכותרת מתחילה ברצף 0xFF 0xE0 0x00 0x10 , כאשר 0x00 0x10 מייצג באופן ספציפי את אורך הקטע, המציין 16 בתים. הסמן 0xFF 0xD9 מסמן את סוף התמונה.

כדי ליצור קובץ פוליגלוט של JavaScript/JPEG, יש צורך לשנות את הערכים ההקסדצימליים של התמונה כדי להבטיח שמנוע ה-JavaScript יוכל לזהות ולעבד אותם.
ראשית, ב-JavaScript, ניתן לפרש את הרצף 0xFF 0xD8 0xFF 0xE0 כערכים שאינם ASCII, אך 0x00 0x10 אינו חוקי ויש לשנותו. התחליף המתאים לערכי הקסדצימליים הללו הוא 0x2F 0x2A , שהוא הייצוג ההקסדצימלי של /*, תחביר המשמש לפתיחת הערה ב-JavaScript. החלפה זו מאפשרת להתעלם מנתונים בינאריים שנותרו כחלק מההערה.
עם זאת, מכיוון ש -0x00 0x10 מייצג במקור את אורך כותרת ה-JPEG, שינויה ל -0x2F 0x2A , אשר במספר עשרוני שווה ל-12074, דורש הגדרה מחדש של כותרת ה-JPEG כדי לשמור על תוקפה. לשם כך, יש להוסיף בתים ריקים, ויש למקם את מטען ה-JavaScript לאחר סמן ה -0xFF 0xFE , המציין הערה לתמונה במבנה ה-JPEG.
לדוגמה, אם המטען הוא */=alert(document.domain);/* , שאורכו 28 בתים, מספר הבייטים הריק הנדרש יחושב באופן הבא: 12074 (אורך חדש) - 16 (אורך הכותרת המקורי) - 2 (עבור סמן 0xFF 0xFE ) - 28 (אורך המטען) = 12,028 בתים ריק.
כתוצאה מכך, קוד ה-JavaScript בתוך תמונת ה-JPEG ייראה כך:



לבסוף, יש למקם את הרצף 0x2A 0x2F 0x2F 0x2F (התואם ל-*///) ממש לפני סמן הסיום של קובץ ה-JPEG 0xFF 0xD9 . שלב זה סוגר את הערת ה-JavaScript ומבטיח שהמטען מבוצע כהלכה מבלי לשבש את מבנה קובץ ה-JPEG.

לאחר שינוי זה, עדיין ניתן לפרש את התמונה כתמונה תקפה ובו זמנית להכיל קוד JavaScript בר-הפעלה.

כאשר קובץ HTML טוען תמונה זו כקוד מקור של JavaScript, היא נשארת בתוקף ויכולה לבצע את קוד ה-JavaScript המוטמע:


קבצי תמונה של פוליגלוט מציגים סיכונים לא רק לניצול בצד הלקוח, אלא גם להתקפות בצד השרת בנסיבות מסוימות. דוגמה לכך היא קובץ הפוליגלוט Phar/JPEG, אשר ניתן לפרש גם כארכיון PHP (Phar) וגם כתמונת JPEG. מבנה קובץ Phar מאפשר הטמעה של נתונים מסודרים במטא-דאטה, דבר המהווה סיכון פוטנציאלי לפגיעויות ביטול סידור, במיוחד בגרסאות PHP מסוימות. כתוצאה מכך, ניתן למנף קבצי פוליגלוט Phar/JPEG כדי לעקוף אימות העלאת קבצים ולנצל שרתים פגיעים.
פורמט קובץ ה-Phar מוצג כ-stub/manifest/contents/signature, ומאחסן את המידע החשוב לגבי מה שכלול בארכיון ה-Phar במניפסט שלו:
- קבצי Stub: קבצי ה-stub הם קטע קוד PHP המופעל כאשר ניגשים לקובץ בהקשר בר-הפעלה. אין הגבלות על תוכן ה-stub, מלבד הדרישה שהוא יסתיים עם __HALT_COMPILER();.
- מניפסט: סעיף זה מכיל מטא-נתונים אודות הארכיון ותכניו, אשר עשויים לכלול מטא-נתונים של Pharma מסודרים המאוחסנים בפורמט serialize().
- תוכן הקובץ: הקבצים המקוריים הכלולים בארכיון.
- חתימה (אופציונלי): מכילה פרטי חתימה לאימות שלמות.

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

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


למרות שקובץ רב-תכליתי זה יכול לעקוף מסנני העלאת קבצים, הוא אינו מסוגל כרגע לנצל את שרת האינטרנט. כדי לנצל בהצלחה לפגוע בשרת אינטרנט באמצעות קובץ PHAR או קובץ רב-תכליתי של PHAR, חיוני להחדיר מטא-נתונים זדוניים בסידור למניפסט של הקובץ.
כאשר ניגשת לקובץ PHAR דרך עטיפת PHAR (phar://) בפונקציות PHP מסוימות (PHP ≤7.x) הקשורות לפעולות קבצים - כגון file(), file_exists(), file_get_contents(), fopen(), rename() או unlink() - הפונקציה unserialize() מופעלת עבור המטא-דאטה שעברו סדרה. בסופו של דבר, באמצעות PHPGGC, כלי נפוץ לבניית שרשראות גאדג'טים של PHP, גורמי איום יכולים לנצל את פגיעות הביטול-סריאליזציה באמצעות קובץ רב-תכליתי של PHAR, ובכך לפגוע בשרת יישומי האינטרנט.
השילוב של קבצי PHAR/JPEG רב-תכליתיים ופגיעויות ביטול סידור מאפשר לתוקפים לחדור לשרת יישומי אינטרנט, אפילו כאשר מיושמים מסנני העלאת קבצים. ראוי לציין כי פגיעה זו יכולה להתרחש גם במהלך עיבוד קובץ תמונה.


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

כדי להציג את הסיכונים הכרוכים בקבצי פוליגלוט ביישום שלכם, סימולציה של סביבה שבה היישום משתמש במסנני העלאת קבצים מחמירים כדי למנוע העלאה של קבצים זדוניים או קבצי Web Shell. למרות אמצעי הגנה אלה, תמונת פוליגלוט יכולה לעקוף את תהליך האימות, ובמקרים מסוימים, להוביל להרצת קוד מרחוק, ובסופו של דבר לפגוע בשרת יישומי האינטרנט הפגיע.
דוגמה זו ממחישה יישום אינטרנט קונבנציונלי המאפשר שיתוף קבצים בין לקוחות, שותפים וארגונים:
MetaDefender Core ו MetaDefender ICAP Server מגן על יישומי האינטרנט שלך מפני איומים אלה ומשפר את אבטחת הרשת והתשתית שלך.
MetaDefender ICAP Server ו MetaDefender Core לעבוד יחד כדי להגן על שרת האינטרנט שלך מפני התקפות מתוחכמות הכוללות קבצי PHAR/JPEG רב-תכליתיים זדוניים בדרכים הבאות:
כאשר קובץ רב-תכליתי PHAR/JPEG מועלה ליישום האינטרנט, הוא מועבר תחילה אל MetaDefender Core בְּאֶמצָעוּת MetaDefender ICAP Server לתהליך חיטוי מקיף באמצעות שלנו Deep CDR טכנולוגיית ™. בניגוד לבודקי סוגי קבצים פשוטים, Deep CDR מנתח ביסודיות את מבנה הקובץ שהועלה, מסיר סקריפטים, פקודות מאקרו ותוכן שאינו תואם את המדיניות, ובונה מחדש את קובץ ה-JPEG כך שיכלול רק את הנתונים הדרושים לו.
תהליך זה מסיר תוכן PHAR מזיק שנוסף לאחר סמן הסיום של JPEG ( 0xFF 0xD9 ), ומבטיח שהקובץ שעבר ניקוי הוא JPEG בלבד. כתוצאה מכך, יישום האינטרנט מוגן מפני התקפות רב-תכליתיות של PHAR/JPEG; גם אם תוקף יכול לשנות את סכמת עיבוד הקבצים כדי להחדיר מעטפת PHAR, הוא לא יכול לנצל את שרת האינטרנט.

ארגונים עם תשתית אבטחת רשת מבוססת - בין אם הם משתמשים ב-WAFs (חומות אש של יישומי אינטרנט), פרוקסי או בקרי כניסה - יכולים כעת לשפר את מנגנוני ההגנה שלהם באמצעות MetaDefender ICAP Server פתרון זה יוצר ממשק בין שרתי אינטרנט קיימים לבין MetaDefender Core , יצירת נקודת בקרה שקופה עבור כל הקבצים הנכנסים. כל תוכן המנותב דרך ICAP הממשק ייסרק ויעובד לפני שהוא מגיע לשרת האינטרנט שלך, על מנת להבטיח שרק תוכן בטוח ולגיטימי ייכנס לרשת שלך ויגיע למשתמשי הקצה.

גישה זו מאפשרת לארגונים למנף את השקעות האבטחה הקיימות שלהם תוך הוספת שכבת הגנה נוספת וחזקה. ארגונים המשתמשים בבקר כניסה של NGINX יכולים לשלב MetaDefender ICAP Server עם התשתית הקיימת שלהם באמצעות תצורת פרוקסי.

OPSWAT הגישה של חורגת מעבר לגילוי איומים מסורתי. במקום פשוט לסמן קבצים חשודים, MetaDefender Core מנטרל באופן פעיל איומים פוטנציאליים, והופך קבצים מסוכנים לתוכן בטוח ושימושי. כאשר הוא משולב עם שרת האינטרנט שלך, MetaDefender ICAP Server מספק הגנה מקיפה מפני איומי יום אפס והתקפות רב-לשוניות.
מועצם על ידי פילוסופיית "אל תסמוך על קובץ. אל תסמוך על מכשיר." ™ OPSWAT פותר אתגרי לקוחות ברחבי העולם בעזרת טכנולוגיות פטנטיות בכל רמה של התשתית שלך, מאבטח את הרשתות, הנתונים והמכשירים שלך, ומונעת איומים ידועים ולא ידועים, התקפות יום אפס ותוכנות זדוניות.
