- 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 |
– Session Hijackingחטיפה - מניעה
אין בד”כ הרבה מה לעשות נגד ,Session Hijackingאבל •
אפשר לצמצם את הסיכון
מניעה של XSS •
שימוש ב- Session Idsאקראיים •
תנו ל- PHPלייצר לכם את ה- session ID
שימוש באמצעים נוספים לזיהוי ה- Session •
לוגמה referrerאו user agent string
לא יעיל במיוחד, אבל יכול לעזור
8002 ,7 | Feb PHPואבטחה 5 |
– דוגמה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 ואבטחהPHP | 6
- Session Fixationקיבוע
קיבוע של Session IDידוע מראש אצל המותקף ע\"י •
שליחתו ב- URL
לדוגמה: •
• 0987654321=http://example.com/?PHPSESSID
לאחר שהמותקף מבצע ,log inאפשר להשתלט לו על •
החשבון
מסוכן רק אם ה- IDעדיין ידוע לאחר ביצוע log in •
מסוכן רק כאשר אפשר לשלוח Session IDב- URL •
8002 ,7 | Feb PHPואבטחה 7 |
– קיבוע - מניעה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
- דוגמה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
שגיאות לוגיקה וארכיטקטורה
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 |
- 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 |
- CSRFמניעה
כל פעולה משנת-מצב ) (state changingצריכה להיות •
POST request
\" כמו שהתכוון המשורר”
מצמצם את הסיכוי ל- ,CSRFאבל לא מבטל אותו
טוב גם מסיבות אחרות )(.crawlers, bookmarking, etc
פתרון מהיר ומלוכלך: session.referer_check •
לא באמת מספיק טוב, אבל קל ביותר לביצוע
שימוש ב- tokenחד פעמי ע”מ לזהות שה- requestמגיע •
מהמקום הנכון
לא קשה לביצוע, ועובד מצויין!
8002 ,7 | Feb PHPואבטחה 31 |
חשיפת מידע \"פרטי“
טעות נפוצה: אם אין קישור, אי אפשר להגיע ל- resource •
מסויים
מה, אי אפשר לנחש את ה- ?URL
http://example.com/invoices/customer001/3456.pdf
לדוגמה: שמירה של מסמכי PDFאו תמונות פרטיות ב- URL •
לא מוגן
אין - sessionאין דרך לוודא שהמשתמש באמת logged inכאשר
הוא ניגש לתוכן סטטי
איך מונעים? •
שימוש ב- PHPלהגשת תוכן סטטי
שימוש בשמות קבצים שקשה מאוד לנחש
8002 ,7 | Feb PHPואבטחה 41 |
טיפים וכלים לשיפור אבטחה
שימוש ב- - Cookiesמתי?
ממש לא כדאי להעביר מידע רגיש ב- cookie •
המידע עובר ב- cleartext
המידע עובר שוב ושוב, בכל request
המידע זמין על המחשב של המשתמש, וניתן לשינוי
המידע חשוף לבעיות אבטחה של ה- browser
אז מה לעשות במקום? •
לשמור מידע על השרת, ולהעביר IDבמקום
• מישהו אמר ?session
להשתמש ב- https
להצפין את המידע )לא לקודד, להצפין!(
8002 ,7 | Feb PHPואבטחה 61 |
הצפנה
PHPמספקת מספר extensionsשמטפלים בהצפנה: •
mcrypt
• הצפנה בשיטות שונות, סימטרית או א-סימטרית
OpenSSL
• שימוש ב- SSLלהצפנה, חתימה ווידוא זהות
• הצפנה של תקשורת TCP
GnuPG
• חתימה דיגיטלית והצפנה א-סימטרית בעזרת PGP
רצוי להשתמש כאשר צריך לאחסן או להעביר מידע רגיש •
באופן מאובטח
8002 ,7 | Feb PHPואבטחה 71 |
- דוגמה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 ואבטחהPHP | 18
- דוגמה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 ואבטחהPHP | 19
– Hashingהצפנה חד כיוונית
הצפנה של מידע באופן שלא ניתן לשחזר את המקור •
נוח לשמירת סיסמאות, לדוגמה •
אין צורך לשחזר את הסיסמה המקורית
מספיק רק לוודא שה- hashשל הססימה שהתקבלה מתאים ל-
hashהשמור בבסיס הנתונים
פונקציות hashingזמינות תמיד: ()1md5)(, sha •
פונקציות hashingנוספות זמינות כחלק מ- hashו- mhash •
- :Saltingהוספת ערך קבוע למחרוזת המקורית לפני •
ההצפנה ע”מ למנוע יכולת לבצע dictionary attacks
8002 ,7 | Feb PHPואבטחה 02 |
- דוגמה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 ואבטחהPHP | 21
- Security by obscurityהסוואה
שימוש בשמות לא ברורים ל- resources •
URL לממשקי ניהול: http://www.foo.com/admin
Session Ids ופרמטרים אחרים
הסוואה של שימוש בתוכנות קוד פתוח
לא באמת אמצעי אבטחה – לא יעצור אף פורץ רציני •
\"לשים את הכסף מתחת לבלטות בלי לנעול את הדלת” •
• http://www.youtube.com/watch?v=zekiZYSVdeQ
8002 ,7 | Feb PHPואבטחה 22 |
0 comments
Post a comment