مسابقات البرمجة. مسابقة البرمجة التهرب xmlrpc php

30.11.2023 أجهزة التوجيه وأجهزة المودم

يحتوي WordPress دائمًا على أداة مدمجة للوصول إلى موقعك عن بعد. في الواقع، في بعض الأحيان تحتاج إلى الوصول إلى موقعك، ولكن جهاز الكمبيوتر الخاص بك بعيد عنك. لفترة طويلة، كان الحل هو ملف يسمى xmlrpc.php. لكن في السنوات الأخيرة أصبح هذا الملف مشكلة أكثر منه حلاً.

فيما يلي سنلقي نظرة فاحصة على ملف xmlrpc.php وسبب إنشائه. سنلقي نظرة أيضًا على مشكلات الأمان الشائعة التي يمكن أن تسببها وكيفية إصلاحها لموقع WordPress الخاص بك.

XML-RPC هي إحدى ميزات WordPress التي تسمح بنقل البيانات، حيث يعمل HTTP كوسيلة نقل وXML للتشفير. وبما أن WordPress ليس نظاماً مغلقاً وغالباً ما يتواصل مع الأنظمة الأخرى، فقد تم إيجاد حلول لهذه المشكلة.

على سبيل المثال، لنفترض أنك تريد النشر على موقع الويب الخاص بك من هاتفك المحمول. تحتاج إلى استخدام الوصول عن بعد الذي يوفره xmlrpc.php.

الوظيفة الرئيسية لـ xmlrpc.php هي القدرة على الاتصال بالموقع من هاتف ذكي، وتنفيذ عمليات التتبع والارتباطات من مواقع أخرى، وبعض الوظائف المتعلقة بالمكون الإضافي Jetpack.

لماذا تم إنشاء Xmlrpc.php وكيف تم استخدامه؟

يعود تطبيق XML-RPC إلى الأيام الأولى لـ WordPress وحتى قبل أن يصبح WordPress WordPress.

في الأيام الأولى للإنترنت، كانت الاتصالات بطيئة جدًا وكانت عملية التسجيل والنشر على الويب أكثر صعوبة وتستغرق وقتًا طويلاً. بدلاً من إجراء التغييرات مباشرة من خلال المتصفح، قام معظمهم بإجرائها دون الاتصال بالإنترنت ثم نسخ محتواها ولصقه عبر الإنترنت. وكانت هذه العملية بعيدة عن المثالية.

كان الحل (في ذلك الوقت) هو إنشاء عميل تدوين غير متصل بالإنترنت حيث يمكنك إنشاء المحتوى الخاص بك، ثم الاتصال بمدونتك ونشره. تم إجراء هذا الاتصال عبر XML-RPC. باستخدام وظائف XML-RPC الأساسية، أعطت التطبيقات المبكرة التي تستخدم هذه الاتصالات الأشخاص القدرة على الوصول إلى مواقع WordPress الخاصة بهم من أجهزة أخرى.

XML-RPC اليوم

في عام 2008، مع الإصدار 2.6 من WordPress، تم تقديم خيار لتمكين أو تعطيل XML-RPC. ومع ذلك، مع إصدار تطبيق WordPress iPhone، تم تمكين دعم XML-RPC افتراضيًا ولم يكن هناك خيار لتعطيله. ولا يزال الأمر كذلك اليوم.

بالطبع، انخفضت الوظائف التي يوفرها هذا الملف بشكل ملحوظ بمرور الوقت، وانخفض حجم الملف من 83 كيلو بايت إلى 3 كيلو بايت، ولم يعد يلعب هذا الدور كما كان من قبل.

خصائص XML-RPC

مع واجهة برمجة تطبيقات WordPress (API) الجديدة، يمكننا أن نتوقع تعطيل XML-RPC تمامًا. واليوم لا تزال واجهة برمجة التطبيقات الجديدة هذه قيد الاختبار ولا يمكن تمكينها إلا عبر مكون إضافي خاص.

