Acceso FTP = acceso total WordPress

Acceso FTP con WordPress

Esta entrada no pretende ser muy extensa, veremos si lo consigo.

Es habitual que en tareas en las que hay que arreglar algún problema en la web de un cliente, no nos proporcione todos los datos que necesitamos.

El acceso más completo que nos pueden dar es por medio de SSH, que con un usuario con los permisos adecuados, significa que tendremos un acceso total a la cuenta del usuario, si exceptuamos el acceso al panel de control del hosting.

Pero en muchas ocasiones el hosting no dispone de acceso SSH, hay que solicitar que lo creen desde el servicio técnico, etc. y el acceso a la cuenta por medio de FTP suele ser algo bastante común.

Pero también necesitaríamos un acceso como administrador a la web en WordPress y un acceso a la base de datos y en ocasiones nuestro cliente no sabe como crearnos un usuario y no quiere darnos el suyo… y no digamos la Base de datos, que no tiene ni idea casi ni lo que es.

Con un acceso FTP podemos tener la llave de entrada a todas esa opciones, vamos a verlo, además porque hace un par de días se me ha dado un caso «peculiar» en el que el acceso FTP me ha solucionado una vez más la papeleta.

La problemática

Tenía que migrar una web de un servidor a otro de una compañía diferente y me dan acceso a los dos paneles de control de ambos hostings.

El hosting origen tiene un panel de control.. digamos «limitado» o mejor dicho «muy limitado», comienzo creando un usuario FTP.

Me conecto sin problemas y comienzo la descarga del sitio web completo en WordPress. La descarga de todos los archivos funciona sin problemas (17,5GB con fotos de 6MB y similares), excepto el archivo wp-config.php en la carpeta raíz de la instalación, que como sabemos, es dónde están diversos datos de conexión.

Los permisos del archivo no permiten su descarga y después de intentar cambiarlos por medio del cliente FTP, aunque sin esperanza, nada funciona, por lo que es imposible descargar este archivo.

El hosting no dispone de un gestor de archivos vía web, sólo un «FTP web» con la misma problemática.

Tiene una opción para descargar todo el sitio web en una carpeta comprimida en formato zip, pero falla en todos los intentos.

Para hacer una copia de la Base de datos, entro al phpMyAdmin que si proporciona el hosting, pero pide usuario y clave de la base de datos. El usuario está visible en la administración de BD, pero no la clave y si la cambio, dejará de funcionar la web (recordemos que no puedo modificar el archivo de configuración de WordPress).

Llegados a este punto, sabemos que hay varios plugins de WordPress que permiten exportar la BD y otras opciones similares como insertar un administrador de BD dentro del WordPress, pero no me gustan estas opciones para hacer algo desde dentro del gestor de contenidos que en realidad pertenece a la gestión del Stack, además de cargar más una instalación que incluso puede fallar con esta sobrecarga.

La solución

La solución es muy fácil y evidente, pero hay ocasiones que no pensamos en lo más fácil y nos complicamos. En mi caso pensé «tengo acceso FTP, tengo acceso a todo lo que esté en el raíz, e incluso más», por lo que mi hack fue subir un archivo PHP que simplemente leía el contenido del archivo wp-config.php y lo descarga.

Podría haber escrito los contenidos en otro archivo o mostrarlo en pantalla, pero lo más cómodo era que el navegador me ofreciese descargar el nuevo archivo con los contenidos del wp-config.php del sistema.

El código es el siguiente:

<?php
die( '<h1>Are you searching something? Ask me here https://elarroyo.club/ ;)</h1>' );

$file = 'wp-config.php';

if ( file_exists( $file ) ) {
     header( 'Content-Description: File Transfer' );
     header( 'Content-Type: application/octet-stream' );
     header( 'Content-Disposition: attachment; filename="' . basename( $file ) . '"' );
     header( 'Expires: 0' );
     header( 'Cache-Control: must-revalidate' );
     header( 'Pragma: public' );
     header( 'Content-Length: ' . filesize( $file ) );
     readfile( $file );
     exit();
} else {
     echo 'File do not exists';
}

En primer lugar comentamos la línea 2 con el die()y subimos el archivo al raíz de nuestro sitio WordPress con el nombre que queramos.

Accedemos al archivo desde el navegador https://web-mi-sitio.com/archivo-subido.php y nos aparecerá para descarga el archivo que hayamos indicado en la línea 4, es decir, en nuestro caso el archivo wp-config.php.

Descargar archivo

Recordad que en realidad no estamos descargar dicho archivo, sino leyendo sus contenidos, copiándolos en un nuevo archivo y descargándolo con el mismo nombre que tenía el original.

La lectura del archivo y volcado al nuevo archivo la estamos realzando con readfile( $file ) mientras leemos su tamaño con filesize( $file ) y le damos el mismo nombre a la descarga con basename( $file ). El forzado desde el navegador a que se decargue el archivo lo realizamos con las cabeceras header que vemos en el script.

