Consultas SQL por
XML-RPC no WordPress
XML-RPC
● Chamadas a procedimentos remotos
● Formato XML
● Dave Winer, 1998
● Implementação: Servidor RPC, clientes RPC
● WordPress possui servidor
default on
Chamada XML-RPC
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>40</i4></value>
</param>
</params>
</methodCall>
Resposta XML-RPC
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
Funções XML-RPC no WordPress
function mynamespace_subtractTwoNumbers( $args ) { $number1 = (int) $args[0];
$number2 = (int) $args[1]; return $number1 - $number2; }
function mynamespace_new_xmlrpc_methods( $methods ) { $methods['mynamespace.subtractTwoNumbers'] = 'mynamespace_subtractTwoNumbers'; return $methods; } add_filter( 'xmlrpc_methods', 'mynamespace_new_xmlrpc_methods');
Autenticação em WP XML-RPC
function mynamespace_getUserID( $args ) { global $wp_xmlrpc_server;
$wp_xmlrpc_server->escape( $args ); $blog_id = $args[0];
$username = $args[1]; $password = $args[2];
if ( ! $user = $wp_xmlrpc_server->login( $username,
$password ) )
return $wp_xmlrpc_server->error;
return $user->ID; }
function mynamespace_new_xmlrpc_methods( $methods ) {
$methods['mynamespace.getUserID'] = 'mynamespace_getUserID'; return $methods;
}
Segurança em WP XML-RPC
Autenticação em WP XML-RPC
POST /news/xmlrpc.php HTTP/1.1 Host: 127.0.0.1
User-Agent: LiveCode/7.1.1 ( Client ) Content-Type: text/xml Content-Length: 311 Authorization: b730db0864b0d4453ba6a26ad6613cd4|| 3fac15f99f7a178f922bcc4942e62dc9001b2a45118fc3a6f3aebd77d25f4d58 <?xml version="1.0"?> <methodCall> <methodName>wp.getPosts</methodName> <params> <param> <value><i4>1</i4></value> </param> <param> <value><string></string></value> </param> <param> <value><string></string></value> </param> </params> </methodCall>
Riscos desta autenticação
Para esta linha “AUTHORIZATION” ser exposta ao PHP, o servidor Web Apache pode precisar deste comando no arquivo .htaccess da raiz ou no arquivo de configuração do Apache httpd.conf (sob a tag <VirtualHost>):
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Riscos
“Essa regra define uma variável de ambiente com os dados do cabeçalho de
autorização – que é exatamente como funciona a falha Shellshock exposta com strings User Agent (alguns sistemas definiam variáveis de ambiente para
HTTP_USER_AGENT da mesma forma)”.
SQL query por WP XML-RPC
<?php /**
* Plugin Name: XML-RPC SQL Query * Plugin URI:
http://meiradarocha.jor.br/news/livecode/2014/09/02/plugin-wordpress-permite-consultas-sql-por-xml-rpc/
* Description: Does a SQL query through XML-RPC. * Version: 0.0.1.0
* Author: José Antonio Meira da Rocha * Author URI: http://meiradarocha.jor.br * License: GPL2
SQL query por WP XML-RPC
function vid_SQLquery( $args ) { global $wp_xmlrpc_server;
// Uncomment to use default WordPress database object //global $wpdb ; $blog_id = $args[0]; $username = $args[1]; $password = $args[2]; $server = $args[3]; $database = $args[4]; $query = $args[5];
SQL query por WP XML-RPC
if ( ! $user = $wp_xmlrpc_server->login( $username,
$password ))
return $wp_xmlrpc_server->error;
// Comment to use default WordPress database object // Constants DB_USER and DB_PASSWORD are defined // in wp_config.php.
SQL query por WP XML-RPC
$response = $wpdb->get_results($query, OBJECT);
// If there is database connection error if ($wpdb->error)
return $wpdb->error ;
// If there is SQL error if ( $wpdb->last_error)
return ("SQL error: ".$wpdb->last_error) ;
// If there is no errors return $response;
SQL query por WP XML-RPC
function vid_new_xmlrpc_methods( $methods ) {
$methods['vid.SQLquery'] = 'vid_SQLquery'; return $methods;
}
add_filter( 'xmlrpc_methods', 'vid_new_xmlrpc_methods' }
Bibliografia
Principais referências:
XML-RPC: https://en.wikipedia.org/wiki/XML-RPC
Acesso ao banco de dados WordPress:
http://codex.wordpress.org/Class_Reference/wpdb
Acesso a banco de dados diferente do default:
http://wordpress.stackexchange.com/questions/1604/using-wpdb-to-connect-to-a-separate-database
Estendendo os procedimentos remotos: http://codex.wordpress.org/XML-RPC_Extending
Página do plugin:
http://meiradarocha.jor.br/news/livecode/2014/09/02/plugin-wordpress-permite-consultas-sql-por-xml-rpc/