على الرغم من أنه يمكنك أن تتوقع تضمين واجهة برمجة التطبيقات (API) مباشرةً في قلب WordPress في المستقبل، مما يلغي الحاجة إلى xmlrpc.php تمامًا.

واجهة برمجة التطبيقات الجديدة ليست مثالية، ولكنها توفر أمانًا جيدًا وموثوقًا، على عكس ملف xmlrpc.php.

لماذا تعطيل Xmlrpc.php

أكبر مشكلة في XML-RPC هي الأمان. لا تتعلق المشكلة بشكل مباشر بـ XML-RPC، ولكن يمكن استخدامها لتمكين الهجوم على موقعك.

بالطبع، يمكنك حماية نفسك باستخدام كلمة مرور قوية جدًا ومكونات أمان WordPress الإضافية. لكن أفضل وضع للحماية هو إيقاف تشغيله ببساطة.

هناك نقطتا ضعف رئيسيتان في XML-RPC تم استغلالهما في الماضي.

يستخدم الأول هجمات القوة الغاشمة للوصول إلى موقعك. سيحاول المهاجم الوصول إلى موقعك باستخدام xmlrpc.php من خلال تجربة مجموعات مختلفة من أسماء المستخدمين وكلمات المرور. يمكنهم استخدام أمر واحد بشكل فعال لاختبار مئات من كلمات المرور المختلفة. وهذا يسمح لهم بتجاوز أدوات الأمان التي عادةً ما تكتشف هجمات القوة الغاشمة وتمنعها.

والثاني هو جعل الموقع غير متصل بالإنترنت من خلال هجوم DDoS. سيستخدم المتسللون الإشعار العكسي في WordPress لإرساله إلى آلاف المواقع في نفس الوقت. توفر وظيفة xmlrpc.php هذه للمتسللين عددًا لا نهائيًا تقريبًا من عناوين IP لنشر هجوم DDoS.

للتحقق مما إذا كان XML-RPC يعمل على موقعك، يمكنك تشغيله باستخدام أداة تسمى XML-RPC Validator. قم بتشغيل موقعك باستخدام الأداة وإذا حصلت على خطأ، فهذا يعني أنه ليس لديك دعم XML-RPC.

إذا تلقيت رسالة نجاح، فيمكنك إيقاف ملف xmlrpc.php باستخدام أحد الطريقتين أدناه.

الطريقة الأولى: تعطيل Xmlrpc.php باستخدام مكون إضافي

يعد تعطيل XML-RPC على موقع WordPress الخاص بك أمرًا سهلاً للغاية.

اذهب إلى القسم الإضافات › إضافة جديدفي وحدة تحكم المشرف الخاصة بـ WordPress. ابحث عن البرنامج المساعد تعطيل XML-RPCوتثبيته كما في الصورة أدناه:

قم بتنشيط البرنامج المساعد، وبذلك تكون قد انتهيت. سيقوم هذا البرنامج الإضافي تلقائيًا بإدخال الكود اللازم لتعطيل XML-RPC.

ومع ذلك، تذكر أن المكونات الإضافية المثبتة قد تستخدم أجزاء من XML-RPC، ومن ثم قد يؤدي تعطيلها إلى حدوث تعارض بين المكونات الإضافية أو أجزائها الفردية وإخراجها من وضع العمل.

إذا كنت تريد فقط تعطيل عناصر XML-RPC الفردية مع السماح للمكونات الإضافية والميزات الأخرى بالعمل، فابحث عن المكونات الإضافية مثل هذه:

  • إيقاف هجوم XML-RPC. سيوقف هذا المكون الإضافي جميع هجمات XML-RPC، ولكنه سيسمح للمكونات الإضافية مثل Jetpack والأدوات الآلية والمكونات الإضافية الأخرى بمواصلة التشغيل من خلال منحها حق الوصول إلى ملفات xmlrpc.php.
  • التحكم في نشر XML-RPC. يتيح لك ذلك الحفاظ على التحكم والنشر عن بعد.

