BinaryVision

Tag: Wordpress

פרצה חדשה בWordPress

by on אוג.11, 2009, under כללי

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

http://milw0rm.org/exploits/9410

הלוגיקה מאחורי זה:

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

הבעיה היא בשלב של האישור, ובו ניתן לאשר את קבלת הדואר,
ללא המפתח ע"י פרמטר key לא תקין (מערך במקום מחרוזת).

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


$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s", $key));
    if ( empty( $user ) )
        return new WP_Error('invalid_key', __('Invalid key'));

יחזיר (בצדק) שהוא נכון, כי כאמור השדה ריק (wpdb->prepare מתעלם מאיברים מיותרים בFormat String).
הוא יתאים את המשתמש הראשון שיש לו user_activation_key ריק, ויאפס לו את הסיסמה.
(המשתמש יגלה את זה כאשר ישלח לו דואר עם הסיסמה החדשה).
ברוב המקרים זה המנהל, במקרים אחרים איזה משתמש מסכן אחר.

התיקון שהוספתי לקוד (בקובץ wp-login.php):


function reset_password($key) {
	global $wpdb;

	if (!is_string($key)) {
		return new WP_Error('invalid_key', __('Invalid key'));
	}

אתם מוזמנים להשתמש בזה עד שיצא תיקון רישמי.
שאלות? הערות? תשאירו תגובה…

עדכון:

  • קודם כל יצא כבר תיקון, ויש גרסה 2.8.4.
  • אחרי בדיקה מהירה מתברר שזה לא מציג את הסיסמה על המסך אלא רק שולח אותה למנהל
  • מה שהופך את זה ללא כזה קריטי, אבל עדיין זה די חכם…
11 Comments :, more...

מחפש משהו?

תשתמש בטופס למטה כדי לחפש באתר: