Für interessierte Zeitgenossen hier der o.g. [FONT=courier new]wp-config.php[/FONT] Code-Block, der die üblichen Account-Namen prüft bevor Plugins geladen bzw. die Datenbank connected wird, jetzt auch mit einer Vorabprüfung von Daten, die via XML-RPC kommen.
PHP
/* stop brute force account hacking */
$my_username_arr = array( 'admin', 'administrator', 'root', 'test', 'manager', 'server', 'support'
, 'superadmin', 'admin1', 'developer', 'webmaster'
, 'editor', 'wp_admin', 'wpadmin'
);
if ( isset( $_POST ) && isset( $_POST['log'] ) && ( // normal login form
strpos( $_POST['log'], '{' ) !== false // e.g. '{domain}' '{domen}'
|| strpos( $_POST['log'], ' ' ) !== false // names with space chars
|| ( in_array(
strtolower( trim( $_POST['log'] ) ),
$my_username_arr
)
)
) ) {
// redirect to a protected folder to trigger the apache 403 & apache error-log
header( 'Location: http://' . $_SERVER['SERVER_NAME'] . '/wp-forbidden/' );
exit;
} else if ( defined( 'XMLRPC_REQUEST' ) && !empty( $HTTP_RAW_POST_DATA ) ) { // xmlrpc.php
global $my_input;
$my_input = substr( $HTTP_RAW_POST_DATA, 0, 262144 ); // look into first 256Kb only
$my_input = strtolower( preg_replace( "/\s/i", '', $my_input ) ); // remove whitespace
if ( strpos( $my_input, '<methodcall>' ) !== false ) {
function my_username_filter( $var ) {
global $my_input;
// look for username in every(!) entry of xml, could cause false positive
return ( strpos( $my_input, '>' . $var . '<' ) !== false );
}
$my_username_arr = array_filter( $my_username_arr, 'my_username_filter' );
if ( !empty( $my_username_arr ) ) {
header('Content-Type: text/xml; charset=UTF-8');
echo '<?xml version="1.0" encoding="UTF-8"?'.'>';
?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>405</int></value>
</member>
<member>
<name>faultString</name>
<value><string>XML-RPC services are disabled on this site.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
<?php
exit;
}
}
}
Alles anzeigen
Wird in den XML-RPC Daten irgendwo ein Account-Name erkannt, bekommt der Angreifer eine Rückmeldung wie wenn XML-RPC abgeschaltet wäre.
Man könnte auch [FONT=courier new]403/Incorrect username or password.[/FONT] senden, aber dann würden die Scripts wahrscheinlich weiterraten.