php ואבטחה - חלק שני
TRANSCRIPT
.Copyright © 2007, Zend Technologies Inc
שחר עברון
,PHPאפליקציות ווב ואבטחהIIחלק
| Feb 7, 2008 | 2 PHPואבטחה
...בפרק הקודם
מאובטחתPHP סביבת •
התקפות הזרקה•XSSSQL InjectionShell Command InjectionCode Injection
•http://www.slideshare.net/shahar/php-233962
Sessionsאבטחת
| Feb 7, 2008 | 4 PHPואבטחה
- Session Hijackingחטיפה
של ”• י גניבה של הsession ”חטיפה - session ID”פעיל עבאמצעים שונים
ניצול של בעיית XSSושימוש ב JavaScript - לשליחתCookies
ניחוש של – Session IDלא סביר אבל אפשרי במקרים מסויימים
,Packet sniffingפריצה למחשב וכו'
כ הרבה מה לעשות נגד • אבלSession Hijacking, ”אין בדאפשר לצמצם את הסיכון
מניעה של ,XSSשימוש ב Session Ids -אקראיים
שימוש באמצעים נוספים לזיהוי ה – Session - לדוגמה referrerאוuser agent string
| Feb 7, 2008 | 5 PHPואבטחה
– Session Hijacking מניעה- חטיפה
כ הרבה מה לעשות נגד • אבלSession Hijacking, ”אין בדאפשר לצמצם את הסיכון
XSSמניעה של •
אקראיים- Session Ids שימוש ב•תנו ל PHP -לייצר לכם את הsession ID -
- Sessionשימוש באמצעים נוספים לזיהוי ה• לוגמה referrer אוuser agent string
אבל יכול לעזור, לא יעיל במיוחד
| Feb 7, 2008 | 6 PHPואבטחה
– 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("Location: http://example.com/"); } } else { $_SESSION['UA'] = $_SERVER['HTTP_USER_AGENT']; }
| Feb 7, 2008 | 7 PHPואבטחה
- Session Fixationקיבוע
י"ידוע מראש אצל המותקף עSession ID קיבוע של •- URLשליחתו ב
: לדוגמה•
• http://example.com/?PHPSESSID=1234567890
אפשר להשתלט לו עלlog in, לאחר שהמותקף מבצע •החשבון
log inעדיין ידוע לאחר ביצוע - ID מסוכן רק אם ה•
- URLבSession ID מסוכן רק כאשר אפשר לשלוח •
| Feb 7, 2008 | 8 PHPואבטחה
– 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 | 9 PHPואבטחה
- 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 | 11 PHPואבטחה
CSRF
•Cross Site Request Forgeriesלא ממש קשור לXSS -
לא התקפת הזרקה
של האתרtrust היא ניצול של , CSRF באופן בסיסי•ללא בדיקה שהבקשה באמת לגיטימית, במשתמש
המשתמש ,logged inולכן אני בוטח בו
אבל לא כל requestמהמשתמש הוא מכוון
<img src=”http://mystore.com/add_to_cart.php?pid=1234” />
אחת מבעיות האבטחה הנפוצות והקשות יותר לתיקון• ברוב המקרים קשה בכלל להבין מה זה בדיוקCSRF
| Feb 7, 2008 | 12 PHPואבטחה
- CSRFהמשך
בדרכים שונותCSRF אפשר להפעיל התקפת •בעזרת , מאותו אתר שרוצים להתקיףXSS
- Persistentקבועה •
- Non-Persistentחד פעמית •
שלתוקף יש עליו שליטה, מאתר אחר
כל עוד למשתמש יש sessionניתן להתקיף בעזרתו, פתוח
בעזרת תגים של :HTML• <img>, <link>, <meta refresh>, <script>, <iframe>...
בעזרת CSS כולל:in-line CSS• background-url, ..
בעזרת:JavaScript- POSTכולל שליחה של טפסים ב•
| Feb 7, 2008 | 13 PHPואבטחה
- CSRFמניעה
צריכה להיות(state changing) מצב -כל פעולה משנת•POST request
"כמו שהתכוון המשורר”
מצמצם את הסיכוי ל ,CSRF -אבל לא מבטל אותו
טוב גם מסיבות אחרות(.crawlers, bookmarking, etc)
: session.referer_checkפתרון מהיר ומלוכלך•אבל קל ביותר לביצוע , לא באמת מספיק טוב
מ לזהות שה- token שימוש ב• מגיע- request ”חד פעמי עמהמקום הנכון
ועובד מצויין, לא קשה לביצוע!
| Feb 7, 2008 | 14 PHPואבטחה
“פרטי"חשיפת מידע
- resourceאי אפשר להגיע ל, אם אין קישור: טעות נפוצה•מסויים
אי אפשר לנחש את ה, מה?URL -
http://example.com/invoices/customer001/3456.pdf
- URLאו תמונות פרטיות בPDF שמירה של מסמכי : לדוגמה•לא מוגן
אין - session אין דרך לוודא שהמשתמש באמת logged inכאשרהוא ניגש לתוכן סטטי
?איך מונעים•שימוש ב PHP -להגשת תוכן סטטי
שימוש בשמות קבצים שקשה מאוד לנחש
טיפים וכלים לשיפור אבטחה
| Feb 7, 2008 | 16 PHPואבטחה
?מתי- Cookies - שימוש ב
cookie- ממש לא כדאי להעביר מידע רגיש ב•המידע עובר בcleartext -
בכל , המידע עובר שוב ושובrequest
וניתן לשינוי, המידע זמין על המחשב של המשתמש
המידע חשוף לבעיות אבטחה של הbrowser -
?אז מה לעשות במקום•ולהעביר , לשמור מידע על השרת IDבמקום
session?מישהו אמר •
להשתמש בhttps -
להצפין, לא לקודד(להצפין את המידע(!
| Feb 7, 2008 | 17 PHPואבטחה
הצפנה
• PHP מספקת מספר extensionsשמטפלים בהצפנה:
mcryptסימטרית-סימטרית או א, הצפנה בשיטות שונות•
OpenSSLחתימה ווידוא זהות, להצפנה- SSL שימוש ב•
TCP הצפנה של תקשורת •
GnuPGPGPסימטרית בעזרת -חתימה דיגיטלית והצפנה א•
רצוי להשתמש כאשר צריך לאחסן או להעביר מידע רגיש•באופן מאובטח
| Feb 7, 2008 | 18 PHPואבטחה
דוגמה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 "remember me" cookie if ($_POST['remember_me'] == 'On') { $string = $_POST['username']. " " . 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 | 19 PHPואבטחה
דוגמהmcrypt - הצפנה עם
// Decryption - decode a "remember me" 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(" ", $userdata, 2); $password = substr($password, 31);
// Sign in using $username and $password... }
| Feb 7, 2008 | 20 PHPואבטחה
– Hashingהצפנה חד כיוונית
הצפנה של מידע באופן שלא ניתן לשחזר את המקור•
לדוגמה, נוח לשמירת סיסמאות•אין צורך לשחזר את הסיסמה המקורית
מספיק רק לוודא שה hash -של הססימה שהתקבלה מתאים ל- hashהשמור בבסיס הנתונים
: )md5)(, sha1)זמינות תמידhashing פונקציות •
- mhashו- hash נוספות זמינות כחלק מhashing פונקציות •
• - :Saltingהוספת ערך קבוע למחרוזת המקורית לפנימ למנוע יכולת לבצע dictionary attacks”ההצפנה ע
| Feb 7, 2008 | 21 PHPואבטחה
- Hash Saltingדוגמה
$salt = "qwdlkjsdvo94u5t908sdv4089dfbmqwre04325";
// Save password in DB $passwordHash = md5($_POST['password'] . $salt); $stmt = $pdo->prepare( "INSERT INTO user (nickname, password) VALUES (?, ?)");
$stmt->execute(array($_POST['nickname'], $passwordHash));
// Check password $passwordHash = md5($_POST['password'] . $salt); $stmt = $pdo->prepare( "SELECT id FROM user WHERE nickname = ? AND password = ?"); $res = $stmt->execute(array($_POST['nickname'], $passwordHash));
| Feb 7, 2008 | 22 PHPואבטחה
- Security by obscurityהסוואה
- resourcesשימוש בשמות לא ברורים ל• URLלממשקי ניהולhttp://www.foo.com/admin :
Session Idsופרמטרים אחרים
הסוואה של שימוש בתוכנות קוד פתוח
לא יעצור אף פורץ רציני• –לא באמת אמצעי אבטחה
”לשים את הכסף מתחת לבלטות בלי לנעול את הדלת"•
• http://www.youtube.com/watch?v=zekiZYSVdeQ
?שאלות
תודה רבה