Tester XML-RPC

XML-RPC permet d’échanger  des données entre un site WordPress et une application externe installée sur un serveur, sur un smartphone….
En utilisant le corps de la requête HTTP(S), et pas seulement l’adresse web (url),  XML-RPC permet d’échanger un volume de données important dans les requêtes : celles qui demandent des données au site et celles pour la réponse du site.

Cet article décrit une solution pour créer et visualiser les échanges XML-RPC avec un site WordPress .

Présentation de XML-RPC

On trouvera une présentation de XML-RPC au début de l’article suivant :

Bloquer XML-RPC, sauf pour …

Haut de page

Utiliser la méthode POST de HTTP

Pour utiliser la fonctionnalité XML-RPC d’un site WordPress, il faut pouvoir accéder à distance au fichier « xmlrpc.php » situé à la racine du site : «http(s)://adresse_mon_monsite/xmlrpc.php».

Si on lance la requête depuis la barre d’adresse d’un navigateur, on doit obtenir le message d’erreur suivant :

Message obtenu : XML-RPC server accepts POST requests only.
Tentative d’accès à XML-RPC par la méthode « GET »

C’est en fait une bonne nouvelle car ce message d’erreur confirme que XML-RPC est disponible pour le site.

Parfois, l’accès est bloqué par l’hébergeur du site. Il faut alors le contacter pour lui demander de lever le blocage.

XML-RPC utilise la méthode « POST » de HTTP, afin de pouvoir insérer des données dans le corps de la requête et pas seulement par un paramétrage de l’adresse web (« query string »). Il n’est donc pas possible de tester XML-RPC depuis la barre d’adresse d’un navigateur.

Il existe différentes solutions : passer par un formulaire en demandant une action de type « POST » ou écrire un programme de test.

Mieux vaut utiliser un utilitaire de requêtage HTTP permettant de :

  • créer les requêtes HTTP à envoyer au site WordPress,
  • visualiser les réponses renvoyées par le site WordPress.
Haut de page

« Fiddler » une application de requêtage HTTP

« Fiddler » est gratuit et se télécharge à l’adresse https://www.telerik.com/download/fiddler.

Après l’avoir installé, lancer Fiddler. La page suivante doit apparaître :

Page d'accueil de l'application Fiddler
Page Fiddler

Pour lancer une requête HTTP conforme au protocole XML-RPC :

  1. cliquer sur l’ongletbouton "Composer",
  2. choisir la méthode « POST »,
  3. saisir l’adresse du fichier « xmlrpc.php » pour le site à tester,
  4. saisir le corps de la requête
  5. cliquer sur le boutonBouton "Execute"
Les différentes zones de saisie d'une requête
Composer la requête HTTP

La partie « type de requête », « adresse web » et « version de protocole » définit l’en-tête de la requête.
Dessous, se trouve la zone de saisie du corps (« body ») de la requête. Il doit respecter les spécifications XML du protocole XML-RPC

Après envoi de la requête, la page Fiddler est modifiée et affiche le corps de la réponse du site WordPress :

  1. L’en tête de la requête envoyée est rappelée en haut de la colonne de droite,
  2. double cliquer sur la description de la requête dans la colonne de gauche,
  3. choisir un mode de visualisation de la réponse dans la partie basse de la colonne de droite,
  4. visualiser la réponse en bas de la colonne de droite
Le corps de la requête de réponse apparaît en bas de la colonne de droite
Visualiser la réponse à une requête

Récupérer une ancienne requête

Il est possible de relancer une précédente requête, éventuellement après l’avoir modifiée.

Après avoir sélectionné l’onglet :

  1. double cliquer sur une ancienne requête dans la colonne de droite; elle apparaît dans la zone de composition de la requête, au centre de la fenêtre,
  2. il est possible de modifier l’adresse web de la requête,
  3. il est possible de modifier le corps de la requête,
  4. cliquer sur le bouton Bouton "Execute"
Séectionner une ancienne requête dans la colonne de droite et la composer comme pour une nouvelle requête
Modifier une ancienne requête
Haut de page

Conserver la trace des requêtes XML-RPC

Les fichiers journaux (logs) fournis par les hébergeurs font généralement apparaître l’en tête des requêtes HTTP mais pas le corps. Pour XML-RPC, il manque donc l’essentiel.

Voici le code d’une extension qui permet de conserver le contenu complet des requêtes XML-RPC :

<?php
/*
Plugin Name: XML-RPC (WPDF)
Author: D Farnier
AuthorURI: http://dfarnier.fr
*/

