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 ואבטחה - חלק שני

2,956 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. ‫תודה רבה‬

×