פרצה חדשה בWordPress
מאת Fate בתאריך 11/08/09, תחת כללי
היום פורסמה ב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/08/09 בשעה 22:34
באג נחמד. מה שמצחיק זה שכולנו קלטנו ב RSS שלנו (או מ X בערוץ IRC שכל הזמן מפרסם אקספלוייטים מ milw0rm) שזו הגרסה שלנו של wordpress. מעניין שהם בעצמם עדיין לא פרסמו תיקון. (לא שראיתי לפחות).
בכל מקרה, באג מחוכם, אני אהבתי אותו וכמובן שכל הבלוגים בעולם פגיעים לזה ומעניין מאוד כמה נזק יגרם כתוצאה מהבאג הזה.
12/08/09 בשעה 1:00
יצא לי לראות את הבאג היום , אכן ניצול מתוחכם אהבתי 🙂
מה שכן לא הבנתי (מהפרסום בMILW0RM)מה היקף הנזק .
ממה שהוא כתב ומקריאה של הקוד , אפשר לעקוף את הבדיקה של המפתח שנשלח באימל . ובכך לאשר את האיפוס (ערך KEY שהוא מערך)
אז כן , הצלחנו לאפס למנהל את הסיסמא והיא נשלחה לו לאימל . מה השגנו בזה ? (חוץ מי זה שזה מציק כמובן ויקח לו זמן להבין למה הוא לא הצליח להתחבר XD )
עד שכתבת פה את החלק המעניין 🙂
הסיסמה מתאפסת, נשלחת בדואר, [b/]ומוצגת על המסך[b].
אם זה אכן כך , אז הבאג נדיר ושימושי מאוד :]
12/08/09 בשעה 1:51
קשה לי לייחס לפרצת האבטחה הזאת חשיבות יותר מדי גבוהה כיוון שהסיכון כאן למערכת הוא מזערי מאוד.
תוקף צריך לדעת מה כתובת המייל של האדמין ולפרוץ אותה על מנת לנצל את הפירצה. מצב קצת מורכב וסביר שהאדמין ישים לב במוקדם או במאוחר שהסיסמה שלו לא עובדת.
12/08/09 בשעה 6:56
אתם צודקים,
לפי מה שכתוב בMilworm נראה כאילו הסיסמה כן ניתנת להשגה.
"An attacker could exploit this vulnerability to compromise the admin
account of any wordpress/wordpress-mu <= 2.8.3"
עשיתי בדיקה מהירה ובסוף הסיסמה לא מוצגת על המסך.
היא נשלחת בדואר בלבד.
ככה שזה לא כזה קריטי, אלא אם כן יש דרך לצפות את הRandom.
12/08/09 בשעה 8:36
@Fate
הבחור כתב אחרי זה בfull-disclosure:
Errata:
"V. BUSINESS IMPACT
————————-
An attacker could exploit this vulnerability to compromise the admin account of any wordpress/wordpress-mu
"V. BUSINESS IMPACT
————————-
An attacker could exploit this vulnerability to reset the admin account of any wordpress/wordpress-mu <= 2.8.3"
12/08/09 בשעה 8:38
זה פחות קריטי, אבל זה עדיין רע! כי נניח לדוגמא שאתם ליד admin של איזה בלוג באיזה בית קפה, כנס או סתם יכולים להסניף לו את התעבורה, אם הוא משתמש בחיבור לא מוצפן למייל שלו (ראה ערך netvision-013), אתה יכול להסניף את ההסמה, לעומת הבלוג שלו שאולי מוצפן.
זה כמובן רק נסיון בכל זאת לתת קצת כח לפרצה, כי תאכלס כמו שהתברר, היא לא כ"כ חזקה.
12/08/09 בשעה 21:49
Trancer, יאפ, זה מה שבלבל את כולם…
13/08/09 בשעה 14:04
נה, לפי דעתי זה נחמד, לא יותר, אין יותר מדי מה לעשות עם זה- אם יש לך גישה לחשבון המייל של הבחור- אתה לא צריך את זה בכדי להשיג את הסיסמא.
ואם יש לך גישה להסניף את התעבורה של הבחור- פשוט תחכה שהוא יתחבר לממשק ניהול, מה שלבטח יקרה (מי שמנהל בלוג/אתר מתחבר אליו לעיתים קרובות מאוד).
בהחלט דרך נחמדה לעקיפת הבדיקה, אחלה של רעיון והכל, אבל זהו. לא יותר.
13/08/09 בשעה 17:49
cP, אם אתה מסניף והבלוג הוא ssl? יש לזה קצת שימושים יצירתיים, אבל לא יותר מזה…
14/08/09 בשעה 16:48
פירצה נחמדה ביותר..לא שימושית במיוחד. אם לפורץ יש את האימיל, הוא לא יצטרך את הבאג. אבל אם אין לו את האימייל אז הבאג לא יהיה שימושי. חמוד זה הכל.
14/08/09 בשעה 19:25
nullbyte, כמו שכבר ציינו, הפוסט הזה פורסם לפני שפורסם התיקון ל disclosure ועוד כשחשבנו (כפי שהיה כתוב ב disclosure) שאפשר לחטוף את חשבון האדמין בעזרת הפרצה הזו. אני לדוגמא הנחתי ש wp מראה לך את הססמה או לפחות מחבר אותך לסשן. אני לצערי (למזלי?) לא נוטה לשכוח את הססמאות שלי ולכן לעולם לא השתמשתי במגננון שחזור ססמה ב wp, ואני מודה, התעצלתי לוודא בנושא הזה. (במיוחד כי הדיווח נראה היה אמין).
בכל מקרה, לא נורא, עדיין באג נחמד מאוד, מבדר לראות את ה chain of events שנובע מכמה פונקציות שנועדו להקל (לדוגמה: wpdb->prepare) ובעצם מהוות שכבה אחת פחות של error checking ולכן יוצרות פרצות.
או בקיצור, למרות שבמקרה הפרצה הזו לא חמורה, עדיין יש הרבה מה ללמוד ממנה מבחינת תכנון מערכות מאובטח.