if ( !defined('ABSPATH') ) exit ('Faites demi-tour !'); // Bloquer si la fonction n'est pas appelée depuis WordPress


//	inscire tous les appels à XML-RPC dans un fichier journal

add_action('plugins_loaded', 'wpdf_mouchard_XMLRPC');

function wpdf_mouchard_XMLRPC () {
	if (substr($_SERVER ['PHP_SELF'],-10)=== 'xmlrpc.php'){
		$wpdf_url = getenv ('REMOTE_ADDR'). ' | '.date('l jS F Y h:i:s A',$_SERVER ['REQUEST_TIME']). ' | '.$_SERVER ['REQUEST_URI'] . "\n";
		file_put_contents(WP_CONTENT_DIR.'/xmlrpc_hook' . date("Ymd"). '.log',$wpdf_url, FILE_APPEND);
		
		if ( ! isset( $HTTP_RAW_POST_DATA ) ) $HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
		file_put_contents(WP_CONTENT_DIR.'/xmlrpc_hook' . date("Ymd"). '.log',$HTTP_RAW_POST_DATA, FILE_APPEND);
		file_put_contents(WP_CONTENT_DIR.'/xmlrpc_hook' . date("Ymd"). '.log',"\n\n", FILE_APPEND);		}	// fin si appel
} // fin fonction wpdf_mouchard_XMLRPC

?>
Conserver la trace des requêtes XML-RPC dans un fichier journal

Nous avons successivement :

  • l‘en-tête de l’extension (entre « /* » et « */ ») en version mimale
  • un test pour vérifier que l’extension est appelée depuis WordPress,
    if ( !defined(‘ABSPATH’) ) exit (‘Faites demi-tour !’);
  • la vérification que le fichier « xmlrpc.php » est appelé depuis l’adresse web (sinon il n’y a pas d’information à recopier dans le fichier journal),
    if (substr($_SERVER [‘PHP_SELF’],-10)=== ‘xmlrpc.php’)
  • la récupération de l’adresse IP appelante, de l’heure de réception et de l’adresse web
    $wpdf_url = getenv (‘REMOTE_ADDR’). ‘ | ‘.date(‘l jS F Y h:i:s A’,$_SERVER [‘REQUEST_TIME’]). ‘ | ‘.$_SERVER [‘REQUEST_URI’] . « \n »;
  • la recopie de ces informations dans le fichier journal
    file_put_contents(WP_CONTENT_DIR.’/xmlrpc_hook’ . date(« Ymd »). ‘.log’,$wpdf_url, FILE_APPEND);

on remarquera que le fichier journal :
est situé dans le répertoire « wp-content » ou équivalent : WP_CONTENT_DIR
est nommé « xmlrpc_hook » suivi de la date du jour: date(« Ymd »)
est suffixé par « .log« 

  • si la variable $HTTP_RAW_POST_DATA est vide, on lui affecte le contenu du corps de la requête (qu’elle contient généralement),
    if ( ! isset( $HTTP_RAW_POST_DATA ) ) $HTTP_RAW_POST_DATA = file_get_contents( ‘php://input’ ); 
  • le corps de la requête est recopié dans le fichier journal
    file_put_contents(WP_CONTENT_DIR.’/xmlrpc_hook’ . date(« Ymd »). ‘.log’,$HTTP_RAW_POST_DATA, FILE_APPEND); 
  • on ajoute un saut de ligne dans le fichier journal
    file_put_contents(WP_CONTENT_DIR.’/xmlrpc_hook’ . date(« Ymd »). ‘.log’, »\n\n », FILE_APPEND);

Voici un exemple de liste de fichiers journaux récupérables via FTP :

Exemple de liste de fichiers journaux accédés par FTP
Fichiers journaux créé par l’extension

Voici un exemple de ce que peut contenir un fichier journal :

Exemple de conteu d'un fichier journal
Lecture d’un fichier journal

 

On constate que le fichier journal contient :

  • des en-têtes de requêtes HTTP
    la troisième en-tête correspond à un appel depuis l’extension « JetPack »; l’adresse web permet d’identifier la provenance (« for=jetpack ») et les informations suivantes servent à l’authentification de la demande
  • un corps de requête HTTP correspondant à l’en-tête situé juste au dessus.

Si vous subissez des attaques en force brute via XML-RPC, cette extension vous permettra d’aller voir le détail de ces attaques, même si vous avez désactivé l’authentification via XML-RPC (« add_filter (‘xmlrpc_enabled’, ‘__return_false’, 1); »).

Haut de page

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *