Ninja Forms הוא תוסף בניית טפסים לוורדפרס, מהסוג שמייצר את טופס יצירת הקשר בתחתית האתר. בגרסה 3.15.3 שלו התגלתה חולשה שקיבלה 7.2 מתוך 10: טקסט שמבקר מקליד בטופס יכול להמשיך ולרוץ כקוד כשמנהל האתר פותח את ההגשה כדי לקרוא אותה.
מה החולשה?
ההגשות שמתקבלות בטופס נשמרות, ומנהל האתר קורא אותן במסך ההגשות בממשק הניהול. את תוכן השדה החופשי המסך הזה מציג בתוך תיבת טקסט, אותו ריבוע שאפשר להקליד בו כמה שורות.
תיבת טקסט בדף אינטרנט נפתחת בתגית ונסגרת בתגית, וכל מה שביניהן נחשב לתוכן. כדי שתוכן שהגיע ממשתמש יישאר תוכן, צריך לקודד את התגיות שבו לפני ההדפסה לדף, כך שהדפדפן יראה סימנים ולא הוראות. במסך ההגשות הישן של התוסף הקידוד הזה אינו מתבצע.
מכאן הניצול פשוט. מי שממלא את הטופס כותב בשדה את תגית הסגירה של תיבת הטקסט, ואחריה קוד משלו. הדפדפן של מי שפותח את ההגשה רואה את התיבה נסגרת מוקדם ומתייחס להמשך כחלק מהדף. הקוד רץ באותו הקשר שבו רץ ממשק הניהול של וורדפרס, כלומר הוא יכול לעשות דרך הדפדפן את מה שמנהל מחובר יכול לעשות. הסיווג הוא CWE-79.
נקודה אחת מבדילה את החולשה הזאת מהזרקה קלאסית: היא אינה מופעלת כשגולש מזדמן נכנס לדף באתר, אלא כשמנהל נכנס לכתובת הישירה של ההגשה. התוקף יודע מה הכתובת הזאת, כי הוא זה ששלח את ההגשה.
מי מושפע?
הרשומה נוקבת בגרסה 3.15.3 של Ninja Forms, ומפנה לקוד של אותה גרסה ושל גרסת הפיתוח. אתר שמריץ אותה ומשתמש במסך ההגשות הישן נמצא בטווח.
Ninja Forms הוא אחד מתוספי הטפסים הנפוצים בוורדפרס, וטופס יצירת קשר הוא בדיוק הרכיב שאתר עסקי קטן בישראל מתקין פעם אחת ושוכח. מה שמייחד את החולשה הזאת הוא שהיא אינה דורשת מהתוקף שום הרשאה. הוא צריך רק את מה שהאתר מציע לכל אדם, טופס פתוח למילוי.
האם מנוצלת בפועל?
החולשה אינה רשומה בקטלוג ה-KEV של סוכנות הסייבר האמריקאית CISA, הרשימה שמתעדת חולשות שנראו בשימוש אצל תוקפים. אין דיווח על ניצול, נכון לעדכון האחרון של הרשומה.
כל המקורות שמצורפים לרשומה הם קישורים לקוד עצמו במאגר התוספים: הקובץ ששומר את ההגשה, הקובץ של שדה הטקסט, והתבנית שמציגה את השדות במסך הניהול. התבנית הזאת היא המקום שבו הערך מודפס לדף, ולכן היא גם המקום שבו הקידוד חסר.
מה עושים?
במסך התוספים בממשק הניהול בדקו את הגרסה המותקנת של Ninja Forms. אם היא 3.15.3, זו הגרסה שהרשומה מתארת, ויש לעדכן לגרסה חדשה ממנה. הרשומה אינה מציינת באיזו גרסה החולשה תוקנה, ולכן העדכון צריך להיות לגרסה העדכנית שהתוסף מציע ולא למספר מסוים.
עד שהעדכון מתבצע, שווה לדעת מה הטריגר: הקוד אינו רץ כשההגשה נשמרת, אלא כשמנהל פותח אותה לקריאה. אם הגיע אליכם קישור ישיר להגשה ממקור חיצוני, אל תפתחו אותו מתוך חשבון מנהל. זו לא הגנה מלאה, כי בסופו של דבר צריך לקרוא את ההגשות, אבל היא מצמצמת את החלון.
אחרי העדכון עברו על ההגשות השמורות וחפשו שדות שמכילים תגיות HTML במקום טקסט רגיל. הגשה כזאת נשמרת כמו שהיא, והיא ממשיכה להמתין במסד הנתונים עד שמישהו יפתח אותה.