الطريقة الثانية: تعطيل Xmlrpc.php يدويًا

إذا كنت لا ترغب في استخدام مكون إضافي وتفضل القيام بذلك يدويًا، فاتبع هذا الأسلوب. سيوقف جميع طلبات xmlrpc.php الواردة قبل تمريرها إلى WordPress.

افتح ملف .htaccess. قد يتعين عليك تمكين "إظهار الملفات المخفية" في مدير الملفات أو عميل FTP للعثور على هذا الملف.

الصق هذا الكود في الملف .htaccess:

# منع طلبات WordPress xmlrpc.php رفض الأمر، السماح بالرفض من كل السماح من 123.123.123.123

افكار اخيرة

بشكل عام، كان XML-RPC حلاً قويًا لبعض المشكلات التي جاءت مع النشر عن بعد على موقع WordPress الخاص بك. ومع ذلك، في الوقت نفسه، ظهرت بعض الثغرات الأمنية التي تبين أنها تشكل خطورة كبيرة على بعض أصحاب مواقع WordPress.

للحفاظ على موقعك آمنًا، يوصى بتعطيل xmlrpc.php تمامًا إلا إذا كنت بحاجة إلى بعض الميزات التي يتطلبها النشر عن بعد والمكون الإضافي Jetpack. يمكنك بعد ذلك استخدام المكونات الإضافية للحل البديل التي تسمح لك باستخدام هذه الميزات أثناء تصحيح الثغرات الأمنية.

بمرور الوقت، يمكننا أن نتوقع دمج وظائف XML-RPC في واجهة برمجة تطبيقات WordPress الجديدة التي ستدعم الوصول عن بعد دون التضحية بالأمان.

هل قمت بحظر الوصول إلى XML-RPC عبر مكون إضافي أو يدويًا؟ أو هل كانت هناك أية مشكلات أمنية لأنه كان نشطًا سابقًا؟ شارك تجربتك في التعليقات أدناه.

كل من لديه موقع خاص به يرغب في زيادة أمانه، وإذا لم يكن الأمر كذلك، فهو يريد أن يكون آمنًا دائمًا... في الواقع، في هذه المقالة سوف نقوم بتحليل مبادئ وأساسيات حماية محرك الووردبريس، وعلى وجه التحديد سننظر في مزيد من التفاصيل في الملف xmlrpc.php. لا تنس عمل نسخ احتياطية عند تغيير الملفات أو إجراء أي تغييرات عليها. لنبدأ.

ثغرة WordPress من خلال ملف xmlrpc.php، حل المشكلة:

اسمحوا لي أن أوضح لأولئك الذين لا يعرفون أو لا يفهمون الغرض من هذا الملف. بمساعدتها، يمكنك إدارة مدونة WordPress الخاصة بك من خلال تطبيقات مختلفة. طبعا لا أعلم عن الأغلبية لكني شخصيا لا أستخدم هذا وبناء على ذلك لماذا أترك فرصة إضافية لاختراق الموقع سأزيلها... ففي النهاية هذا الملف موجود ضعيفة للغاية. ومع ذلك، تذكر أنه يمكنك إزالته من الاستخدام، ويمكنك دائمًا إعادته لاحقًا إذا كنت في حاجة إليه.

أولا، دعونا تعطيل الملف xmlrpc.php، تمر عبره الكثير من الهجمات على الموقع، وهذا ليس جيدًا. كالعادة، هناك خياران للقيام بذلك، الأول هو إجراء تغييرات على ملفات .htaccess وfunctions.php، وكذلك header.php (الطريقة الصحيحة في رأيي). وطريقة تثبيت البرنامج المساعد، ولكن المزيد عن ذلك لاحقا. دعنا ننتقل إلى تحرير الملفات.

