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

24
.Copyright © 2007, Zend Technologies Inc שחר עברון,PHP אפליקציות ווב ואבטחה חלק II

Upload: shahar-evron

Post on 29-Jun-2015

2.545 views

Category:

Technology


3 download

TRANSCRIPT

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

.Copyright © 2007, Zend Technologies Inc

שחר עברון

,PHPאפליקציות ווב ואבטחהIIחלק 

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

| Feb 7, 2008 | 2 PHPואבטחה

...בפרק הקודם

מאובטחתPHP סביבת •

התקפות הזרקה•XSSSQL InjectionShell Command InjectionCode Injection

•http://www.slideshare.net/shahar/php-233962

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

Sessionsאבטחת 

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

| 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

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

| Feb 7, 2008 | 5 PHPואבטחה

– Session Hijacking מניעה- חטיפה

כ הרבה מה לעשות נגד • אבלSession Hijacking, ”אין בדאפשר לצמצם את הסיכון

XSSמניעה של •

אקראיים- Session Ids שימוש ב•תנו ל PHP -לייצר לכם את הsession ID -

- Sessionשימוש באמצעים נוספים לזיהוי ה• לוגמה referrer אוuser agent string

אבל יכול לעזור, לא יעיל במיוחד

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

| 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']; }

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

| Feb 7, 2008 | 7 PHPואבטחה

- Session Fixationקיבוע

י"ידוע מראש אצל המותקף עSession ID קיבוע של •- URLשליחתו ב

: לדוגמה•

• http://example.com/?PHPSESSID=1234567890

אפשר להשתלט לו עלlog in, לאחר שהמותקף מבצע •החשבון

log inעדיין ידוע לאחר ביצוע - ID מסוכן רק אם ה•

- URLבSession ID מסוכן רק כאשר אפשר לשלוח •

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

| 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)

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

| 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); }

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

שגיאות לוגיקה וארכיטקטורה

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

| 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

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

| 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כולל שליחה של טפסים ב•

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

| Feb 7, 2008 | 13 PHPואבטחה

- CSRFמניעה

צריכה להיות(state changing) מצב -כל פעולה משנת•POST request

"כמו שהתכוון המשורר”

מצמצם את הסיכוי ל ,CSRF -אבל לא מבטל אותו

 טוב גם מסיבות אחרות(.crawlers, bookmarking, etc)

: session.referer_checkפתרון מהיר ומלוכלך•אבל קל ביותר לביצוע , לא באמת מספיק טוב

מ לזהות שה- token שימוש ב• מגיע- request ”חד פעמי עמהמקום הנכון

ועובד מצויין, לא קשה לביצוע!

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

| Feb 7, 2008 | 14 PHPואבטחה

“פרטי"חשיפת מידע 

- resourceאי אפשר להגיע ל, אם אין קישור: טעות נפוצה•מסויים

אי אפשר לנחש את ה, מה?URL -

http://example.com/invoices/customer001/3456.pdf

- URLאו תמונות פרטיות בPDF שמירה של מסמכי : לדוגמה•לא מוגן

 אין - session אין דרך לוודא שהמשתמש באמת logged inכאשרהוא ניגש לתוכן סטטי

?איך מונעים•שימוש ב PHP -להגשת תוכן סטטי

שימוש בשמות קבצים שקשה מאוד לנחש

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

טיפים וכלים לשיפור אבטחה

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

| Feb 7, 2008 | 16 PHPואבטחה

?מתי- Cookies - שימוש ב

cookie- ממש לא כדאי להעביר מידע רגיש ב•המידע עובר בcleartext -

בכל , המידע עובר שוב ושובrequest

וניתן לשינוי, המידע זמין על המחשב של המשתמש

המידע חשוף לבעיות אבטחה של הbrowser -

?אז מה לעשות במקום•ולהעביר , לשמור מידע על השרת IDבמקום

session?מישהו אמר •

להשתמש בhttps -

 להצפין, לא לקודד(להצפין את המידע(!

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

| Feb 7, 2008 | 17 PHPואבטחה

הצפנה

• PHP מספקת מספר extensionsשמטפלים בהצפנה:

mcryptסימטרית-סימטרית או א, הצפנה בשיטות שונות•

OpenSSLחתימה ווידוא זהות, להצפנה- SSL שימוש ב•

TCP הצפנה של תקשורת •

GnuPGPGPסימטרית בעזרת -חתימה דיגיטלית והצפנה א•

רצוי להשתמש כאשר צריך לאחסן או להעביר מידע רגיש•באופן מאובטח

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

| 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, '/');}

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

| 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... }

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

| Feb 7, 2008 | 20 PHPואבטחה

– Hashingהצפנה חד כיוונית

הצפנה של מידע באופן שלא ניתן לשחזר את המקור•

לדוגמה, נוח לשמירת סיסמאות•אין צורך לשחזר את הסיסמה המקורית

מספיק רק לוודא שה hash -של הססימה שהתקבלה מתאים ל- hashהשמור בבסיס הנתונים

: )md5)(, sha1)זמינות תמידhashing פונקציות •

- mhashו- hash נוספות זמינות כחלק מhashing פונקציות •

• - :Saltingהוספת ערך קבוע למחרוזת המקורית לפנימ למנוע יכולת לבצע  dictionary attacks”ההצפנה ע

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

| 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));

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

| Feb 7, 2008 | 22 PHPואבטחה

- Security by obscurityהסוואה

- resourcesשימוש בשמות לא ברורים ל• URLלממשקי ניהולhttp://www.foo.com/admin :

Session Idsופרמטרים אחרים

הסוואה של שימוש בתוכנות קוד פתוח

 לא יעצור אף פורץ רציני• –לא באמת אמצעי אבטחה 

”לשים את הכסף מתחת לבלטות בלי לנעול את הדלת"•

• http://www.youtube.com/watch?v=zekiZYSVdeQ

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

?שאלות

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

תודה רבה