חור אבטחה בסקריפט דוגמא שPaypal מספקים

בדרך כלל אני נוטה לחשוב שבנקים ואתרים שהתעסקות עם כסף של אחרים היא הביזנס המרכזי שלהם לוקחים את האבטחה ברצינות.
על ההנחה הזו אני מבסס הרבה דברים, כמו למשל ההנחה שלי שקניה באינטרנט היא יותר בטוחה מקניה בטלפון, וזה שאיפשרתי העברת כספים מחשבון הבנק שלי בהוראה דרך האינטרנט.

באופן טבעי תפסתי גם את Paypal כאתר שלוקח אבטחה ברצינות.

החלטתי לצ'פר משתמשי פיירסטטס שתורמים ולתת כמה פיצ'רים למי שתורם בלבד.
מכיוון שאני מקבל את התרומות דרך Paypal חשבתי שזה יהיה נחמד לדאוג לאיזה תהליך אוטומטי שישלח לתורמים אימייל עם לינק להורדה של הפיצ'רים הנוספים.
פניתי לאתר של Paypal, שתומך במשהו שנקרא IPN : Instant payment notification.
בקצרה, האתר של Paypal קורא לURL שאתם מספקים לו ומעביר לו פרטים על הטרנזקציה (מי זה, כמה הוא נתן, וכו').
האתר שלכם מאמת את הפרטים מול Paypal, ומכניס אותם לבסיס הנתונים ועושה מה שאתם רוצים.

די פשוט, אבל חבל בזבוז אנרגיה שכל מי שרוצה להתממשק מול Paypal יצטרך לכתוב את זה מחדש, ולכן Paypal בחוכמתם מספקים Script generator שמייצר קוד שעושה את העבודה במספר שפות.

שמח וטוב לבב, לקחתי את סקריפט הPHP שהוא ייצר לי, והתחלתי לשחק איתו.
לא עבר יותר מדי זמן, ופתאום הבנתי שחוץ מזה שהקוד מכוער במיוחד הוא גם פרוץ לחלוטין ופגיע להתקפת SQL Injection.

[code lang="php"]
$struery = "insert into paypal_cart_info(txnid,itemnumber,itemname,os0,on0,os1,on1,quantity,invoice,custom)
values ('".$txn_id."','".$_POST[$itemnumber]."','".$_POST[$itemname]."','".$_POST[$on0]. "','".$_POST[$os0]."','".$_POST[$on1]."','".$_POST[$os1]."','".$_POST[$quantity]."','".$invoice."','".$custom."')";
$result = mysql_query($struery) or paypal_die("Cart – paypal_cart_info, Query failed:
" . mysql_error() . "
" . mysql_errno());
[/code]

SQL Injection היא התקפה שמאפשרת שינוי וקריאה של בסיס הנתונים בצורה שהמפתח לא תכנן, עוד פרטים בוויקיפדיה.

מה שזה אומר זה שכל מי שהשתמש בקוד לדוגמא שלהם בלי לשים לב לבעיה (אני מניח ש99% מהמשתמשים) יצר לעצמו בעיית אבטחה בשרת, בדיוק בנקודה הקריטית שנוגעת לכסף.

כתבתי להם הודעה בפורום המפתחים שלהם, נקווה שהם יקחו אותה ברצינות.

Facebook Comments

7 תגובות בנושא “חור אבטחה בסקריפט דוגמא שPaypal מספקים”

  1. שלום,

    ראיתי את הקוד שהם מציגים ויש שם את החלק הזה:

    // subscription specific vars

    $subscr_id = $_POST['subscr_id'];
    $subscr_date = $_POST['subscr_date'];
    $subscr_effective = $_POST['subscr_effective'];
    $period1 = $_POST['period1'];
    $period2 = $_POST['period2'];
    $period3 = $_POST['period3'];
    $amount1 = $_POST['amount1'];
    $amount2 = $_POST['amount2'];
    $amount3 = $_POST['amount3'];
    $mc_amount1 = $_POST['mc_amount1'];
    $mc_amount2 = $_POST['mc_amount2'];
    $mc_amount3 = $_POST['mcamount3'];
    $recurring = $_POST['recurring'];
    $reattempt = $_POST['reattempt'];
    $retry_at = $_POST['retry_at'];
    $recur_times = $_POST['recur_times'];
    $username = $_POST['username'];
    $password = $_POST['password'];

    בסוף יש 2 משתנים: username ו password.

    אתה יודע מה הם מכילים?!
    את השם משתמש והסיסמא של הלקוח? או של הבעל עסק?

    בשני המקרים זה בעיה..

  2. זה משהו שהם משתמשים בו רק במקרה של subscription.
    לא ברור לי מה זה בדיוק, אבל לא נראה לי שזה בעייתי במיוחד.

  3. אז אם למשל יש לי subscription באתר כולשהו, אז יש להם במסד את הסיסמא של הפאיפל שלי?!

  4. נו?! מה נגמר? יש תיקון? על מי השפיע החור?

    אל תשמור אותנו במתח! החשבונית הגיע?

    נו! הגיעה הזמן לעדכון!

  5. עירא,
    החור לא משפיע על אף אחד (חוץ אולי מעל השרתים של paypal עצמם) כי הקוד כתוב בצורה כזו שקודם המידע מאומת מול פייפל ורק אז אתה אמור לכתוב אותו לבסיס הנתונים שלך.
    הקוד עדיין חובבני ונותן דוגמא רעה ביותר, אבל החור פחות קריטי ממה שהיה נדמה במבט ראשון.
    ולא: הוא לא תוקן.

סגור לתגובות.