פריצה לאתר ? פרצו לאתר ? כיצד להגן על האתר מניסיונות פריצה והתקפות מסוג sql injections , סקריפטים זדוניים וכו'.
מבוא
כספקי שירות אירוח אתרים, שרתים ומערכות, אנו עושים את המיטב שאפשר על מנת להגן על השרתים בפני פריצות. ה"מיטב" הזה הוא לא פשוט ומורכב מהרבה עבודה שוטפת וציוד יקר.
אלו אשר ירצו לפרוץ לשרתים יתקלו בחומות הגנה ושרתים מוקשחים שימנעו מהם לעשות כן, מאידך אין לנו יכולת להתערב בקוד שנכתב ע"י תוכניתנים המאכסנים את אתריהם אצלנו. ולעיתים חוסר תשומת הלב ל"הקשחת" הקוד מפני פריצות יכולה לאפשר לפורץ לבצע נזק לאתר המסויים אשר הקוד שלו "רעוע" מבחינה אבטחתית.
מאמר זה פונה לבוני האתרים ודורש ידע תכנותי קל והבנה כיצד האתרים עובדים מאחורי הקלעים והוא יסקור בצורה קלילה את המנגנון שמפעיל את האתרים, פרצות אפשריות ודרכים להתמודד עימם.
איך בעצם שרת האינטרנט עובד (IIS או APACHE)
כאשר פונים לכתובת מסויימת המריצה דף ASP לדוגמה, התוכנה שנקראת IIS ניגשת לקובץ הרלוונטי במערכת ההפעלה באמצעות משתמש המוגדר ברמת מערכת ההפעלה (למשתמש זה יש הרשאות לקריאה וכתיבה בכל ספריות האתר או האתרים הנמצאים באותו חשבון) וקוראת אותו לזיכרון, לאחר מכן מתבצע תהליך של עיבוד וביצוע הפקודות במוגדרות שם. בסוף התהליך מתחולל קוד HTML וזה נשלח לדפדפן של המשתמש. (התהליך זהה גם ב APACHE)
ההרשאות שיש לכם ליצור קבצים באופן אוטומטי באמצעות הקוד באתר (או למחוק קבצים וכו') מתאפשרות דרך המשתמש (שחבוי מעיני כל) והוא זה שמבצע את כל הדברים ברקע בצורה שקופה.
הערה: רק למען הסר ספק, לכל חשבון המכיל מספר אתרים בממשק הניהול שלנו יש משתמש משלו ואין זליגת הרשאות מחשבון א' לחשבון ב'.
נניח שבאתר שלנו יש יכולת למשתמשים להעלות תמונות לתוך תיקייה בשם upload. אך התוכניתן שכתב את האתר לא בודק מה הסיומת של הקבצים המועלים לאתר.
שימוש לגיטימי באתר יאפשר למשתמש רגיל להעלות תמונה לאתר שתהא בקישור http://www.evolution.co.il/images/logo.gif
פורץ יוכל להשתמש באותו מנגנון ולהעלות קובץ asp או php לאתר ובו קוד שקורא את קבצי הקוד שבאתר ושולח לו אותם (או מוחק או משנה את התוכן שלהם). לאחר שהוא כתב את הקוד והעלאה אותו הוא יוכל להריץ אותו ע"י גישה לכתובת/images/mycode.asp וכך להשיג שליטה על התכנים באתר.
המלצה: אם יש לכם באתר מנגנון לעלאת קבצים בדקו ואפשרו העלאת קבצים רק מסוג מסויים. אם אתם משתמשים בקוד פתוח או באובייקט חיצוני כדוגמת עורכי טקסט משוכללים וודאו שלא ניתן לגשת למנגנון העלאת הקבצים שלהם למי שאינו מורשה ושהם לא מאפשרים העלאת קבצי קוד.
SQL Injection
Sql Injection זהו תהליך פריצה אשר בו הפורץ מעביר פקודות זדוניות באמצעות פרמטרים לגיטימים שעוברים לדפים ובסופו של דבר מגיע לשרת SQL כלשהו ומורצות שם.
הדרך הכי טובה להסביר זאת תהא באמצעות דוגמאות (וגם הפעם ברשותכם אתן את הדוגמאות בצורת ASP)
נניח שיש לי דף שמקבל פרמטר של קוד כתבה, ניגש לdatabase ושולף אותה. לדף נקרא article.asp והוא יקבל פרמטר שנקרא id. צורה הגישה לדף תהא:
domain/article.asp?id=1
הקוד של הדף יראה כך:
Dim oConn
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open const_connection_string
Dim rs
set rs =oConn.Execute ("select * from articles where id=" & request("id"))
…
…
בעצם הפרמטר id מועבר ונוצרת השאילתה:
select * from articles where id=1
אך, פורץ יוכל לבצע את זממו אם יעביר פרמטרים שהתוכניתן לא חשב עליהם. לדוגמא מחיקת הטבלה, ע"י פניה לכתובת הבאה:
domain/article.asp?id=1;drop%20table%20articles
(הסימן ; אומר ל SQL שהפקודה נגמרה ומתחילה פקודה חדשה. הסימן %20 מתורגם לרווח ע"י הIIS או ה APACHE)
ואז מה שיקרה הוא שירוצו ב SQL 2 פקודות:
Select * from articles where id=1
Drop table articles
דוגמא נוספת, נניח שיש מסך כניסה למנהל האתר בו הוא מתבקש להזין שם משתמש וסיסמה. הנתונים הנ"ל מועברים לדף ASP שבודק האם המשתמש אכן הזין שם משתמש וסיסמה קבילים:
Dim oConn
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open const_connection_string
Dim rs
set rs =oConn.Execute ("select * from users where username=' " & request("username ") &" ' and password=' "& request("password") &" ' ")
…
…
נוכל לתמיד להיכנס אם נרשום את הדבר הבא:
website.com/login.asp?username=test&password=' or 'aa'='aa
מה שיגרום להיווצרות ה SQL הבא (שתמיד יקבל תוצאות)
Select * from users where username='test' and password='' or 'aa'='aa'
ובגלל שהתנאי של aa=aa יהיה תמיד נכון תמיד נקבל תוצאות ונוכל להיכנס כמנהלים.
דוגמאות נוספות ניתן לראות בקישור: http://msdn.microsoft.com/en-us/library/ms161953.aspx
המלצות: כיצד אם כך להתגונן בפני סוג כזה של פריצה
1. לבדוק את הקלטים המגיעים מן המשתמש. אם יש ערך מספרי יש לוודא שהוא אכן מספרי בלבד. אם יש ערך של מחרוזת לוודא שאין בו את סימן הגרש, ואם יש בו גרש להחליף לפעמיים גרש (לא גרשיים אלא גרש ושוב גרש).
2. להשתדל לא לכתוב שאילתות בקוד אלא באמצעות STORED PROCEDURE ולהעביר את הנתונים באמצעות parameters.
שימו לב, פרמטרים המועברים ל SQL מועברים לא רק באמצעות פרמטרים, לפעמים אנחנו מעבירים אותם באמצעות cookies ועוד. תמיד יש לבצע בדיקת תקינות לקלט שהמשתמש מעביר אלינו!
טלאי
למען גילוי נאות, אני קצת חושש מלפרסם את החלק הזה. יש פה קטע קוד שיאפשר "הגנה" זמנית על האתר מפני פירצות. הוא לא מטפל בבעיה ויכול ליצור בעיות אחרות. ולעיתים ברגע שיש פיתרון זמני הוא הופך לקבוע.
ולכן במידה והאתר שלכם תחת מתקפה ואתם זקוקים לפיתרון מיידי ניתן להשתמש בו, אך אנא אל תזניחו את הפירצות שבאתר שלכם וטפלו בהן.
להלן הקישור לקוד http://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx
מערכות מוכנות – טיפים חשובים
Joomla
הוצאת הקובץ configuration.php מספריה נגישה דרך ה-web.
הוצאת כל הספריות בעלות הרשאות כתיבה(תמונות וכו') גם כן נמצאות במיקום לא נגיש דרך הדפדפן.
לשמור על הרשאות 755 לספריות ו-644 לקבצים.
register globals = off
לבדוק עדכוני אבטחה בעיקר של 3rd party extensions.
PHPBB
יש לקרוא את הקישור: http://www.webmasterworld.com/forum103/274.htm
לסיכום
שמירה על הגנת האתרים שלכם מתבצעת ע"י אנשי ה system שלנו המגנים על השרתים ובפני התקפות המנסות למצוא פרצות אבטחה במערכת ההפעלה.
כל שנותר לכם לעשות זה לוודא שאכן גם ברמת הקוד אתם מכוסים, לא מדובר בעבודה קשה אלא רק להיות צמודים להנחיות שפרוסות במסמך זה.
בהצלחה לכולם