حدود یک هفته پیش نسخه جدید وردپرس برای جلوگیری از DDoS ارائه شد. مشکل در xmlrpc.php بود که API endpoint وردپرس محسوب میشه. برای اینکه بدونید xmlrpc.php به چه دردی می خوره میتونید این لینک رو ببینید.
در چند روز گذشته درخواست های زیادی برای این فایل روی بعضی سایت ها دیده شده. بررسی های انجام گرفته نشون می ده که این درخواست ها چیزی نبودن جز روش حدس و خطا برای یافتن نام کاربری و رمز عبور ادمین سایت.
یکی از متغییرهایی که میشه باهاش اطلاعاتی از API وردپرس دریافت کرد، wp.getUsersBlogs است که وبلاگهای یک کاربر رو برگردونه. این متغیر از نسخه ۳.۵ به بعد وردپرس در دسترسه. برای کار با این گزینه باید پارامترهای مورد نیازبه روش post به آدرس mydomain.com/xmlrpc.php ارسال بشن.
1 | <methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value> <string>user</string></value></param> <param><value><string>password</string></value></param></params></methodCall> |
خب بذارید روی یک سایت واقعی این درخواست رو بفرستیم.
دیدیم که در پارامترها، نام کاربری و پسورد به اسکریپت php ارسال شد و با توجه به اشتباه بودن اونها، خروجی خطا نشون داده شد. با faulcode برابر ۴۰۳ و پیام “نام کاربری یا رمز اشتباه است”.
در صورتیکه نام کاربری و رمز درست وارد شده باشه، خروجی چیزی شبیه تصویر یزر می شه.
چندتا مورد رو با دیدن این دو تصویر و مقایسه شون میشه فهمید.
اول اینکه تفاوت واضح و قابل تمیز در خروجی ناشی از تلاش صحیح و تلاش غلط، می تونه راهنمایی باشه که این تلاش رو به صورت یک اسکریپت کوچک نوشت و به صورت اتوماتیک تکرارش کرد تا به نتیجه رسید.
دوم اینکه می بینیم حتی با وجود کد خطا، صفحه html اصلی (بدون خطا یا به عبارتی با کد ۲۰۰) باز شده. بنابراین تشخیص این روش برای فایروالها مشکله. یکی از شیوههای تشخیص تلاش برای هک، تعداد دفعاتیه که صفحههایی با کد خطا مثل ۴۰۴ باز شدهاند.
سوم اینکه یکی از روشهای جلوگیری از حدس و خطا (Brute Force)، تغییر صفحه ورود سایته. مثلا من از این روش استفاده میکنم و صفحه لاگین با آدرس wp-login که آدرس پیشفرض وردپرسه، باز نمیشه. اما در این روش دیگه نیازی به داشتن آدرس صفحه نیست.
آمار سایت امنیتی سکوری نشون می ده که در ماه گذشته استفاده از این روش با شیب زیادی، رشد داشته.
پیشگیری
اگر تا الان این روش رو روی سایت من امتحان نکردید، الان این کار رو بکنید. متوجه میشید که با پیام خطای متفاوتی روبهرو میشید، حتی اگر نام کاربری و رمز درست رو چک کنید.
برای حل موقتی این مشکلی تا زمانی که وردپرس براش فکری نکره باید یک دستور رو به فایل توابع وردپرس اضافه بکنید. در بخش Appearance و در زیر مجموعه Theme Editor رفته و از لیست فایل قالب، فایل functions.php رو انتخاب میکنیم و این کد رو به متن اضافه می کنیم:
1 2 3 4 5 6 | add_filter( 'xmlrpc_methods', 'Remove_Unneeded_XMLRPC' ); function Remove_Unneeded_XMLRPC( $methods ) { unset( $methods['wp.getUsersBlogs'] ); return $methods; } |
پ ن: ممنون از جادی که اجازه داد از اسکرین شات سایتش استفاده کنم (تصویر اول)
منابع:
WordPress XML-RPC Brute Force Attack Vulnerability
New Brute Force Attacks Exploiting XMLRPC in WordPress
More WordPress XMLRPC Brute Force Attacks