פגיעות XSS והאם אפשר למנוע אותה

בינארית

New member
פגיעות XSS והאם אפשר למנוע אותה

Xss זו פגיעות בה התוקף משתמש בjavascript כדי להשיג נתונים/מידע/הרשאות ל/על תכנים מסויימים, למשל לגנוב עוגיות של מנהל אתר, וע"י כך להתחזות לו ולהרוויח באמצעות זה הרשאות שלא היו אמורות להיות לו. השאלה שנשאלת היא האם יש דרך למנוע או למזער כנעט לחלוטין את הפגיעות הזאת? כשבניתי אתר, בדקתי עבור על קלט, כל qs, וכל עוגיה שאין בהם את המילה javascript, ואני יודעת שלפחות בתקופה שבניתי את האתר הדרך הזאת נחשבה למקובלת. הבעיה היא שלא תמיד כשמישהו כותב את המילה הזאת, javascript, הוא בהכרח מנסה לעשות בעיות אבטחה. (false positive). (אולי הוא רוצה לדבר על אבטחה, ועל נושא הפגיעות הזה?) (אגב, זה מה שקרה לי בבלוג שלי...) בכל מקרה, נודע לי שאין דרך למנוע לחלוטין את הפגיעות הזאת. אם כן, האם מישהו יכול לתת דוגמא למצב שבו אי אפשר למנוע את הנזק לחלוטין? האם לא כל הפעמים שכותבים ג'אווה סקריפט בהכרח מכילים את רצף המילים המחובר javascript? בהעיה נוספת היא שהמילה javascript יכולה להימצא כתובה בכמה אופנים, למשל: JaVAScRIpT. כמובן שגם לזה יש פתרון, פשוט הופכים את כל האותיות לאותיות קטנות לפני ביצוע ההשוואה:
string str = "JaVAScRIpT"; str.toLower(); if (str.equals("javascript")) ....​
 
השיטה הזו ממש לא מונעת XSS

יש דרכים אחרות להכניס קוד ג'אווהסקריפט לדף, לדוגמה אפשר לכתוב קוד בין טאגים של script בלי להגדיר אותו כקוד javascript. בנוסף אפשר להוסיף אירועים לטאגים רגילים של html, לדוגמה onclick או onmouseover. פירצת XSS נוספת שקיימת זה הכנסה של קוד HTML לדף, שגם מפני זה צריך להתגונן. השיטה הכי טובה להתגונן מפני כל הסוגים של XSS זה באמצעות html escaping, בכל שפת תכנות אמורה להיות פונקציה שעושה את זה. בphp הפונקציה נקראת htmlspecialchars, ואלה הפעולות שהיא עושה:
* '&' (ampersand) becomes '&' * '"' (double quote) becomes '"' when ENT_NOQUOTES is not set. * ''' (single quote) becomes ''' only when ENT_QUOTES is set. * '<' (less than) becomes '<' * '>' (greater than) becomes '>'​
ניתן כמובן די בקלות לבנות פונקציה שעושה את הפעולות האלה בכל שפה. הבעיה עם השיטה הנ"ל היא שלא ניתן לתת למשתמש לכתוב קוד HTML. במקרה שבו אנחנו רוצים לאפשר למשתמש לכתוב קוד HTML - לדוגמה במקרה של wysiwyg editor כמו tinymce, fckedit וכו' צריך להשתמש בספריית קוד שיודעת לקרוא את קוד הHTML ולהוריד רק דברים בעיתיים. בphp יש את הספריה - http://htmlpurifier.org/
 

בינארית

New member
לגבי הדוגמא

מה ההבדל בשורה הראשונה
* '&' (ampersand) becomes '&'​
ובשתי השורות האחרונות:
* '<' (less than) becomes '<' * '>' (greater than) becomes '>'​
(לא בטוחה שהבנתי מה הפונקציה משנה...)
 

Sagilevi22

New member
זה בגלל תפוז

התו & הופך לתו & amp; (בלי רווח) הרשימה המלאה מופיעה בקישור. אני מצרף גם XSS Cheat Sheet, כמו שאת רואה יש עוד הרבה שיטות להכניס XSS, כדאי תמיד לבדוק אם האתר מסתדר עם הקלט הזה.
 

N0

New member
חשוב גם לזכור

שלפעמים איך שאנחנו מטפלים בהזרקות עדיין מאפשר ליצור הזרקות יש אתרים שמשומה מוחקים חלקים שנראים בעייתים (לדעתי אם אתה כבר מוחק משהו שהמשתמש עשה ונראה לך זדוני, עדיף שתודיע לו מה בעייתי ולא תפרסם כלל את התוכן ). ככה שאם יש משפט כמו "זו הזרקה של javascript לאתר" יופיע באתר "זו הזרקה של לאתר". הבעייתיות עם זה שהודעה כזו "זו הזרקה של javajavascriptscript לאתר" בעצם תוכנס כהודעה המקורית. עם ניסוי וטעייה אפשר בקלות ליצור קוד זדוני שיעבור לשרת. לכן אם בכל זאת אתם בוחרים לפרסום תוכן ממשתמשים אחרי שהורדתם ממנו כביכול קטע זדוני (ואני לא ממש מבין למה) עדיף להחליף אתה התוכן ברווח ולא במחרוזת ריקה כדי לא לאפשר שילוב מילים כמו שהופיע קודם.
 

karnaff

New member
Another type of XSS input

Here's an example for XSS without a script tag at all <div onhover="alert('bad bad bad')">hello</div>​
 
למעלה