PHP ואבטחה - חלק שני

2,932 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

PHP ואבטחה - חלק שני

  1. 1. ‫, אפליקציות ווב ואבטחה‬PHP II ‫חלק‬ ‫שחר עברון‬ .Copyright © 2007, Zend Technologies Inc
  2. 2. ...‫בפרק הקודם‬ ‫ מאובטחת‬PHP ‫סביבת‬ • ‫התקפות הזרקה‬ • XSS  SQL Injection  Shell Command Injection  Code Injection  http://www.slideshare.net/shahar/php-233962 • | Feb 7, 2008 ‫ ואבטחה‬PHP | 2
  3. 3. Sessions ‫אבטחת‬
  4. 4. ‫‪ - Session Hijacking‬חטיפה‬ ‫”חטיפה” של ‪ session‬פעיל ע”י גניבה של ה- ‪session ID‬‬ ‫•‬ ‫באמצעים שונים‬ ‫‪ ‬ניצול של בעיית ‪ XSS‬ושימוש ב- ‪ JavaScript‬לשליחת ‪Cookies‬‬ ‫‪ ‬ניחוש של ‪ – Session ID‬לא סביר אבל אפשרי במקרים מסויימים‬ ‫‪ ,Packet sniffing ‬פריצה למחשב וכו'‬ ‫אין בד”כ הרבה מה לעשות נגד ‪ ,Session Hijacking‬אבל‬ ‫•‬ ‫אפשר לצמצם את הסיכון‬ ‫‪ ‬מניעה של ‪ ,XSS‬שימוש ב- ‪ Session Ids‬אקראיים‬ ‫‪ ‬שימוש באמצעים נוספים לזיהוי ה- ‪ – Session‬לדוגמה ‪ referrer‬או‬ ‫‪user agent string‬‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫4 |‬
  5. 5. ‫‪ – Session Hijacking‬חטיפה - מניעה‬ ‫אין בד”כ הרבה מה לעשות נגד ‪ ,Session Hijacking‬אבל‬ ‫•‬ ‫אפשר לצמצם את הסיכון‬ ‫מניעה של ‪XSS‬‬ ‫•‬ ‫שימוש ב- ‪ Session Ids‬אקראיים‬ ‫•‬ ‫‪ ‬תנו ל- ‪ PHP‬לייצר לכם את ה- ‪session ID‬‬ ‫שימוש באמצעים נוספים לזיהוי ה- ‪Session‬‬ ‫•‬ ‫‪ ‬לוגמה ‪ referrer‬או ‪user agent string‬‬ ‫‪ ‬לא יעיל במיוחד, אבל יכול לעזור‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫5 |‬
  6. 6. ‫ – דוגמה‬Session Hijacking session_start(); if (isset($_SESSION['UA'])) { if ($_SESSION['UA'] != $_SERVER['HTTP_USER_AGENT']) { // Destroy the session $_SESSION = array(); setcookie(session_name(), '', time() - 365 * 24 * 3600); session_destroy(); // Redirect to home page header(quot;Location: http://example.com/quot;); } } else { $_SESSION['UA'] = $_SERVER['HTTP_USER_AGENT']; } | Feb 7, 2008 ‫ ואבטחה‬PHP | 6
  7. 7. ‫‪ - Session Fixation‬קיבוע‬ ‫קיבוע של ‪ Session ID‬ידוע מראש אצל המותקף עquot;י‬ ‫•‬ ‫שליחתו ב- ‪URL‬‬ ‫לדוגמה:‬ ‫•‬ ‫•‬ ‫0987654321=‪http://example.com/?PHPSESSID‬‬ ‫לאחר שהמותקף מבצע ‪ ,log in‬אפשר להשתלט לו על‬ ‫•‬ ‫החשבון‬ ‫מסוכן רק אם ה- ‪ ID‬עדיין ידוע לאחר ביצוע ‪log in‬‬ ‫•‬ ‫מסוכן רק כאשר אפשר לשלוח ‪ Session ID‬ב- ‪URL‬‬ ‫•‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫7 |‬
  8. 8. ‫ – קיבוע - מניעה‬Session Fixation URL -‫ ב‬Session ID ‫ביטול האפשרות לשליחת‬ •  session.use_only_cookies=On ‫ לא אפשרי במקרים מסויימים‬ :(!‫ ייעודית )חשוב‬PHP ‫שימוש בפונקציית‬ •  PHP 4.x: session_regenerate_id()  PHP 5.x: session_regenerate_id(true) | Feb 7, 2008 ‫ ואבטחה‬PHP | 8
  9. 9. ‫ - דוגמה‬Session Fixation session_start(); // Handle log-in form $user = User::authenticate($_POST['username'], $_POST['password'); if ($user) { $_SESSION['logged_in'] = true; $_SESSION['user_name'] = $user->getName(); $_SESSION['user_id'] = $user->getId(); // Regenerate session ID session_regenerate_id(true); } | Feb 7, 2008 ‫ ואבטחה‬PHP | 9
  10. 10. ‫שגיאות לוגיקה וארכיטקטורה‬
  11. 11. ‫‪CSRF‬‬ ‫‪Cross Site Request Forgeries‬‬ ‫•‬ ‫‪ ‬לא ממש קשור ל- ‪XSS‬‬ ‫‪ ‬לא התקפת הזרקה‬ ‫באופן בסיסי, ‪ CSRF‬היא ניצול של ‪ trust‬של האתר‬ ‫•‬ ‫במשתמש, ללא בדיקה שהבקשה באמת לגיטימית‬ ‫‪ ‬המשתמש ‪ ,logged in‬ולכן אני בוטח בו‬ ‫‪ ‬אבל לא כל ‪ request‬מהמשתמש הוא מכוון‬ ‫>/ ”4321=‪ <img src=”http://mystore.com/add_to_cart.php?pid‬‬ ‫אחת מבעיות האבטחה הנפוצות והקשות יותר לתיקון‬ ‫•‬ ‫‪ ‬ברוב המקרים קשה בכלל להבין מה זה בדיוק ‪CSRF‬‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫11 |‬
  12. 12. ‫‪ - CSRF‬המשך‬ ‫אפשר להפעיל התקפת ‪ CSRF‬בדרכים שונות‬ ‫•‬ ‫‪ ‬מאותו אתר שרוצים להתקיף, בעזרת ‪XSS‬‬ ‫• קבועה - ‪Persistent‬‬ ‫• חד פעמית - ‪Non-Persistent‬‬ ‫‪ ‬מאתר אחר, שלתוקף יש עליו שליטה‬ ‫‪ ‬כל עוד למשתמש יש ‪ session‬פתוח, ניתן להתקיף בעזרתו‬ ‫‪ ‬בעזרת תגים של ‪:HTML‬‬ ‫...>‪• <img>, <link>, <meta refresh>, <script>, <iframe‬‬ ‫‪ ‬בעזרת ‪ CSS‬כולל ‪:in-line CSS‬‬ ‫.. ,‪• background-url‬‬ ‫‪ ‬בעזרת ‪:JavaScript‬‬ ‫• כולל שליחה של טפסים ב- ‪POST‬‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫21 |‬
  13. 13. ‫‪ - CSRF‬מניעה‬ ‫כל פעולה משנת-מצב )‪ (state changing‬צריכה להיות‬ ‫•‬ ‫‪POST request‬‬ ‫‪quot; ‬כמו שהתכוון המשורר”‬ ‫‪ ‬מצמצם את הסיכוי ל- ‪ ,CSRF‬אבל לא מבטל אותו‬ ‫‪ ‬טוב גם מסיבות אחרות )‪(.crawlers, bookmarking, etc‬‬ ‫פתרון מהיר ומלוכלך: ‪session.referer_check‬‬ ‫•‬ ‫‪ ‬לא באמת מספיק טוב, אבל קל ביותר לביצוע ‬ ‫שימוש ב- ‪ token‬חד פעמי ע”מ לזהות שה- ‪ request‬מגיע‬ ‫•‬ ‫מהמקום הנכון‬ ‫‪ ‬לא קשה לביצוע, ועובד מצויין!‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫31 |‬
  14. 14. ‫חשיפת מידע quot;פרטי“‬ ‫טעות נפוצה: אם אין קישור, אי אפשר להגיע ל- ‪resource‬‬ ‫•‬ ‫מסויים‬ ‫‪ ‬מה, אי אפשר לנחש את ה- ‪?URL‬‬ ‫‪ http://example.com/invoices/customer001/3456.pdf‬‬ ‫לדוגמה: שמירה של מסמכי ‪ PDF‬או תמונות פרטיות ב- ‪URL‬‬ ‫•‬ ‫לא מוגן‬ ‫‪ ‬אין ‪ - session‬אין דרך לוודא שהמשתמש באמת ‪ logged in‬כאשר‬ ‫הוא ניגש לתוכן סטטי‬ ‫איך מונעים?‬ ‫•‬ ‫‪ ‬שימוש ב- ‪ PHP‬להגשת תוכן סטטי‬ ‫‪ ‬שימוש בשמות קבצים שקשה מאוד לנחש‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫41 |‬
  15. 15. ‫טיפים וכלים לשיפור אבטחה‬
  16. 16. ‫שימוש ב- ‪ - Cookies‬מתי?‬ ‫ממש לא כדאי להעביר מידע רגיש ב- ‪cookie‬‬ ‫•‬ ‫המידע עובר ב- ‪cleartext‬‬ ‫‪‬‬ ‫המידע עובר שוב ושוב, בכל ‪request‬‬ ‫‪‬‬ ‫המידע זמין על המחשב של המשתמש, וניתן לשינוי‬ ‫‪‬‬ ‫המידע חשוף לבעיות אבטחה של ה- ‪browser‬‬ ‫‪‬‬ ‫אז מה לעשות במקום?‬ ‫•‬ ‫‪ ‬לשמור מידע על השרת, ולהעביר ‪ ID‬במקום‬ ‫• מישהו אמר ‪?session‬‬ ‫‪ ‬להשתמש ב- ‪https‬‬ ‫‪ ‬להצפין את המידע )לא לקודד, להצפין!(‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫61 |‬
  17. 17. ‫הצפנה‬ ‫‪ PHP‬מספקת מספר ‪ extensions‬שמטפלים בהצפנה:‬ ‫•‬ ‫‪mcrypt ‬‬ ‫• הצפנה בשיטות שונות, סימטרית או א-סימטרית‬ ‫‪OpenSSL ‬‬ ‫• שימוש ב- ‪ SSL‬להצפנה, חתימה ווידוא זהות‬ ‫• הצפנה של תקשורת ‪TCP‬‬ ‫‪GnuPG ‬‬ ‫• חתימה דיגיטלית והצפנה א-סימטרית בעזרת ‪PGP‬‬ ‫רצוי להשתמש כאשר צריך לאחסן או להעביר מידע רגיש‬ ‫•‬ ‫באופן מאובטח‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫71 |‬
  18. 18. ‫ - דוגמה‬mcrypt ‫הצפנה עם‬ define('ENC_CIPHER', MCRYPT_BLOWFISH); define('ENC_MODE', MCRYPT_MODE_CFB); // Encryption - create a key $keySize = mcrypt_get_key_size(ENC_CIPHER, ENC_MODE); $key = 'this is my secret key, please dont tell it to anyone!'; $key = substr($key, 0, $keySize); // Encryption - set quot;remember mequot; cookie if ($_POST['remember_me'] == 'On') { $string = $_POST['username']. quot; quot; . md5(microtime()) . $_POST['password']; $crypted = mcrypt_encrypt(ENC_CIPHER, $key, $string, ENC_MODE); $cookie = base64_encode($crypted); setcookie('remember_me', $cookie, time() + 14 * 24 * 3600, '/'); } | Feb 7, 2008 ‫ ואבטחה‬PHP | 18
  19. 19. ‫ - דוגמה‬mcrypt ‫הצפנה עם‬ // Decryption - decode a quot;remember mequot; cookie if (! $_SESSION['logged_in'] && isset($_COOKIE['remember_me'])) { $crypted = base64_decode($_COOKIE['remember_me']); $userdata = mcrypt_decrypt(ENC_CIPHER, $key, $crypted, ENC_MODE); list($username, $password) = explode(quot; quot;, $userdata, 2); $password = substr($password, 31); // Sign in using $username and $password... } | Feb 7, 2008 ‫ ואבטחה‬PHP | 19
  20. 20. ‫‪ – Hashing‬הצפנה חד כיוונית‬ ‫הצפנה של מידע באופן שלא ניתן לשחזר את המקור‬ ‫•‬ ‫נוח לשמירת סיסמאות, לדוגמה‬ ‫•‬ ‫‪ ‬אין צורך לשחזר את הסיסמה המקורית‬ ‫‪ ‬מספיק רק לוודא שה- ‪ hash‬של הססימה שהתקבלה מתאים ל-‬ ‫‪ hash‬השמור בבסיס הנתונים‬ ‫פונקציות ‪ hashing‬זמינות תמיד: ()1‪md5)(, sha‬‬ ‫•‬ ‫פונקציות ‪ hashing‬נוספות זמינות כחלק מ- ‪ hash‬ו- ‪mhash‬‬ ‫•‬ ‫‪ - :Salting‬הוספת ערך קבוע למחרוזת המקורית לפני‬ ‫•‬ ‫ההצפנה ע”מ למנוע יכולת לבצע ‪dictionary attacks‬‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫02 |‬
  21. 21. ‫ - דוגמה‬Hash Salting $salt = quot;qwdlkjsdvo94u5t908sdv4089dfbmqwre04325quot;; // Save password in DB $passwordHash = md5($_POST['password'] . $salt); $stmt = $pdo->prepare( quot;INSERT INTO user (nickname, password) VALUES (?, ?)quot; ); $stmt->execute(array($_POST['nickname'], $passwordHash)); // Check password $passwordHash = md5($_POST['password'] . $salt); $stmt = $pdo->prepare( quot;SELECT id FROM user WHERE nickname = ? AND password = ?quot; ); $res = $stmt->execute(array($_POST['nickname'], $passwordHash)); | Feb 7, 2008 ‫ ואבטחה‬PHP | 21
  22. 22. ‫‪ - Security by obscurity‬הסוואה‬ ‫שימוש בשמות לא ברורים ל- ‪resources‬‬ ‫•‬ ‫‪ URL ‬לממשקי ניהול: ‪http://www.foo.com/admin‬‬ ‫‪ Session Ids ‬ופרמטרים אחרים‬ ‫‪ ‬הסוואה של שימוש בתוכנות קוד פתוח‬ ‫לא באמת אמצעי אבטחה – לא יעצור אף פורץ רציני‬ ‫•‬ ‫quot;לשים את הכסף מתחת לבלטות בלי לנעול את הדלת”‬ ‫•‬ ‫•‬ ‫‪http://www.youtube.com/watch?v=zekiZYSVdeQ‬‬ ‫8002 ,7 ‪| Feb‬‬ ‫‪ PHP‬ואבטחה‬ ‫22 |‬
  23. 23. ‫שאלות?‬
  24. 24. ‫תודה רבה‬

×