چرا REST API وردپرس به طور پیشفرض لیست کاربران را افشا میکند و چگونه آن را امن کنیم؟
افشای کاربران از طریق REST API: یک آسیبپذیری نادیده گرفته شده
افشای لیست کاربران توسط REST API وردپرس، یکی از رایجترین آسیبپذیریهای امنیتی است که بسیاری از سایتها را در معرض حملات Brute Force و مهندسی اجتماعی قرار میدهد.
این آسیبپذیری به دلیل طراحی پیشفرض endpoint کاربران در REST API ایجاد میشود.
مهاجمان میتوانند با درخواست ساده، نام کاربری و شناسه کاربران را استخراج کنند.
خطر اصلی، تسهیل حملات Brute Force و شناسایی کاربران دارای دسترسی بالا است.
خوشبختانه با چند راهکار ساده میتوان این افشاگری را محدود یا غیرفعال کرد.
در پروژههای واقعی امنیت وردپرس، بارها دیده شده که یک endpoint ساده REST API، دروازهای برای نفوذ به کل سایت شده است. این مقاله بر پایه تجربه عملی و تحلیل فنی، به بررسی علت وجود این آسیبپذیری، خطرات آن و راههای امنسازی میپردازد.
چرا REST API وردپرس لیست کاربران را افشا میکند؟
وردپرس از نسخه ۴.۷ به بعد، REST API را به هسته خود اضافه کرد. این API بهعنوان یک رابط استاندارد برای ارتباط بین وردپرس و اپلیکیشنهای خارجی طراحی شده است. یکی از endpointهای پیشفرض، /wp-json/wp/v2/users است که لیست کاربران را برمیگرداند. این endpoint بهطور پیشفرض برای درخواستهای GET بدون احراز هویت قابل دسترسی است.
طراحی اولیه REST API بر پایه این فرض بود که اطلاعات کاربران عمومی است. اما در عمل، این اطلاعات میتواند برای مهاجمان مفید باشد. هر کاربر در وردپرس دارای یک شناسه (ID)، نام نمایشی (Display Name) و نام کاربری (Username) است. اگرچه نام کاربری بهطور مستقیم در پاسخ API نمایش داده نمیشود، اما با استفاده از شناسه کاربر میتوان نام کاربری را از طریق endpointهای دیگر استخراج کرد. برای مطالعه بیشتر درباره REST API وردپرس، REST API در وردپرس راهنمای کامل را ببینید.
این رفتار بهطور عمدی طراحی نشده، بلکه نتیجه تعادل بین سادگی و امنیت است. وردپرس بهعنوان یک سیستم مدیریت محتوا، نیاز دارد که اطلاعات پایه کاربران را برای نمایش در بخشهایی مانند نویسنده نوشتهها فراهم کند. اما همین اطلاعات میتواند در دست مهاجم، به یک نقطه شروع برای حمله تبدیل شود. برای درک بهتر معماری REST API، چرا REST API در WordPress معماری Plugin را بازتعریف کرد؟ را ببینید.
از دیدگاه فنی، endpoint کاربران در REST API از متد GET پشتیبانی میکند و پارامترهایی مانند per_page و page را میپذیرد. این یعنی مهاجم میتواند با یک درخواست ساده، لیست کامل کاربران را استخراج کند. این موضوع در سایتهایی که تعداد کاربران بالایی دارند، خطرناکتر است. برای مطالعه درباره آسیبپذیریهای رایج وب، انواع آسیبپذیریهای رایج وب (Web Vulnerabilities) کدامند؟ را ببینید.
افشای لیست کاربران، یک آسیبپذیری بحرانی نیست، اما یک در پشتی برای حملات بعدی است که بسیاری از سایتها آن را نادیده میگیرند.
چه خطراتی این افشاگری به همراه دارد؟
افشای لیست کاربران بهتنهایی منجر به هک نمیشود، اما اطلاعات ارزشمندی برای مهاجم فراهم میکند. اولین خطر، تسهیل حملات Brute Force است. مهاجم با داشتن لیست نام کاربریها، میتواند حملات خود را هدفمندتر کند. بهجای امتحان کردن ترکیبهای تصادفی، او نام کاربری معتبر را میداند و فقط باید رمز عبور را حدس بزند. برای مطالعه درباره دفاع در برابر Brute Force، چگونه حملات brute force را در وردپرس دفع کنیم؟ را ببینید.
خطر دوم، شناسایی کاربران دارای دسترسی بالا است. در وردپرس، کاربران با نقش Administrator دارای بالاترین سطح دسترسی هستند. اگر مهاجم بتواند شناسه کاربران ادمین را تشخیص دهد، میتواند حملات خود را روی آنها متمرکز کند. این موضوع بهخصوص در سایتهایی که از نام کاربری پیشفرض مانند admin استفاده میکنند، خطرناکتر است.
خطر سوم، مهندسی اجتماعی است. مهاجم با داشتن نام و نام خانوادگی کاربران، میتواند حملات فیشینگ هدفمند طراحی کند. برای مثال، ایمیلی جعلی با عنوان "بازیابی رمز عبور" ارسال کند و کاربر را به صفحهای مخرب هدایت کند. برای مطالعه درباره فیشینگ، حمله فیشینگ (Phishing) چیست و چگونه شناسایی میشود؟ را ببینید.
خطر چهارم، نقض حریم خصوصی است. در برخی کشورها، افشای اطلاعات کاربران بدون رضایت آنها نقض قوانین حریم خصوصی محسوب میشود. این موضوع میتواند به جریمههای قانونی منجر شود. برای مطالعه درباره امنیت وب، امنیت وب چیست و چه اصولی دارد؟ را ببینید.
در تجربه کاری، دیده شده که بسیاری از سایتها حتی از وجود این آسیبپذیری بیخبرند. ابزارهای اسکن امنیتی مانند WPScan این موضوع را بهعنوان یک هشدار سطح متوسط گزارش میکنند. اما در ترکیب با سایر آسیبپذیریها، میتواند به یک بحران جدی تبدیل شود. برای مطالعه درباره اسکن آسیبپذیری، چگونه آسیبپذیری سایت را پیدا کنیم؟ را ببینید.
چگونه آسیبپذیری را تشخیص دهیم؟
تشخیص این آسیبپذیری ساده است. کافی است آدرس زیر را در مرورگر خود باز کنید:
https://example.com/wp-json/wp/v2/users
اگر پاسخ JSON حاوی لیست کاربران باشد، سایت شما در معرض افشاگری است. این پاسخ شامل فیلدهایی مانند id، name، slug و link است. حتی اگر نام کاربری مستقیماً نمایش داده نشود، با استفاده از slug میتوان نام کاربری را حدس زد.
برای تشخیص خودکار، میتوانید از ابزارهایی مانند WPScan استفاده کنید. این ابزار با دستور زیر، لیست کاربران را استخراج میکند:
wpscan --url https://example.com --enumerate u
همچنین میتوانید از افزونههای امنیتی مانند Wordfence یا iThemes Security استفاده کنید که این آسیبپذیری را شناسایی و گزارش میکنند. برای مطالعه درباره CVE و ردیابی آسیبپذیریها، CVE چیست و چه نقشی در امنیت دارد؟ را ببینید.
راههای امنسازی REST API وردپرس
چندین راهکار برای محدود کردن یا غیرفعال کردن افشای لیست کاربران وجود دارد. انتخاب راهکار مناسب به نیازهای سایت و سطح دسترسی فنی شما بستگی دارد.
غیرفعال کردن endpoint کاربران
سادهترین راه، غیرفعال کردن کامل endpoint کاربران است. این کار با افزودن کد زیر به فایل functions.php قالب فرزند انجام میشود:
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P[\\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P[\\d]+)']);
}
return $endpoints;
});
این کد endpointهای مربوط به کاربران را از REST API حذف میکند. اما باید توجه داشت که برخی افزونهها یا قالبها ممکن است به این endpointها وابسته باشند. بنابراین، قبل از اعمال، سایت را در محیط Staging تست کنید. برای مطالعه درباره هوکهای وردپرس، نحوه استفاده صحیح از هوکهای وردپرس را ببینید.
محدود کردن دسترسی با احراز هویت
راهکار دیگر، محدود کردن دسترسی به endpoint کاربران با احراز هویت است. این کار با افزودن کد زیر انجام میشود:
add_filter('rest_authentication_errors', function($result) {
if (!empty($result)) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error('rest_not_logged_in', 'You are not currently logged in.', array('status' => 401));
}
return $result;
});
این کد باعث میشود که تنها کاربران وارد شده بتوانند به REST API دسترسی داشته باشند. این راهکار امنیت را افزایش میدهد، اما ممکن است برخی اپلیکیشنهای خارجی که به REST API نیاز دارند را مختل کند. برای مطالعه درباره احراز هویت، احراز هویت در API راهنمای انتخاب روش درست را ببینید.
استفاده از افزونههای امنیتی
افزونههای امنیتی مانند Wordfence، iThemes Security و Sucuri قابلیت محدود کردن REST API را دارند. برای مثال، Wordfence گزینهای به نام "Disable WordPress REST API" دارد که میتواند endpointهای غیرضروری را غیرفعال کند. همچنین افزونههای مدیریت کاربران مانند "User Role Editor" میتوانند دسترسی به REST API را بر اساس نقش کاربری محدود کنند. برای مطالعه درباره افزونههای مدیریت کاربران، انتخاب افزونه مدیریت کاربران وردپرس مناسب سایت را ببینید.
تغییر ساختار URLها
راهکار دیگر، تغییر ساختار URLهای REST API است. اگرچه این کار امنیت را بهطور کامل تضمین نمیکند، اما مهاجم را با چالش بیشتری مواجه میکند. میتوانید با افزودن کد زیر، پیشوند REST API را تغییر دهید:
add_filter('rest_url_prefix', function($prefix) {
return 'api';
});
با این تغییر، آدرس endpoint کاربران به /api/wp/v2/users تغییر میکند. این کار امنیت را افزایش میدهد، اما نباید بهعنوان تنها راهکار امنیتی در نظر گرفته شود. برای مطالعه درباره امنیت API، امنیت API در وب چگونه تامین میشود؟ راهنمای Security عملی را ببینید.
پرسشهای پرتکرار
آیا غیرفعال کردن REST API کاربران باعث اختلال در سایت میشود؟
در برخی موارد، قالبها یا افزونههایی که از REST API برای نمایش اطلاعات نویسنده استفاده میکنند ممکن است دچار مشکل شوند. بنابراین، حتماً در محیط Staging تست کنید.
آیا افزونههای امنیتی بهتنهایی کافی هستند؟
افزونههای امنیتی میتوانند کمک کنند، اما بهترین رویکرد، ترکیب چند لایه امنیتی است. غیرفعال کردن endpoint کاربران، محدود کردن دسترسی و استفاده از افزونههای امنیتی را با هم به کار بگیرید.
آیا این آسیبپذیری در وردپرس ۶ به بعد برطرف شده است؟
خیر، این رفتار همچنان در وردپرس وجود دارد و بهعنوان یک ویژگی طراحی شده است، نه یک باگ. بنابراین، امنسازی آن بر عهده مدیر سایت است.
آیا میتوان فقط بخشی از اطلاعات کاربران را محدود کرد؟
بله، میتوانید با استفاده از فیلتر rest_prepare_user فیلدهای حساس را حذف کنید. برای مثال، حذف فیلد slug که میتواند نام کاربری را افشا کند.
آیا استفاده از HTTPS کافی است؟
HTTPS ارتباط بین مرورگر و سرور را رمزنگاری میکند، اما از افشای اطلاعات از طریق REST API جلوگیری نمیکند. مهاجم همچنان میتواند با درخواست مستقیم به سرور، لیست کاربران را استخراج کند.
جدول مقایسه راهحلها
| راهحل | مزیت | معایب | مناسب برای |
|---|---|---|---|
| غیرفعال کردن endpoint | ساده و سریع | ممکن است برخی افزونهها را مختل کند | سایتهای بدون نیاز به REST API |
| محدود کردن با احراز هویت | امنیت بالا | اپلیکیشنهای خارجی را محدود میکند | سایتهای با کاربران وارد شده |
| افزونه امنیتی | مدیریت آسان | وابستگی به افزونه | همه سایتها |
| تغییر ساختار URL | افزایش امنیت مبهم | امنیت کامل نیست | سایتهای با نیاز به REST API |
توصیه بر اساس سناریو
اگر یک سایت کوچک دارید و از REST API برای اپلیکیشن خارجی استفاده نمیکنید، غیرفعال کردن endpoint کاربران سادهترین راه است. اگر سایت شما به REST API نیاز دارد، محدود کردن دسترسی با احراز هویت گزینه بهتری است. اگر از افزونههای امنیتی استفاده میکنید، تنظیمات آنها را برای محدود کردن REST API بررسی کنید. اگر به دنبال راهحل جامع هستید، ترکیب چند روش را به کار بگیرید.
در نهایت، امنیت یک فرآیند مستمر است، نه یک تنظیم یکباره. برای مطالعه بیشتر درباره امنیت وردپرس، امنیت وردپرس چیست و چرا یک روز غفلت، همهچیز را میسوزاند؟ را ببینید.
برای اطلاعات بیشتر درباره REST، میتوانید به ویکیپدیا مراجعه کنید.
تجربه خود را به اشتراک بگذارید
اگر در پروژههای وردپرس با آسیبپذیری افشای لیست کاربران مواجه شدهاید، برای ما جالب است بدانید کدام راهحل را انتخاب کردهاید و چه چالشهایی داشته است. تجربه خودتان را در دیدگاهها بنویسید؛ بهخصوص اگر راهحل دیگری پیدا کردهاید که میتواند برای خواننده بعدی مفید باشد.