Acordaros tan pronto descarguéis el archivo, de eliminar este script del servidor o descomentar la línea 2 con el die() que siempre añado en este tipo de scripts para que no se me olvide y que en el servidor este peligroso backdoor, que aunque sea intencionado, no deja de ser un agujero de seguridad.

Otras utilidades

Antes he comentado que tenemos acceso total al WordPress si tenemos acceso al FTP.

Bien, tan pronto leemos este archivo wp-config.php tenemos el nombre de la base de datos utilizada, el usuario y clave de la misma, que ahora ya pude utilizar para autenticarme correctamente en el phpMyAdmin, pero ¿Qué pasa si el hosting no lo tiene disponible?

Pues sencillamente que subimos nosotros uno. Vamos a la página de phpMyAdmin y nos descargamos una copia, la descomprimimos en nuestro ordenador en una carpeta y la subimos al servidor.

La carpeta del phpMyAdmin subida al servidor la podemos renombrar a lo que queramos, por ejemplo dfhakjsiypxckrqhafdk y accedemos al mismo desde https://web-mi-sitio.com/dfhakjsiypxckrqhafdk/ con los datos que tenemos del archivo de configuración.

En la mayoría de las ocasiones no necesitamos un phpMyAdmin completo y nos llega con la funcionalidad de Adminer, que es un único archivo, que igualmente podemos renombrar a lo que queramos y subirlo al servidor para por ejemplo acceder a su interface desde https://web-mi-sitio.com/rrhvvmc48357nmf.php

Aunque ambos pedirán los datos de acceso a la base de datos, es recomendable que una vez que hayamos realizado el trabajo, eliminemos el directorio (phpMyAdmin) o el archivo (Adminer).

Con acceso al sistema de archivos y ahora también a la base de datos, ya tenemos todo el sistema bajo nuestro control y podríamos crear un usuario en WordPress desde la base de datos, pero para no complicarnos con consultas directamente a la Base de datos, vamos a utilizar este pequeño script:

<?php
 /**
 Create an mu-plugins/ directory in your site’s wp-content/ directory.
 Upload this file to the wp-content/mu-plugins/ directory you created.
 Login to the site using the information you just edited.
 Once you have logged in, delete this file.
 */ 
 add_action(
     'init',
     function() {
         $username      = 'nuestro_usuario';
         $password      = '$nuestra_clave-conSegur1dad&%';
         $email_address = '[email protected]';
         if ( ! username_exists( $username ) ) {
             $user_id = wp_create_user( $username, $password, $email_address );
             $user    = new WP_User( $user_id );
             $user->set_role( 'administrator' );
          }
      }
 );

Lo guardamos con cualquier nombre como por ejemplo wp-create-admin-user.php y lo subimos al directorio de mu-plugins y vamos a cualquier página del sitio web, como por ejemplo a la de autenticación, en la que introducimos el usuario y clave que hemos puesto en el script y ya estaremos dentro del WordPress como administradores.

A continuación borramos el script, porque el usuario ya está creado en el sistema.

Todos los archivos que están en el directorio de mu-plugins se ejecutan automáticamente cada vez que entramos en WordPress y antes de cualquier plugin o tema. El que hemos subido nosotros, lo único que hace es comprobar que no exista un usuario con el mismo nombre del que queremos crear, y de ser así, lo crea con permisos de usuario administrador.

Si no borramos el script, no hará nada, porque al existir el usuario no lo vuelve a crear, pero estaremos haciendo una comprobación innecesaria en cada ejecución. Eso si, con el script en el directorio mu-plugins aunque borren nuestro usuario, se volverá a crear automáticamente.

Conclusión

Como veis, con el simple acceso FTP podemos hacer de todo en el servidor del cliente, o en nuestro servidor. No es tan completo como SSH, ni mucho menos, además de ser lento, pero desde luego que nos salvará la papeleta en más de una ocasión.

Lo que se puede hacer es desde luego muchísimo más amplio, pero creo que con estos tres ejemplos, nos damos una idea de todo lo que se puede hacer y nos ayudará en los problemas más frecuentes.

Como última nota, muchos servidores suben el archivo wp-config.php a un nivel superior del raíz del sitio web, para que no esté con acceso público. Con una mínima modificación del script arriba mostrado, también podemos leer archivos que estén a un nivel superior como el caso comentado.

Un último apunte. Yo utilizo este script para crear usuario de WordPress en muchas instalaciones de clientes, pero siempre, SIEMPRE le solicito permiso previo al cliente para crear el usuario administrador de WordPress, la cuenta de FTP, etc., se trata de ahorrarle trabajo al cliente, pero no de realizar acciones sobre su cuenta sin su permiso.

Bueno, al final no me ha quedado tan corta como pretendía esta entrada 🙂

Deja un comentario