مسابقات برنامه نویسی مسابقه برنامه نویسی Evasion xmlrpc php

30.11.2023 روترها و مودم ها

وردپرس همیشه یک ابزار داخلی برای دسترسی از راه دور به سایت شما داشته است. در واقع، گاهی اوقات لازم است به سایت خود برسید، اما رایانه شما از شما دور است. برای مدت طولانی، راه حل یک فایل به نام xmlrpc.php بود. با این حال، در سال های اخیر این فایل بیشتر به یک مشکل تبدیل شده است تا راه حل.

در زیر نگاهی دقیق تر به xmlrpc.php و چرایی ایجاد آن خواهیم انداخت. ما همچنین به مشکلات امنیتی رایجی که می تواند ایجاد کند و نحوه رفع آنها برای سایت وردپرس خود نگاه خواهیم کرد.

XML-RPC یک ویژگی وردپرس است که امکان انتقال داده ها را فراهم می کند، با HTTP به عنوان انتقال و XML برای رمزگذاری. از آنجایی که وردپرس یک سیستم بسته نیست و اغلب با سیستم های دیگر ارتباط برقرار می کند، راه حل هایی برای این مشکل پیدا شده است.

به عنوان مثال، فرض کنید می خواهید از تلفن همراه خود در وب سایت خود پست ارسال کنید. شما باید از دسترسی از راه دور ارائه شده توسط xmlrpc.php استفاده کنید.

قابلیت اصلی xmlrpc.php امکان اتصال به سایت از طریق گوشی هوشمند، پیاده سازی ترک بک و لینک بک از سایر سایت ها و برخی عملکردهای مربوط به پلاگین Jetpack است.

چرا Xmlrpc.php ایجاد شد و چگونه مورد استفاده قرار گرفت؟

پیاده سازی XML-RPC به روزهای اولیه وردپرس و حتی قبل از تبدیل شدن وردپرس به وردپرس باز می گردد.

در روزهای اولیه اینترنت، اتصالات بسیار کند بود و فرآیند ضبط و انتشار در وب بسیار دشوارتر و زمان‌برتر بود. بیشتر آنها به جای ایجاد تغییرات مستقیم از طریق مرورگر، آنها را آفلاین کردند و سپس محتوای خود را به صورت آنلاین کپی و جایگذاری کردند. و این روند با ایده آل فاصله زیادی داشت.

راه حل (در آن زمان) این بود که یک مشتری وبلاگ نویسی آفلاین ایجاد کنید که بتوانید محتوای خود را بنویسید، سپس به وبلاگ خود متصل شوید و آن را منتشر کنید. این اتصال از طریق XML-RPC انجام شد. با عملکرد اصلی XML-RPC، برنامه های کاربردی اولیه با استفاده از این اتصالات به افراد امکان دسترسی به سایت های وردپرس خود را از دستگاه های دیگر می داد.

XML-RPC امروز

در سال 2008، با نسخه 2.6 وردپرس، گزینه ای برای روشن و خاموش کردن XML-RPC وجود داشت. با این حال، با انتشار برنامه آیفون وردپرس، پشتیبانی از XML-RPC به طور پیش فرض فعال شد و گزینه ای برای غیرفعال کردن آن وجود نداشت. امروز هم همینطور است.

البته کارایی ارائه شده توسط این فایل به مرور زمان به میزان قابل توجهی کاهش یافته و حجم فایل از 83 کیلوبایت به 3 کیلوبایت کاهش یافته است و دیگر نقش قبل را ایفا نمی کند.

ویژگی های XML-RPC

با رابط برنامه نویسی برنامه کاربردی وردپرس (API)، می توان انتظار داشت که XML-RPC به طور کامل غیرفعال شود. امروز این API جدید هنوز در حال آزمایش است و فقط از طریق یک افزونه خاص قابل فعال کردن است.

اگرچه می‌توانید انتظار داشته باشید که API در آینده مستقیماً در هسته وردپرس گنجانده شود، اما نیاز به xmlrpc.php را کاملاً از بین می‌برد.

API جدید کامل نیست، اما بر خلاف xmlrpc.php، امنیت خوب و قابل اعتمادی را ارائه می دهد.

چرا Xmlrpc.php را غیرفعال کنید

بزرگترین مشکل XML-RPC امنیت است. مشکل مستقیماً به XML-RPC مربوط نمی شود، اما می توان از آن برای فعال کردن حمله به سایت شما استفاده کرد.

البته می توانید با یک رمز عبور بسیار قوی و افزونه های امنیتی وردپرس از خود محافظت کنید. اما بهترین حالت حفاظتی این است که به سادگی آن را خاموش کنید.

دو نقطه ضعف اصلی XML-RPC وجود دارد که در گذشته مورد سوء استفاده قرار گرفته است.

اولین مورد از حملات brute force برای دسترسی به سایت شما استفاده می کند. مهاجم سعی می کند با استفاده از xmlrpc.php با استفاده از ترکیب های مختلف نام کاربری و رمز عبور به سایت شما دسترسی پیدا کند. آنها می توانند به طور موثر از یک دستور برای آزمایش صدها رمز عبور مختلف استفاده کنند. این به آنها اجازه می دهد تا ابزارهای امنیتی را که به طور معمول حملات brute force را شناسایی و مسدود می کنند، دور بزنند.

دوم این است که سایت را از طریق حمله DDoS آفلاین کنید. هکرها از اعلان معکوس در وردپرس برای ارسال همزمان به هزاران سایت استفاده می کنند. این قابلیت xmlrpc.php به هکرها تقریباً بی نهایت آدرس IP برای انتشار یک حمله DDoS می دهد.

