تهدید امنیتی عبور از احراز هویت در افزونه GiveWP
توضیحات مشکل امنیتی: عبور از احراز هویت همراه با افشای اطلاعات
افزونه: GiveWP
نسخه: 2.4.21 و قبل از آن
امتیاز CVSS: بحرانی (9.9)
CVSS بردار : CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
[gap]
چند هفته پیش ، تیم Threat Intelligence وردفنس، یک آسیب پذیری در GiveWP را پیدا کرد ، این افزونه وردپرس در بیش از 70،000 وب سایت نصب شده است. این تهدید امنیتی به کاربران غیرمجاز اجازه می دهد تا روش های تأیید اعتبار API را دور بزنند و به طور بالقوه به اطلاعات شخصی قابل شناسایی کاربر (PII) مانند نام ، آدرس ، آدرس IP و آدرس های ایمیل دسترسی پیدا کنند که نباید در دسترس عموم باشند.
تیم امنیتی وردفنس، این موضوع را در تاریخ 3 سپتامبر (12 شهریور98) به صورت خصوصی به توسعه دهنده افزونه اطلاع دادیم ، که سریعاً جواب دادند و اندکی پس از آن یک پچ را منتشر کردند. مشتریان Wordfence Premium در تاریخ 4 سپتامبر (13شهریور98) یک قانون (rule) فایروال جدید را برای محافظت در برابر سوء استفاده از این آسیب پذیری دریافت کردند. کاربران رایگان Wordfence این قانون را پس از سی روز دریافت می کنند.
این یک مسئله امنیتی با حساسیت بالا محسوب می شود و وب سایت های که افزونه GiveWP نسخه 2.5.4 یا پایین تر دارند باید بلافاصله به نسخه 2.5.5 یا بالاتر به روز شوند.
جزئیات آسیب پذیری تهدید امنیتی عبور از احراز هویت در افزونه GiveWP
GiveWP به منظور ادغام داده های اهدا (Donation) در صفحات وب و برنامه هایی مانند Zapier ، عملکرد API را در اختیار کاربران قرار می دهد. صاحبان سایت قادر به ایجاد یک کلید API منحصر به فرد به همراه یک نشانه و کلید خصوصی هستند که می تواند برای دسترسی به نقاط انتهایی محدود و دستیابی به اطلاعات اهدای عضو استفاده شود. با این حال معلوم شد که اگر حتی کلید API ایجاد نشده باشد ، هر کاربر با انتخاب کلید متا از جدول wp_usermeta و تنظیم آن به عنوان کلید تأیید اعتبار ، می تواند به نقاط انتهایی محدود دسترسی داشته باشد. به عنوان مثال ، نام مستعار یا session_tokens کلید متا (که برای همه کاربران تعریف شده است) می توانست به جای یک کلید API معتبر تهیه شود. همچنین یک نشانه احراز هویت نیز وجود دارد که برای اعتبارسنجی این درخواست API استفاده می شود ، با این حال ، برای کاربرانی که کلید API تولید نکرده اند ، رمز ورود به سیستم فقط یک هش MD5 از کلید متا است که به جای کلید API معتبر استفاده می شود. .
روش اعتبارسنجی کلید API را می توان در روش validate_quest () که در زیر مشاهده می شود یافت.
331 |
private function validate_request() { |
332 |
global $wp_query ; |
333 |
334 |
$this ->override = false; |
335 |
336 |
// Make sure we have both user and api key |
337 |
if ( ! empty ( $wp_query ->query_vars[ 'give-api' ] ) && ( $wp_query ->query_vars[ 'give-api' ] !== 'forms' || ! empty ( $wp_query ->query_vars[ 'token' ] ) ) ) { |
338 |
339 |
if ( empty ( $wp_query ->query_vars[ 'token' ] ) || empty ( $wp_query ->query_vars[ 'key' ] ) ) { |
340 |
$this ->missing_auth(); |
341 |
342 |
return false; |
343 |
} |
344 |
345 |
// Retrieve the user by public API key and ensure they exist |
346 |
if ( ! ( $user = $this ->get_user( $wp_query ->query_vars[ 'key' ] ) ) ) { |
347 |
348 |
$this ->invalid_key(); |
349 |
350 |
return false; |
351 |
352 |
} else { |
353 |
354 |
$token = urldecode( $wp_query ->query_vars[ 'token' ] ); |
355 |
$secret = $this ->get_user_secret_key( $user ); |
356 |
$public = urldecode( $wp_query ->query_vars[ 'key' ] ); |
357 |
358 |
if ( hash_equals( md5( $secret . $public ), $token ) ) { |
359 |
$this ->is_valid_request = true; |
360 |
} else { |
361 |
$this ->invalid_auth(); |
362 |
363 |
return false; |
364 |
} |
365 |
366 |
} |
367 |
} elseif ( ! empty ( $wp_query ->query_vars[ 'give-api' ] ) && $wp_query ->query_vars[ 'give-api' ] === 'forms' ) { |
368 |
$this ->is_valid_request = true; |
369 |
$wp_query ->set( 'key' , 'public' ); |
370 |
} |
371 |
} |
اول چک تأیید می کند که آیا کاربر معتبر و کلید API وجود دارد ، اگر هیچ مجموعه ای از کلیدهای API یا کلید API وجود ندارد ، به طور خودکار از پیشرفت درخواست جلوگیری می شود. اگر تنظیمات توکن و کلید را داشته باشیم ، می توانیم با استفاده از کلید عمومی API تنظیم شده ، بازیابی کاربر را انجام دهیم و اینجاست که اولین مشکل اصلی ما را پیدا می کنیم.
سپس به متد get_user () می رسیم که بر اساس کلید API ارائه شده چک را انجام می دهد. متأسفانه ، در این بررسی تأیید نمی کند که آیا این کلید توسط Give API تولید شده است یا نه ، بلکه فقط user_id را برای هر کلید متا در جدول wp_usermeta واکشی می کند ، بنابراین اگر نام مستعار یا session_tokens را به عنوان کلید متای خود وارد کنیم ، ” یک کاربر معتبر بر می گرداند.
385 |
public function get_user( $key = '' ) { |
386 |
global $wpdb , $wp_query ; |
387 |
388 |
if ( empty ( $key ) ) { |
389 |
$key = urldecode( $wp_query ->query_vars[ 'key' ] ); |
390 |
} |
391 |
392 |
if ( empty ( $key ) ) { |
393 |
return false; |
394 |
} |
395 |
396 |
$user = Give_Cache::get( md5( 'give_api_user_' . $key ), true ); |
397 |
398 |
if ( false === $user ) { |
399 |
$user = $wpdb ->get_var( $wpdb ->prepare( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s LIMIT 1" , $key ) ); |
400 |
Give_Cache::set( md5( 'give_api_user_' . $key ), $user , DAY_IN_SECONDS, true ); |
401 |
} |
402 |
403 |
if ( $user != null ) { |
404 |
$this ->user_id = $user ; |
405 |
406 |
return $user ; |
407 |
} |
408 |
409 |
return false; |
410 |
} |
بررسی بعدی تأیید “امضای” کلید API کاربر است که هش MD5 یک کلید مخفی است که با کلید API عرضه شده توأم است. هنگامی که یک کلید API برای یک کاربر معین ایجاد می شود ، کلید مخفی معمولاً تعریف می شود. برای کاربرانی که کلید API ایجاد نکرده اند ، secret key یک مقدار خالی است ، بنابراین یک امضای معتبر می تواند با استفاده از فقط مقدار MD5 کلید متا که به جای کلید API معتبر وارد شده ایم ، جعل شود.
354 |
$token = urldecode( $wp_query ->query_vars[ 'token' ] ); |
355 |
$secret = $this ->get_user_secret_key( $user ); |
356 |
$public = urldecode( $wp_query ->query_vars[ 'key' ] ); |
357 |
358 |
if ( hash_equals( md5( $secret . $public ), $token ) ) { |
359 |
$this ->is_valid_request = true; |
نگاهی به Exploit
هنگامی که کلید از هر جدول ارزش متا از جدول wp_usermeta تنظیم شده است ، و نشانه در قسمت هشدار مربوط به MD5 کلید متا انتخاب شده تنظیم شده است ، می توانید برای دسترسی به داده های اهداکننده حساس ، درخواستی را برای نقاط انتهایی محدود ایجاد کنید.
گاهشمار افشای اطلاعات
3 سپتامبر – توسعه دهنده افزونه از مسئله امنیتی مطلع شد
4 سپتامبر – قانون Firewall برای کاربران Wordfence Premium منتشر شد
20 سپتامبر – پچ منتشر شد
4 اکتبر – قانون فایروال در دسترس کاربران رایگان قرار می گیرد
جمع بندی
موردی که مشخص است آسیب پذیری در هر افزونه ای امکانپذیر است، بنابراین پیشنهاد میکنم روش های افزایش امنیت وردپرس که شامل اقدامات پیشگیرانه است را مطالعه کنید.
درضمن پیشنهاد می کنم افزونه اریجبنال و پرمیوم وردفنس (فارسی) را از اینجا دانلود کنید.
درباره اسماعیل منصوری
از سال ۱۳۸۹ با طراحی سایت با زبانهای برنامه نویسی شروع کردم. خیلی زمانبر و دردسر داشت. اما الان طراحی سایت بدون کدنویسی را در زمانی کمتر و براحتی انجام میدم. دانلود رایگان ۲ فصل اول کتاب راز طراحی سایت بدون کدنویسی
نوشتههای بیشتر از اسماعیل منصوری
دیدگاهتان را بنویسید