Categories
PHP WordPress

WordPress: Llamadas múltiples en XML-RPC

XML-RPC es un protocolo de llamada a procedimiento remoto que usa XML para codificar los datos y HTTP como protocolo de transmisión de mensajes, creado por Dave Winer (Userland Software) y Microsoft en 1998

Según WikiPedia, XML-RPC es un protocolo de llamada a procedimiento remoto que usa XML para codificar los datos y HTTP como protocolo de transmisión de mensajes, creado por Dave Winer (Userland Software) y Microsoft en 1998.

A pesar de que este protocolo tiene mucho más tiempo de lo que yo con el uso de computadoras, recién hace 3 meses que conozco de la existencia de éste y algo que me llama la atención es el soporte para invocar múltiples métodos en una sola petición HTTP -- aunque en realidad depende si el servidor XML-RPC implementa/soporta este tipo de llamadas.

Por ejemplo, el servidor XML-RPC de WordPress soporta este tipo de llamadas gracias a Incutio XML-RPC Library:

php:

<?php
require_once( './class-IXR.php' );

$client = new IXR_ClientMulticall( 'http://www.buayacorp.com/xmlrpc.php' );

$client->debug = true;

$client->addCall('demo.sayHello');
$client->addCall('demo.addTwoNumbers', 10, 1);

$client->query();

print_r($client->getResponse());
?>

Lo que se envía y recibe del servidor:

code:

POST /xmlrpc.php HTTP/1.0
Host: www.buayacorp.com
Content-Type: text/xml
User-Agent: The Incutio XML-RPC PHP Library (multicall client)
Content-length: 652

<?xml version="1.0"?>
<methodCall>
<methodName>system.multicall</methodName>
<params>
<param><value><array><data>
  <value><struct>
  <member><name>methodName</name><value><string>demo.sayHello</string></value></member>
  <member><name>params</name><value><array><data>
</data></array></value></member>
</struct></value>
  <value><struct>
  <member><name>methodName</name><value><string>demo.addTwoNumbers</string></value></member>
  <member><name>params</name><value><array><data>
  <value><int>10</int></value>
  <value><int>1</int></value>
</data></array></value></member>
</struct></value>
</data></array></value></param>
</params></methodCall>

<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><array><data>
<value><string>Hello!</string></value>
</data></array></value>
<value><array><data>
<value><int>11</int></value>
</data></array></value>
</data></array>
</value>
</param>
</params>
</methodResponse>

Array
(
    [0] => Array
        (
            [0] => Hello!
        )

    [1] => Array
        (
            [0] => 11
        )

)

Haciendo uso de este tipo de llamadas y gracias a ciertas características de WordPress, fue posible hacer funcionar el tan publicitado exploit para una vulnerabilidad que afecta a casi todas las versiones de este CMS.