برای بررسی اینکه آیا XML-RPC روی سایت شما کار می کند، می توانید آن را با استفاده از ابزاری به نام XML-RPC Validator اجرا کنید. سایت خود را با ابزار اجرا کنید و اگر با خطا مواجه شدید، به این معنی است که از XML-RPC پشتیبانی نمی کنید.

اگر پیام موفقیت آمیزی دریافت کردید، می توانید xmlrpc.php را با استفاده از یکی از دو روش زیر متوقف کنید.

روش 1: Xmlrpc.php را با استفاده از یک افزونه غیرفعال کنید

غیرفعال کردن XML-RPC در سایت وردپرس شما بسیار آسان است.

به بخش بروید افزونه ها › افزودن جدیددر کنسول مدیریت وردپرس شما یک افزونه پیدا کنید XML-RPC را غیرفعال کنیدو آن را نصب کنید، مانند تصویر زیر است:

افزونه را فعال کنید و کارتان تمام است. این افزونه به طور خودکار کدهای لازم برای غیرفعال کردن XML-RPC را وارد می کند.

با این حال، به یاد داشته باشید که افزونه‌های نصب‌شده ممکن است از بخش‌هایی از XML-RPC استفاده کنند، و سپس غیرفعال کردن آن ممکن است باعث تداخل بین افزونه‌ها یا بخش‌های جداگانه آنها شود و آنها را از حالت کار خارج کند.

اگر می‌خواهید تنها عناصر XML-RPC را غیرفعال کنید، اما به سایر پلاگین‌ها و ویژگی‌ها اجازه دهید کار کنند، به افزونه‌هایی مانند این نگاه کنید:

  • توقف حمله XML-RPC. این افزونه تمام حملات XML-RPC را متوقف می‌کند، اما به پلاگین‌هایی مانند Jetpack و سایر ابزارها و افزونه‌های خودکار اجازه می‌دهد تا با دسترسی به فایل‌های xmlrpc.php به اجرا ادامه دهند.
  • کنترل انتشار XML-RPC. این به شما امکان می دهد کنترل را حفظ کرده و از راه دور منتشر کنید.

روش 2: Xmlrpc.php را به صورت دستی غیرفعال کنید

اگر نمی خواهید از افزونه استفاده کنید و ترجیح می دهید آن را به صورت دستی انجام دهید، این روش را دنبال کنید. تمام درخواست های xmlrpc.php ورودی را قبل از ارسال به وردپرس متوقف می کند.

فایل htaccess را باز کنید. برای یافتن این فایل ممکن است مجبور شوید «نمایش فایل‌های مخفی» را در مدیر فایل یا کلاینت FTP خود فعال کنید.

این کد را در فایل قرار دهید htaccess:

# درخواست های وردپرس xmlrpc.php را مسدود کنید دستور رد، اجازه انکار از همه اجازه از 123.123.123.123

افکار نهایی

به طور کلی، XML-RPC یک راه حل محکم برای برخی از مشکلات ناشی از انتشار از راه دور در سایت وردپرس شما بود. با این حال، در همان زمان، برخی حفره های امنیتی ظاهر شد که برای برخی از صاحبان سایت وردپرس بسیار خطرناک بود.

برای حفظ امنیت سایت خود، توصیه می شود xmlrpc.php را به طور کامل غیرفعال کنید مگر اینکه به برخی از ویژگی های مورد نیاز انتشار از راه دور و افزونه Jetpack نیاز داشته باشید. سپس می‌توانید از افزونه‌های راه‌حلی استفاده کنید که به شما امکان می‌دهد از این ویژگی‌ها در حین اصلاح حفره‌های امنیتی استفاده کنید.

با گذشت زمان، می‌توان انتظار داشت که عملکرد XML-RPC در یک API جدید وردپرس ادغام شود که از دسترسی از راه دور بدون به خطر انداختن امنیت پشتیبانی می‌کند.

آیا دسترسی به XML-RPC را از طریق یک افزونه یا به صورت دستی مسدود کرده اید؟ یا به دلیل اینکه قبلاً فعال بود مشکلات امنیتی وجود داشت؟ تجربه خود را در نظرات زیر به اشتراک بگذارید.

همه کسانی که وب سایت خود را دارند می خواهند امنیت آن را افزایش دهند، اگر نه، پس می خواهند همیشه ایمن باشد... در واقع در این مقاله به بررسی اصول و مبانی حفاظت از موتور وردپرس می پردازیم و به طور خاص به بررسی جزئیات بیشتر در فایل xmlrpc.php. هنگام تغییر یا ایجاد هر گونه تغییر در فایل ها، بک آپ گیری را فراموش نکنید. بیا شروع کنیم.

آسیب پذیری وردپرس از طریق فایل xmlrpc.php، راه حل مشکل:

بگذارید برای کسانی که نمی دانند یا متوجه هدف این فایل نیستند توضیح دهم. با کمک آن می توانید وبلاگ وردپرس خود را از طریق اپلیکیشن های مختلف مدیریت کنید. البته اکثریت رو نمی دونم ولی شخصا از این استفاده نمی کنم و بر این اساس چرا باید فرصت اضافی برای هک سایت بذارم حذفش میکنم... بالاخره این فایل کاملا آسیب پذیر با این حال، به یاد داشته باشید، شما می توانید آن را از استفاده حذف کنید، و همیشه می توانید آن را بعداً در صورت نیاز برگردانید.