في ملف jobs.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"))
؟ صفيف("نوع المحتوى: نص/xml"، "التفويض: مصادقة $ الأساسية" )
: "نوع المحتوى: نص/xml\r\nالتفويض: أساسيمصادقة $ " ; //
$context =stream_context_create (array("http" => array(
"الطريقة" => "النشر" ,
"الرأس" => $header ,
"المحتوى" => طلب $
)));
خدمة الويب $ = "http://www.example.com/rpc";
$file = file_get_contents($webservice, false, $context);
استجابة $ = xmlrpc_decode ($ملف);
إذا (xmlrpc_is_fault($response)) (
إرجاع "xmlrpc: $response [faultString] ($response [faultCode])" ؛
) آخر (
إرجاع استجابة $؛
}
?>
1 - ملاحظة المحرر: هذا إصلاح من "SandersWang dt php at gmail dot com"

منذ 16 عاما

السلاسل الثنائية (المضبوطة باستخدام xmlrpc_set_type) تدخل في ملف a ...كتلة كما تتوقع. ولكن بعد كل حرف 80، تقوم هذه الوظيفة بإدراج كيان XML " "، وهو عبارة عن سطر Unicode جديد، كما لو كان يتسبب في التفاف السطر، وهو أمر سخيف بالتأكيد.

على الرغم من أنه قد يكون سخيفًا، إلا أنه يسبب مشكلات حقيقية لبعض خوادم XML-RPC، مثل http://jakarta.apache.org/xmlrpc/ (nee Helma). تجريد تلك الكيانات بشيء مثل

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

يعمل حول المشكلة.

منذ 11 عاما

تجدر الإشارة إلى أن التشفير لا يبدو أنه يقوم بتشفير أي شيء، ما عليك سوى تحديد ما يدخل في رأس XML.

واجهنا مشاكل مع حفظ سلاسل UTF مزدوجة التشفير في قاعدة البيانات عند استخدام هذه الوظيفة، وإرسالها إلى servlet apache xml-rpc وتخزينها في قاعدة بيانات mysql. تم حل المشكلة عن طريق ضبط "escaping" على "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(

طرق خاصة $_؛
خاص $_context؛
خاص $_url;