ابتدا بیایید فایل را غیرفعال کنیم xmlrpc.php، حملات بسیار زیادی به سایت از طریق آن انجام می شود و این خوب نیست. طبق معمول، 2 گزینه برای انجام این کار وجود دارد، اولی با ایجاد تغییرات در فایل های .htaccess و functions.php و همچنین header.php (به نظر من صحیح ترین راه) است. و روش نصب افزونه، اما در ادامه در مورد آن بیشتر توضیح خواهیم داد. بیایید به سمت ویرایش فایل ها برویم.

در فایل functions.php درج می کنیم:

// غیرفعال کردن xmlrpc.php add_filter("xmlrpc_enabled", "__return_false"); remove_action("wp_head"، "rsd_link");

در فایل header.php حذف می کنیم:

دستور انکار، اجازه انکار از همه

علاوه بر این روش، به اصطلاح، یک روش خودکار وجود دارد که قبلاً در مورد آن صحبت کردم. ماهیت آن این است که ما یک افزونه اضافی نصب می کنیم. روش مطمئناً خوب و کاملاً ساده است، اما استفاده از آن را توصیه نمی کنم. چرا؟ خوب، ساده است، یک افزونه اضافی بار اضافی است. و چرا پلاگینی را نصب کنید که در آن، به طور کلی، با افزودن چند خط از عملکردی که به آن نیاز نداریم خلاص می شویم و سایت را کارآمدتر و آسان تر می کنیم.


پست او همچنین نحوه انجام احراز هویت مرورگر را به شرح زیر نشان می دهد:
$request = xmlrpc_encode_request("methodName" , array("methodParam" ));
$auth = base64_encode ($username . ":" . $password );
$header = (version_compare(phpversion()، "5.2.8"))
? array("Content-Type: text/xml" , "Authorization: Basic $auth" )
: "نوع محتوا: text/xml\r\nمجوز: پایه$auth " ;//
$context = stream_context_create (آرایه("http" => آرایه(
"method" => "POST" ,
"header" => $header ,
"content" => $request
)));
$وب سرویس = "http://www.example.com/rpc";
$file = file_get_contents ($webservice، false، $context);
$response = xmlrpc_decode ($file);
if (xmlrpc_is_fault($response)) (
بازگشت "xmlrpc: $response [ faultString ] ($response [ faultCode ] )" ;
) دیگر (
بازگشت $response ;
}
?>
1 - توجه ویرایشگر: این یک راه حل از "SandersWang dt php در gmail dot com" است

16 سال پیش

رشته های باینری (مجموعه با xmlrpc_set_type) به a می روند ...همانطور که انتظار دارید بلاک کنید. اما بعد از هر 80 نویسه، این تابع موجودیت XML " " را وارد می کند که یک خط جدید یونیکد است، گویی که باعث ایجاد یک خط بسته بندی می شود، که مسلما احمقانه است.

اگرچه ممکن است احمقانه باشد، اما برای برخی از سرورهای XML-RPC، مانند http://jakarta.apache.org/xmlrpc/ (nee Helma) مشکلات واقعی ایجاد می کند. از بین بردن آن موجودیت ها با چیزی شبیه به

$req = preg_replace("/ /"، ""، xmlrpc_encode_request("my.method"، $args));

در اطراف مشکل کار می کند.

11 سال پیش

لازم به ذکر است که به نظر می رسد رمزگذاری چیزی را رمزگذاری نمی کند، فقط مشخص کنید که چه چیزی در هدر XML قرار می گیرد.

هنگام استفاده از این تابع، رشته‌های UTF دو کدگذاری شده در پایگاه داده ذخیره می‌شوند، آن‌ها را به سرور apache xml-rpc می‌فرستیم و در پایگاه داده mysql ذخیره می‌کنیم. با تنظیم "escape" فقط روی "markup" و "encoding" روی "UTF-8" حل شد (فراموش نکنید که "utf-8" را در xmlrpc_decode نیز تنظیم کنید).

به نظر می‌رسد که رشته‌های رمزگذاری‌شده UTF-8 با بایت‌هایشان به‌عنوان موجودیت‌ها به جای کاراکترهایشان به‌عنوان موجودیت‌ها فرار می‌کنند.

9 سال پیش

آیا تا به حال سعی کرده اید آرایه ای مانند شکل زیر را با xmlrpc انتقال دهید؟
$var1=array(7=>14,9=>18);

آرایه خروجی کاملاً متفاوت به نظر می رسد! به این صورت خواهد بود:
$var2=array(14,18);

تنها راه حلی که پیدا کردم این است که یک فاصله به ایندکس اضافه کنم:
$var3=array(" 7"=>14," 9"=>18);

با استفاده از این روش، نتیجه درستی خواهید گرفت. ($var1)

16 سال پیش

این تابع باید توسط مشتری XML-RPC برای ایجاد یک بار XML برای درخواست XML-RPC استفاده شود.

$params = "system.methodSignature" ;
$method = "system.methodHelp" ;
$request = xmlrpc_encode_request ($method, $params);
پژواک ($درخواست)؛
?>

تولید می کند؛



system.methodHelp

system.methodSignature



آرگومان دوم نوع متغیر را تشخیص می دهد و ساختار صحیح XML-RPC را ایجاد می کند. برای جزئیات بیشتر به xmlrpc_encode() مراجعه کنید.

12 سال پیش

کلاینت ساده OO با عملکرد اضافه بار:

روش php test_helloworld به روش xmlrpc test.helloworld ترجمه شده است.

کلاس RpcClient(

خصوصی $_methods;
خصوصی $_context;
خصوصی $_url;

تابع __construct ($url، $user، $passwd) (
$auth = base64_encode(sprintf("%s:%s", $user,$passwd));
$this->_context = stream_context_create(آرایه(
"http" => آرایه(
"method" => "POST",
"header" => "Content-Type: text/xml\r\n".
"Authorization: Basic $auth" ,

)
));
$this->_url = $url;

$this->registerMethod("Test_HelloWorld");

تابع __call ($methodName، $params) (
if (array_key_exists($methodName,$this->_methods)) (
// در appelle la fonction RPC
$m = str_replace("_"، "."، $methodName);
$r = xmlrpc_encode_request($m, $params,array("verbosity"=>"newlines_only"));
$c = $this->_context;
stream_context_set_option($c,http,,,content,$r);
$f = file_get_contents($this->_url,false,$c);
$resp = xmlrpc_decode($f);
بازگشت $resp;
) دیگر (
// در appelle la fonction de l"objet
call_user_method_array($methodName, $this,$params);
}
}

تابع خصوصی registerMethod ($method) (
$this->_methods[$method] = true;
}

فناوری XML-RPC در سیستم وردپرس برای ویژگی‌های خوب مختلف مانند پینگ بک، ترک بک، مدیریت سایت از راه دور بدون ورود به پنل مدیریت و غیره استفاده می‌شود. متأسفانه، مهاجمان می توانند از آن برای انجام حملات DDoS در وب سایت ها استفاده کنند. یعنی پروژه های زیبا و جالب WP را برای خود یا سفارش ایجاد می کنید و در عین حال بدون اینکه به چیزی شک کنید می توانید بخشی از یک بات نت DDoS باشید. با اتصال ده ها و صدها هزار سایت به یکدیگر، افراد بد یک حمله قدرتمند به قربانی خود ایجاد می کنند. اگرچه در همان زمان سایت شما نیز آسیب می بیند، زیرا ... بار به میزبانی که در آن قرار دارد می رود.

شواهدی از چنین فعالیت بدی می تواند در گزارش های سرور (access.log در nginx) باشد که حاوی خطوط زیر است:

103.238.80.27 - - "POST /wp-login.php HTTP/1.0" 200 5791 "-" "-"

اما اجازه دهید به آسیب پذیری XML-RPC برگردیم. از نظر بصری، خود را در باز شدن آهسته سایت ها روی سرور شما یا ناتوانی در بارگذاری آنها نشان می دهد (خطای 502 Bad Gateway). پشتیبانی فنی میزبان FASTVPS من حدس های من را تأیید کرد و توصیه کرد:

  1. وردپرس را به آخرین نسخه به همراه افزونه ها به روز کنید. به طور کلی، اگر دنبال کنید، شاید در مورد نیاز به نصب آخرین نسخه 4.2.3 خوانده باشید. به دلیل انتقادات امنیتی (درست مانند نسخه های قبلی). به طور خلاصه، به روز رسانی خوب است.
  1. افزونه Disable XML-RPC Pingback را نصب کنید.

غیرفعال کردن XML-RPC در وردپرس

قبلاً به نظر من گزینه فعال/غیرفعال کردن XML-RPC جایی در تنظیمات سیستم بود، اما اکنون نمی توانم آن را در آنجا پیدا کنم. بنابراین، ساده ترین راه برای خلاص شدن از شر آن، استفاده از افزونه مناسب است.

Disable XML-RPC Pingback را پیدا و دانلود کنید یا آن را مستقیماً از پنل مدیریت سیستم نصب کنید. شما نیازی به پیکربندی هیچ چیز اضافی ندارید، ماژول بلافاصله شروع به کار می کند. متدهای pingback.ping و pingback.extensions.getPingbacks را از رابط XML-RPC حذف می کند. علاوه بر این، X-Pingback را از هدرهای HTTP حذف می کند.

در یکی از وبلاگ ها چند گزینه دیگر برای حذف غیرفعال کردن XML-RPC پیدا کردم.

1. XML-RPC را در قالب غیرفعال کنید.

برای انجام این کار، خط زیر را به فایل functions.php تم اضافه کنید:

دستور Deny، Allow Deny از همه

من شخصا از دو روش آخر استفاده نکردم، زیرا ... من افزونه Disable XML-RPC Pingback را وصل کردم - فکر می کنم کافی باشد. فقط برای کسانی که نصب های غیر ضروری را دوست ندارند، گزینه های جایگزین را پیشنهاد دادم.

  • پشتیبانی از ایجاد مشتری و سرور xmlrpc
  • رمزگذاری و رمزگشایی و رمزگشایی کاملاً خودکار یا کاملاً دستی از مقادیر php به xmlrpc
  • پشتیبانی از کدهای UTF8، Latin-1 و ASCII. با فعال کردن پسوند php mbstring، مجموعه کاراکترهای بیشتری نیز پشتیبانی می‌شوند.
  • پشتیبانی از فشرده سازی http از هر دو درخواست و پاسخ، کوکی ها، پروکسی ها، احراز هویت اولیه و https، ntlm auth و keepalives با پسوند php cURL
  • اعتبار سنجی اختیاری انواع پارامتر درخواست xmlrpc ورودی
  • پشتیبانی از روش های system.listMethods، system.methodHelp، system.multicall و system.getCapabilities
  • پشتیبانی از و پسوند xmlrpc
  • امکان ثبت تابع php یا متدهای کلاس موجود به عنوان وب سرویس، استخراج اطلاعات ارزش افزوده از نظرات phpdoc
  • یک دیباگر بصری مبتنی بر وب همراه با کتابخانه گنجانده شده است

الزامات

  • PHP 5.3.0 یا بالاتر. 5.5 یا بالاتر توصیه می شود
  • اگر می خواهید از SSL یا HTTP 1.1 برای برقراری ارتباط با سرورهای راه دور استفاده کنید، پسوند php "curl" مورد نیاز است.
  • پسوند php "mbstring" برای اجازه دادن به دریافت درخواست ها/پاسخ ها در مجموعه های کاراکتری غیر از ASCII، Latin-1، UTF-8 مورد نیاز است.
  • پسوند بومی php "xmlrpc" مورد نیاز نیست، اما در صورت نصب، هیچ تداخلی در عملکرد این کتابخانه وجود نخواهد داشت.

دانلود

اخبار

  • 1 جولای 2017
    نسخه های lib 4.2.0 و 3.1.0 منتشر شد.
    یادداشت های انتشار در Github در دسترس هستند
  • 20 ژانویه 2016
    نسخه lib 4.0.0 منتشر شد.
    این اولین بار است - تا کنون - که API تغییرات عمده ای را مشاهده می کند و گذشته را از بین می برد و گذار به php مدرن را آغاز می کند.
    فضاهای نام معرفی شده اند و نویسه های پیش فرض در صورت استفاده از UTF-8. پشتیبانی از mbstring و موارد دیگر اضافه شده است.
    برای لیست کامل تغییرات، به Github بروید
  • 19 آوریل 2015
    نسخه lib 3.0.1 منتشر شد.
  • 15 ژوئن 2014
    نسخه lib 3.0.0 منتشر شد.
  • 15 دسامبر 2013
    پروژه به GitHub منتقل شد

    دیباگر آنلاین xmlrpc

    یک برنامه دیباگر xmlrpc که در بالای این کتابخانه ساخته شده است، در آدرس http://gggeek.altervista.org/sw/xmlrpc/debugger/ فعال است. می توانید از دیباگر برای مثال استفاده کنید. سرور نسخه ی نمایشی SF را پرس و جو کنید، یا سرور xmlrpc شخصی خود را اشکال زدایی کنید، اگر در شبکه قابل دسترسی است.

    توسعه

    شرحوضعیت - به روز شده در 2009/07/26
    اسناد را برای همه ویژگی‌های اضافه شده از نسخه 2 به‌روزرسانی کنیدکم کم در حال پیشرفت...
    امکان انتخاب قالب بندی پیام های xml را اضافه کنیدمشابه کاری که پسوند php native xmlrpc انجام می دهد
    رفع اخطارهای صادر شده هنگام اجرا با PHP 5 در حالت STRICTممکن است قبلاً در نسخه 3.0 انجام شده باشد و php 4 compat را رها کرده باشید...
    برای بهره گیری از مدیریت استثنا و برگرداندن پاسخ های خطای xmlrpc، تابع خودکار php را به wrapper متد xmlrpc گسترش دهید.
    گسترش مولد خودکار خرد برای تبدیل خودکار توابع php به متدهای xmlrpc برای PHP<= 5.0.2 به کد AMFPHP در مورد نحوه انجام آن نگاه کنید.
    بسیاری از پیشرفت ها در نسخه 2.1
    اکنون که سرور می تواند به طور خودکار توابع php را ثبت کند، نیاز کمتری به آن وجود دارد.
    پشتیبانی بهتر از mbstring زمانی که فعال باشدباید به عنوان مثال حدس زدن سریعتر رمزگذاری مجموعه حروف
    بهبود پشتیبانی از کوکی های "نسخه 1".
    امکان استفاده به جای کدهای خطای بومی را اضافه کنید
    سازگاری PEAR: اضافه کردن مترادف برای توابع موجود با نام های مختلف در نسخه PEAR از lib
    پشتیبانی از پسوند xmlrpc را اضافه کنید
    قابلیت راه‌اندازی مجموعه کاملی از تست‌های validator1 را به دیباگر اضافه کنید
    بررسی قابلیت استفاده از WSDL برای توصیف خدمات در معرض نمایش و ترجمه به/از system.methodSignature و system.describeMethodsبرخی مشکلات در استفاده از XSD برای تعریف دقیق xmlrpc وجود دارد. Relax NG قطعاً جایگزین بهتری است، اما در ابزارهای دیگر پشتیبانی کمی برای استفاده از آن در ارتباط با یک فایل WSDL وجود دارد.
    پشتیبانی از تغییر مسیرهای http (302)
    یک پایگاه داده کوچک به sf.net اضافه کنید تا بتوانیم یک صفحه اعتبار سنجی که کاربران ورودی را ثبت می کند، مانند آنچه در سایت xmlrpc.com وجود دارد، پیاده سازی کنیم.
    قابلیت آپلود نتایج در sf.net را به مجموعه معیار اضافه کنید
    یک پسوند php بنویسید که پرکاربردترین توابع lib را تسریع کندبرای مثال ببینید adodb چگونه این کار را انجام داد
    افزایش سرعت/حافظه را با استفاده از simplexml و relaxng به جای تجزیه دستی xml آزمایش کنید

    امنیت

    سومین نقض امنیتی: اوت 2005

    این یک پاسخ بیشتر و فعالانه به دومین نقض امنیتی زیر بود. تمام استفاده از eval() حذف شده است زیرا هنوز یک سوء استفاده بالقوه بود.

    زمانی که کتابخانه در ابتدا نوشته شد، نسخه‌های php موجود در آن زمان شامل call_user_func() و همکاران نمی‌شد. بنابراین در آن محدودیت ها نوشته شد که از eval() در دو تابع فراخوانی شده توسط تجزیه کننده xml استفاده شود. با توجه به این استفاده، کلاس سرور نیز از eval() استفاده می کرد زیرا باید xml را با استفاده از همان توابع تجزیه می کرد.

    این توابع کنترل کننده و آرایه مورد استفاده برای حفظ محتوای پیام اصلی، برای ساخت مقادیر php به جای ساخت کد php برای ارزیابی، بازنویسی شده اند. این باید هرگونه پتانسیل برای اجرای کد را حذف کند.

    دومین نقض امنیتی: جولای 2005

    آسیب پذیری امنیتی که توسط جیمز برسگی از تحقیقات امنیتی GulfTech در 27 ژوئن 2005 کشف شد، سر و صدای زیادی به پا کرد. آن را به صفحه اول Salshdot رسانده است، در Netcraft، LWN و بسیاری از سایت های دیگر ذکر شده است.

    دستورالعمل های دقیق در مورد ساخت کد اکسپلویت در اینترنت منتشر شده است و بسیاری از مدیران میزبانی وب در این فکر مانده اند که بهترین طرح دفاعی چیست و خطرات واقعی آن چیست. در اینجا چند پاسخ آورده شده است.

    دامنه مشکل

    • این اشکال دو کتابخانه معروف به PEAR::XMLRPC و PHPXMLRMPC را تحت تأثیر قرار می دهد.
      بر اجرای xmlrpc که در php تعبیه شده است و در زمان کامپایل با گزینه "--with-xmlrpc" فعال می شود، تأثیری نمی گذارد (در یونیکس، معمولاً در ویندوز با تغییر خط مناسب در php.ini فعال/غیرفعال می شود. )
    • باگ (اجرای کد php تزریق شده توسط هاست های راه دور) منحصراً در فایل وجود دارد xmlrpc.incدر توزیع phpxmlrpc و RPC.phpدر توزیع گلابی
    • هر دو PEAR::XMLRPC و PHPXMLRMPC نسخه های به روز شده ای از کتابخانه را منتشر کرده اند که مشکل را برطرف می کند.
    • هر دو کتابخانه در تعداد زیادی از برنامه های php استفاده شده اند (لیست ناقص بالا را ببینید).
      از آنجایی که کل lib اساساً از 2 فایل بسیار ساده تشکیل شده است، هر کس تمایل دارد آنها را مطابق با سلیقه/نیاز خود وصله کند و هنگام توزیع برنامه خود آنها را بسته بندی کند.
      اکثر پروژه‌های پرمخاطب در انتشار نسخه‌های جدید برنامه‌های مربوطه خود بسیار سریع عمل کرده‌اند، اما زمان بیشتری طول می‌کشد تا هر کاربر سیستم خود را به‌روزرسانی کند.
      باید گفت که بسیاری از برنامه ها تا همین اواخر با نسخه های بسیار قدیمی کتابخانه phpxmlrpc ارسال می شدند. اولین باگ تزریق در سال 2001 برطرف شدبدون اینکه کسی متوجه شود (...)

      این امر متأسفانه یافتن یک راه حل آسان برای این مشکل را برای sysadmin ها بسیار دشوارتر می کند: احتمال زیادی وجود دارد که در سرورهای میزبان عمومی فایل های ذکر شده در دایرکتوری های مختلف و در نسخه های مختلف یافت شوند.

    چگونه آسیب پذیری ایجاد می شود

    • برای راه‌اندازی باگ، مهاجم باید مقداری xml خاص را در فرآیند ایجاد یک شی xmlrpcval ارزیابی کند. اشیاء Xmlrpcval زمانی ایجاد می شوند که اسکریپت سرور درخواست های xmlrpc را رمزگشایی می کند یا زمانی که برخی از اسکریپت های php به عنوان یک مشتری xmlrpc عمل می کنند و پاسخ ارسال شده توسط سرور را رمزگشایی می کنند.
      اسکریپت سرور مخصوص برنامه است و اغلب نام آن server.php است (اما هر گونه پروژه یا کاربر انتخابی امکان پذیر است) و باید شامل هر دو فایل xmlrpc.inc و xmlrpcs.inc (برای نسخه گلابی، سرور) باشد. php معادل xmlrpcs.inc است).
    • تنها گنجاندن xmlrpc.inc و xmlrpcs.inc در اسکریپت‌های php کاملاً ایمن است (afaik...) و همچنین فراخوانی مستقیم آنها از طریق درخواست‌های http، زیرا فقط تعریف توابع، متغیرها و کلاس‌ها در آن دو فایل انجام می‌شود. بدون اجرای فوری کد
    • فایل‌های server.php و diskut.php که با phpxmlrpc lib کامل توزیع می‌شوند، در واقع یک سرور xmlrpc زنده را پیاده‌سازی می‌کنند، بنابراین ممکن است در نظر داشته باشید که دسترسی به آن‌ها را مسدود کنید یا حتی بهتر آن‌ها را حذف کنید اگر آنها را در سرورهای تولیدی مستقر کردید (در بالای من ذهن من می توانم نوعی حمله را تداعی کنم که شامل یک برنامه php دوم است که از نقض درج فایل php رنج می برد تا آنها را به داخل بکشد + از اشکال شناخته شده lib سوء استفاده کند)

    وسیله حفاظت

    • تا جایی که می توانید به فرآیند وب سرور خود امتیاز کمتری برای سیستم بدهید. در یونیکس این به طور کلی شامل اجرای Apache به عنوان کاربر هیچکس و/یا در یک محیط جیل روت/کروت شده است. از آنجایی که موتور PHP تحت همان کاربر وب سرور کار می کند، این اولین خط دفاعی است: هر کد php که توسط مهاجم تزریق می شود، به عنوان کاربر دارای حداقل امتیاز روی سرور اجرا می شود، و تمام آسیب هایی که می تواند وارد کند محدود به این خواهد بود. ایجاد اختلال در خود برنامه php
    • php را در حالت امن اجرا کنید. اگر یک هاست عمومی هستید و این کار را انجام نمی دهید، به احتمال زیاد سرور شما روت شده است. این امر مانع از استفاده اسکریپت‌های php از هر تابعی می‌شود که شما آن را ناامن می‌دانید، مانند system() یا eval()
    • بلوک سخت: تمام فایل های موجود phpxmlrpc (xmlrpc.inc و xmlrpcs.inc) را پیدا کرده و آنها را (chmod 0) در سراسر سیستم غیرفعال کنید.
      البته این ممکن است مانع از کارکرد برخی از برنامه های کاربردی کاربر شود، بنابراین باید در زمان انجام آن به کاربران خود اطلاع دهید.
    • بلوک نرم: همه کپی های فایل های phpxmlrpc موجود (xmlrpc.inc و xmlrpcs.inc) را با نسخه های نسخه 1.1.1 جایگزین کنید.
      متأسفانه این روش 100٪ تضمینی برای کارکرد همه برنامه ها نیست. برخی از قسمت های داخلی اشیاء lib از نسخه 0.9 به 1.0 به 1.1 تغییر کردند (به عنوان مثال نمایش هدرهای http ذخیره شده در یک شی xmlrpcresp)، و اگر کدی که روی سرورهای خود مستقر کرده اید آنها را زیر کلاس ها قرار دهد، ممکن است با مشکل مواجه شود. xml ارسال شده از طریق سیم نیز نسبت به برخی از نسخه‌های قدیمی‌تر lib تغییر کرده است (به ویژه: نسخه 1.0.99.2 نویسه‌هایی که خارج از محدوده ASCII به‌عنوان موجودیت‌های html به اشتباه کدگذاری شده‌اند، در حالی که اکنون به عنوان موجودیت‌های مجموعه نویسه‌های xml کدگذاری می‌شوند). چند کد پاسخ خطای جدید نیز اضافه شده است. با این حال، باید 95 درصد از اجرای آن اسکریپت ایمن باشید و منتظر بنشینید تا کاربران شروع به فریاد زدن کنند که چیزی خراب است...
    • کتابخانه PHP PEAR با یک دستور یک خطی قابل ارتقا است، بنابراین واقعاً مشکل بزرگی نیست:
      گلابی XML_RPC را ارتقا دهید و بگویید که آیا ارتقا یافته است (1.3.1 یا جدیدتر مشکلی ندارد، آخرین نسخه در حال حاضر 1.3.2 است):
      لیست گلابی | grep RPC

    برخی ملاحظات اضافی

    فایل xmlrpcs.inc نیز در نسخه 1.1.1 وصله شده است تا تجربه کاربری بهتری را ارائه دهد. با جزئیات بیشتر: ارسال xml با شکل نادرست خاص به سرور باعث می شود اسکریپت php به جای بازگرداندن یک پاسخ xml مناسب، یک خطای php منتشر کند.
    به گفته برخی، این در واقع مستلزم یک "نقض امنیتی افشای مسیر" است (یعنی پیام خطای php نمایش داده شده معمولاً حاوی اطلاعات حساسی در مورد مسیرهای سیستم فایل است)، اما در صورت اجرای سیستم عامل سیستم عامل سرورهای تولیدی، هر اسکریپت PHP منفرد از همان مشکل امنیتی رنج می برد. دستورالعمل ini display_errors=روشن.
    من همچنین می دانم که مکان های زیادی در xmlrpc.inc وجود دارد که فراخوانی یک تابع با یک پارامتر غیرمنتظره باعث ایجاد اخطار یا خطای php می شود، و من قصد ندارم به این زودی برای هر تابع بررسی دقیق پارامتر را اجرا کنم - اگر برای آن هدف داشته باشید، imho، در وهله اول ممکن است در جاوا کدنویسی کنید.

    آیا این پایان دنیاست؟

    امیدوارم اینطور نباشه.
    دلیل آن این است که ده ها برنامه PHP وجود دارد که از سوء استفاده های تزریق کد رنج می برند. فقط نگاهی به مسیر امنیتی تابلوهای اعلانات بیندازید... و با این حال بسیاری از مردم هنوز فکر می کنند PHP انتخاب خوبی برای توسعه وب است.
    به یاد داشته باشید: امنیت یک فرآیند است، نه وضعیتی که می توان به آن رسید.

    اولین نقض امنیتی: سپتامبر 2001

    من این توصیه را از دن لیبی دریافت کردم. با اجازه او در اینجا تکثیر می شود. توجه داشته باشید که این اکسپلویت در نسخه های 1.01 و بالاتر از XML-RPC برای PHP ثابت شده است. -- Edd Dumbill سه شنبه 24 سپتامبر 2001 ============= حفره امنیتی PHP: سوء استفاده بالقوه XML-RPC ===================== ======================== چکیده: با استفاده از آخرین نسخه از کتابخانه Useful Inc. xml به گونه ای که کتابخانه xml-rpc را فریب دهد تا کدهای php را روی یک وب سرور اجرا کند، و با خاموش کردن حالت امن php، دستورات سیستم را اجرا کنم. یک مهاجم به راحتی می تواند از این به عنوان دروازه ای برای راه اندازی ویروس ها استفاده کند. جزئیات: من مشکل را با اصلاح اسکریپت مثال server.php همراه با توزیع xmlrpc و سپس فراخوانی آن از طریق اسکریپت client.php، همچنین بخشی از توزیع، نشان دادم. من کد سرور استاندارد را دور زدم و به سادگی پاسخ‌ها را به کلاینت بازتاب دادم. توانستم کلاینت را وادار کنم تا کد php دلخواه را اجرا کند. سپس نمونه server.php را به حالت اولیه بازگرداندم و از telnet برای ارسال یک کد اصلاح شده استفاده کردم. من همچنین توانستم کد را بر روی سرور اجرا کنم، البته نیاز به یک دستور کمی متفاوت است. از آنجایی که می‌دانستم که کتابخانه xml-rpc از eval برای ساختن ساختارهای داده‌اش از ورودی xml استفاده می‌کند، فقط باید xml ورودی را طوری ساختار داد که: الف) قبل از ارسال به eval فرار نشود. ب) این کار را انجام می‌دهد. عدم ایجاد خطای نحوی php به طور معمول، تمام داده های غیر عددی قبل از ارسال به eval توسط کتابخانه فرار می کنند. با این حال، معلوم می شود که اگر شما یک برچسب، به دنبال آن یک برچسب غیرمنتظره، مانند ، کد فرار دور زده می شود و داده های "خام" به جای آن ارزیابی می شوند. بهره برداری از مشتری: در اینجا یک پاسخ معمولی xml-rpc وجود دارد: سلام دنیا هنگامی که چنین پاسخی ارزیابی می شود، به نظر می رسد: new xmlrpcval("Hello world"، "string") در اینجا یک پاسخ xml-rpc وجود دارد که کد php را برای اکو اجرا می کند.

    سلام دنیا

    "در سمت مشتری: "، "رشته")؛ اکو "

    سلام دنیا

    "; \$waste = آرایه("
    در این مورد، رشته ای که eval"ed خواهد شد: new xmlrpcval("", "string"); echo "

    سلام دنیا

    "; $waste = array("", "string") ممکن است همه چیز بین "string")؛ و \$waste را با کد دلخواه با هر طولی جایگزین کرد. در نهایت، این کدی است که محتویات را چاپ می کند. دایرکتوری فعلی: "، "رشته")؛ اکو "

    "؛ پژواک "لس ال"؛ اکو "

    "; exit; \$waste = array("
    بهره برداری از سرور: اکسپلویت سرور تقریباً مشابه کلاینت است، با این تفاوت که سرور از دستور eval متفاوتی استفاده می کند، و بنابراین برای جلوگیری از خطاهای نحوی php، نیاز به نحو شروع و پایان کمی متفاوت دارد. در اینجا همان کد بالا وجود دارد، اما در برابر سرور کار می کند. system.listMethods "، "رشته"))؛ اکو "

    اگر فهرست فهرستی را مشاهده کردید، من فقط php و کد سیستم را از طریق xml-rpc اجرا کردم.

    "; echo "اکنون سعی می کنم با استفاده از ls ​​-al:\n فهرست دایرکتوری را ارائه کنم "؛ پژواک "لس ال"؛ اکو ""؛ echo "من به راحتی می توانستم rm -rf را فراخوانی کنم، یا برنامه ای را روی دیسک بنویسم و ​​آن را اجرا کنم (مثلاً یک ویروس) یا برخی از فایل ها را بخوانم. روز خوبی داشته باشید.

    "؛ خروج؛ $waste = آرایه(آرایه("
    ناحیه مشکل: در xmlrpc.inc، تابعی به نام xmlrpc_cd() وجود دارد که توسط تجزیه کننده xml برای مدیریت داده های کاراکتر فراخوانی می شود. تابع xmlrpc_cd($parser, $data) (جهانی $_xh, $xmlrpc_backslash, $xmlrpc_twoslash; //if (ereg("^[\n\r \t]+$", $data)) برگرداند؛ // چاپ " افزودن [$(داده)]\n"؛ اگر ($_xh[$parser]["lv"]==1) ($_xh[$parser]["qt"]=1؛ $_xh[$parser][ "lv"]=2; $، str_replace("""، "\""، str_replace(chr(92)،$xmlrpc_backslash، $data))); ) other $_xh[$parser]["ac"].=$data; ) آخرین مورد دیگری است که باعث می شود داده ها بدون فرار اضافه شوند. داشتن این بسیار خطرناک است. به نظر می رسد که این مورد دیگر برای داده های عددی در نظر گرفته شده است، و برای تنظیم و تنظیم متغیر "qt" (نقل قول) که فرار را روشن و خاموش می کند، زحمت زیادی کشیده می شود. با این حال، فوراً برای من مشخص نیست که چرا داده های عددی نباید به طور مشابه حذف شوند، و if/else حذف شوند، به طوری که شانس این نوع سوءاستفاده صفر باشد.