الدالة __construct ($url, $user, $passwd) (
$auth = base64_encode(sprintf("%s:%s", $user,$passwd));
$this->_context =stream_context_create(array(
"http" => المصفوفة(
"الطريقة" => "النشر"،
"header" => "نوع المحتوى: نص/xml\r\n".
"التفويض: المصادقة $ الأساسية"،

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

$this->registerMethod("Test_HelloWorld");

الدالة __call($methodName, $params) (
إذا (array_key_exists($methodName,$this->_methods)) (
// عند استدعاء وظيفة 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;
) آخر (
// عند استدعاء وظيفة l"objet
call_user_method_array($methodName, $this,$params);
}
}

طريقة تسجيل الوظيفة الخاصة (طريقة ($) (
$this->_methods[$method] = true;
}

يتم استخدام تقنية XML-RPC في نظام WordPress للعديد من الميزات الرائعة مثل pingbacks، وtrackbacks، وإدارة الموقع عن بعد دون تسجيل الدخول إلى لوحة الإدارة، وما إلى ذلك. ولسوء الحظ، يمكن للمهاجمين استخدامه لتنفيذ هجمات 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. قم بتحديث WordPress إلى الإصدار الأحدث مع المكونات الإضافية. بشكل عام، إذا قمت بالمتابعة، فربما تكون قد قرأت عن الحاجة إلى تثبيت الإصدار الأحدث 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 في القالب.

للقيام بذلك، أضف السطر التالي إلى ملف jobs.php الخاص بالقالب:

رفض الطلب، السماح بالرفض من الجميع

أنا شخصياً لم أستخدم الطريقتين الأخيرتين، لأن... لقد قمت بتوصيل البرنامج المساعد Disable XML-RPC Pingback - أعتقد أنه سيكون كافيًا. فقط بالنسبة لأولئك الذين لا يحبون التثبيتات غير الضرورية، اقترحت خيارات بديلة.

  • دعم لإنشاء كل من عملاء وخوادم xmlrpc
  • تشفير وفك تشفير مؤتمت بالكامل أو يدوي بالكامل، من قيم php إلى xmlrpc
  • دعم ترميزات الأحرف UTF8 وLatin-1 وASCII. مع تمكين ملحق php mbstring، يتم دعم المزيد من مجموعات الأحرف.
  • دعم ضغط http لكل من الطلبات والاستجابات، وملفات تعريف الارتباط، والوكلاء، والمصادقة الأساسية وhttps، ومصادقة ntlm، والاحتفاظ بامتداد php cURL
  • التحقق الاختياري من أنواع المعلمات لطلب xmlrpc الوارد
  • دعم أساليب system.listMethods وsystem.methodHelp وsystem.multicall وsystem.getCapabilities
  • دعم ل و ملحقات لxmlrpc
  • إمكانية تسجيل وظائف php الحالية أو أساليب الفئات كخدمات ويب، واستخراج معلومات القيمة المضافة من تعليقات phpdoc
  • تم تضمين مصحح أخطاء مرئي قائم على الويب في المكتبة

متطلبات

  • PHP 5.3.0 أو الأحدث؛ 5.5 أو في وقت لاحق الموصى بها
  • هناك حاجة إلى ملحق php "curl" إذا كنت ترغب في استخدام SSL أو HTTP 1.1 للتواصل مع الخوادم البعيدة
  • هناك حاجة إلى ملحق php "mbstring" للسماح باستقبال الطلبات/الاستجابات في مجموعات أحرف أخرى غير ASCII، وLatin-1، وUTF-8
  • الامتداد الأصلي لـ php "xmlrpc" غير مطلوب، ولكن إذا تم تثبيته، فلن يكون هناك أي تداخل في تشغيل هذه المكتبة.

تحميل

أخبار

  • 1 يوليو 2017
    تم إصدار إصدارات lib 4.2.0 و3.1.0.
    ملاحظات الإصدار متاحة على جيثب
  • 20 يناير 2016
    تم إصدار الإصدار 4.0.0 من lib.
    هذه هي المرة الأولى - على الإطلاق - التي تشهد فيها واجهة برمجة التطبيقات (API) تغييرات كبيرة، حيث تتخلص من الماضي وتبدأ في الانتقال إلى لغة php الحديثة.
    تم تقديم مساحات الأسماء، وتم تعيين الأحرف الافتراضية قيد الاستخدام إذا كان UTF-8؛ تمت إضافة دعم لـ mbstring، وأكثر من ذلك بكثير.
    للحصول على قائمة كاملة بالتغييرات، توجه إلى Github
  • 19 أبريل 2015
    تم إصدار الإصدار 3.0.1 من lib.
  • 15 يونيو 2014
    تم إصدار الإصدار 3.0.0 من lib.
  • 15 ديسمبر 2013
    انتقل المشروع إلى جيثب

    مصحح أخطاء xmlrpc عبر الإنترنت

    يوجد تطبيق مصحح أخطاء تجريبي لـ xmlrpc، مبني فوق هذه المكتبة، نشط على العنوان http://gggeek.altervista.org/sw/xmlrpc/debugger/ . يمكنك استخدام مصحح الأخطاء على سبيل المثال. استعلم عن خادم SF التجريبي، أو قم بتصحيح خادم xmlrpc الشخصي الخاص بك، إذا كان يمكن الوصول إليه على الشبكة.

    تطوير

    وصفالحالة - تم التحديث بتاريخ 2009/07/26
    تحديث الوثائق لجميع الميزات المضافة منذ الإصدار 2يتقدم ببطء...
    إضافة إمكانية اختيار تنسيق رسائل XMLعلى غرار ما يفعله امتداد xmlrpc الأصلي لـ php
    إصلاح التحذيرات المنبعثة عند التشغيل باستخدام PHP 5 في الوضع STRICTربما تم ذلك بالفعل في الإصدار 3.0، والتخلي عن توافق php 4...
    قم بتوسيع وظيفة php التلقائية إلى غلاف أسلوب xmlrpc للاستفادة من معالجة الاستثناءات وإرجاع استجابات أخطاء 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 Security Research في 27 يونيو 2005 ضجة كبيرة. لقد وصل إلى الصفحة الأولى لـSalshdot، وتم ذكره على Netcraft وLWN والعديد من المواقع الأخرى.

    تم إصدار تعليمات تفصيلية حول بناء أكواد الاستغلال البرمجية على الإنترنت، مما جعل العديد من مسؤولي استضافة الويب يتساءلون عن أفضل خطة دفاع، وما هي المخاطر الحقيقية. وهنا بعض الإجابات.

    نطاق المشكلة

    • يؤثر الخطأ على المكتبتين المعروفتين باسم PEAR::XMLRPC وPHPXMLRMPC.
      لا يؤثر ذلك على تطبيق xmlrpc المضمن في php والممكّن في وقت الترجمة باستخدام خيار "--with-xmlrpc" (في Unix، وفي Windows بشكل عام، يتم تمكينه/تعطيله عن طريق تغيير السطر المناسب في php.ini )
    • الخطأ (تنفيذ كود php الذي تم إدخاله بواسطة المضيفين البعيدين) موجود حصريًا في الملف xmlrpc.incفي توزيع phpxmlrpc و RPC.phpفي توزيع الكمثرى
    • أصدر كل من PEAR::XMLRPC وPHPXMLRMPC إصدارات محدثة من المكتبة تعمل على حل المشكلة
    • تم استخدام كلا المكتبتين في عدد كبير من تطبيقات PHP (انظر القائمة غير المكتملة أعلاه).
      نظرًا لأن lib بأكمله يتكون بشكل أساسي من ملفين بسيطين جدًا، يميل الجميع إلى تصحيحهما وفقًا لأذواقهم/احتياجاتهم الخاصة وتجميعهم عند توزيع تطبيقاتهم.
      كانت معظم المشاريع رفيعة المستوى سريعة للغاية في إصدار إصدارات جديدة من التطبيقات الخاصة بها، ولكن الأمر سيستغرق وقتًا أطول بكثير لكل مستخدم لتحديث نظامه.
      ولا بد من القول أن العديد من التطبيقات تم شحنها حتى وقت قريب مع إصدارات قديمة للغاية من مكتبة phpxmlrpc؛ تم إصلاح خطأ الحقن الأول في عام 2001دون أن ينتبه أحد (...)

      وهذا يجعل من الصعب جدًا على مسؤولي النظام العثور على علاج سهل للمشكلة: هناك احتمال كبير أن يتم العثور على الملفات المذكورة أعلاه على خوادم الاستضافة العامة في العديد من الأدلة المختلفة وفي العديد من الإصدارات المختلفة.

    كيف يتم تشغيل الثغرة الأمنية

    • لإثارة الخطأ، يحتاج المهاجم إلى تقييم بعض ملفات XML المعدة خصيصًا أثناء عملية إنشاء كائن xmlrpcval. يتم إنشاء كائنات Xmlrpcval عندما يقوم البرنامج النصي للخادم بفك تشفير طلبات xmlrpc أو عندما تعمل بعض البرامج النصية php كعميل xmlrpc وتقوم بفك تشفير استجابة مرسلة من الخادم.
      البرنامج النصي للخادم خاص بالتطبيق، وغالبًا ما يسمى server.php (ولكن من الممكن استخدام أي مشروع أو متغير يختاره المستخدم)، ويجب أن يتضمن ملفات xmlrpc.inc وxmlrpcs.inc (بالنسبة للإصدار الكمثرى، الخادم .php يعادل xmlrpcs.inc).
    • إن تضمين xmlrpc.inc وxmlrpcs.inc فقط في نصوص php هو (afaik...) آمن تمامًا، بالإضافة إلى الاتصال بهما مباشرة عبر طلبات http، حيث يتم تنفيذ تعريف الوظائف والمتغيرات والفئات فقط في هذين الملفين، أي. لا يوجد تنفيذ فوري للتعليمات البرمجية.
    • إن ملفات server.php وdiscover.php الموزعة بكامل phpxmlrpc lib تقوم بالفعل بتنفيذ خادم xmlrpc مباشر، لذا قد تفكر في منع الوصول إليها أو حتى إزالتها بشكل أفضل إذا وجدتها منشورة على خوادم الإنتاج (من الجزء العلوي من موقعي) يمكنني أن أستحضر نوعًا من الهجوم الذي يتضمن تطبيق php ثانيًا يعاني من اختراق تضمين ملف php لسحبه + استغلال خطأ lib المعروف)

    وسائل الحماية

    • امنح عملية خادم الويب الخاص بك أقل قدر ممكن من امتيازات النظام. في نظام Unix، يتضمن هذا عمومًا تشغيل 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 بإصدار خطأ php بدلاً من إرجاع استجابة xml مناسبة.
    وفقًا للبعض، فإن هذا يستلزم في الواقع "خرقًا أمنيًا للكشف عن المسار" (أي أن رسالة خطأ php المعروضة عادةً ما تحتوي على معلومات حساسة حول مسارات نظام الملفات)، ولكن أي برنامج PHP برمجي واحد يعاني من نفس مشكلة الأمان إذا كان مسؤول النظام يشغل خوادم إنتاج باستخدام التوجيه ini Display_errors=On.
    أعلم أيضًا حقيقة أن هناك العديد من الأماكن في xmlrpc.inc حيث سيؤدي استدعاء دالة بمعلمة غير متوقعة إلى إنشاء تحذير أو خطأ php، وأنا لا أخطط لتنفيذ فحص صارم للمعلمات لكل وظيفة على حدة في أي وقت قريب - إذا كنت تهدف إلى ذلك، إيمهو، يمكنك أيضًا البرمجة بلغة جافا في المقام الأول.

    هل هذه هي نهاية العالم؟

    لا اتمنى.
    والسبب هو أن هناك العشرات من تطبيقات PHP التي تعاني من عمليات استغلال حقن التعليمات البرمجية. ما عليك سوى إلقاء نظرة على المسار الأمني ​​للوحات الإعلانات... ومع ذلك لا يزال الكثير من الأشخاص يعتقدون أن PHP خيار جيد لتطوير الويب.
    تذكر: الأمن هو عملية، وليس حالة يمكن الوصول إليها.

    الاختراق الأمني ​​الأول: سبتمبر 2001

    لقد تلقيت هذه النصيحة من دان ليبي. وبإذنه أعيد نشره هنا. لاحظ أن هذا الاستغلال تم إصلاحه في المراجعات 1.01 والإصدارات الأحدث من XML-RPC لـ PHP. -- Edd Dumbill الثلاثاء 24 سبتمبر 2001 ======== ثغرة أمان PHP: استغلال XML-RPC المحتمل =========== = ========================== الملخص: باستخدام الإصدار الأخير من مكتبة php xmlrpc التابعة لشركة Useful Inc، الإصدار 1.0، من الممكن للمهاجم أن قم ببناء ملف xml بطريقة تخدع مكتبة xml-rpc لتنفيذ تعليمات برمجية php على خادم ويب. لقد تمكنت من تنفيذ تعليمات برمجية php عشوائية، ومع إيقاف تشغيل الوضع الآمن لـ php، تم إصدار أوامر النظام. يمكن للمهاجم بسهولة استخدام هذا كبوابة لإطلاق الفيروسات. التفاصيل: لقد أوضحت المشكلة عن طريق تعديل البرنامج النصي لمثال server.php المتضمن في توزيعة xmlrpc ثم الاتصال به عبر البرنامج النصي client.php، وهو أيضًا جزء من التوزيع. لقد تجاوزت رمز الخادم القياسي، وقمت ببساطة بتكرار الاستجابات مرة أخرى إلى العميل. وتمكنت من جعل العميل ينفذ تعليمات برمجية php عشوائية. ثم قمت باستعادة عينة server.php إلى حالتها الأصلية واستخدمت telnet لإرسال نسخة معدلة request. كما تمكنت أيضًا من تنفيذ تعليمات برمجية على الخادم، وإن كان ذلك يتطلب بناء جملة مختلفًا قليلاً. ويتمحور الهجوم حول استخدام وظيفة eval() الخاصة بـ php. نظرًا لأنني علمت أن مكتبة xml-rpc تستخدم eval لبناء هياكل البيانات الخاصة بها من مدخلات xml، فقد كان الأمر مجرد مسألة هيكلة مدخلات xml بطريقة تجعلها: أ) لا يتم الهروب منها قبل تمريرها إلى التقييم ب) لا عدم إنشاء خطأ في بناء جملة php عادةً، يتم تجاوز كافة البيانات غير الرقمية بواسطة المكتبة قبل تمريرها إلى التقييم. ومع ذلك، اتضح أنه إذا قمت بإرسال علامة، متبوعة بعلامة غير متوقعة، مثل سيتم تجاوز رمز الهروب وسيتم تقييم البيانات "الأولية" بدلاً من ذلك. استغلال العميل: فيما يلي استجابة xml-rpc النموذجية: مرحبا بالعالم عندما يتم تقييم مثل هذه الاستجابة، تبدو كما يلي: new xmlrpcval("hello World", "string") إليك استجابة xml-rpc التي ستنفذ تعليمات برمجية php لصدى "

    مرحبا بالعالم

    "من جانب العميل: "، "سلسلة")؛ صدى "

    مرحبا بالعالم

    "; \$النفايات = المصفوفة("
    في هذه الحالة، السلسلة التي سيتم تقييمها هي: new xmlrpcval(""، "string"); echo "

    مرحبا بالعالم

    "; $waste = array("", "string") من الممكن استبدال كل شيء بين "string"); و\$waste برمز عشوائي بأي طول تقريبًا. وأخيرًا، إليك الكود الذي سيطبع المحتويات من الدليل الحالي: "، "سلسلة")؛ صدى "

    "؛ صدى `ls -al`؛ صدى "

    "؛ خروج؛ \$waste = array("
    استغلال الخادم: استغلال الخادم هو تقريبًا نفس استغلال العميل، باستثناء أن الخادم يستخدم أمر تقييم مختلف، وبالتالي يتطلب بناء جملة بداية ونهاية مختلفين قليلاً لتجنب أخطاء بناء جملة php. إليك نفس الكود المذكور أعلاه، ولكنه سيعمل ضد الخادم. system.listMethods "، "سلسلة"))؛ صدى "

    إذا رأيت قائمة دليل، فقد قمت للتو بتنفيذ PHP ورمز النظام عبر XML-RPC.

    "; echo "الآن سأحاول سرد الدليل باستخدام ls -al:\n "؛ صدى `ls -al`؛ صدى ""; echo "كان بإمكاني استدعاء rm -rf بسهولة، أو كتابة برنامج على القرص وتنفيذه (على سبيل المثال، فيروس) أو قراءة بعض الملفات. طاب يومك.

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