DEV Community

Cover image for Creando una puerta trasera en WordPress
Lucas O. S.
Lucas O. S.

Posted on

Creando una puerta trasera en WordPress

Cuando eres freelancer, te llegan clientes de todo tipo, y en algunas ocasiones hay que aceptar trabajos por pura necesidad. Muchas de esas ocasiones puede que el cliente se niegue a pagar el trabajo hasta que lo tenga en mano o hasta que lo tenga subido en su servidor, y es aquí cuando tienes que decidir entre perder un cliente o arriesgarte a que no te pague, en ambas situaciones terminas perdiendo.

En algunas situaciones he tenido que aceptar entregar el trabajo antes de recibir el pago, y ante esta situación lo que hice fue crear una puerta trasera (más conocido como «Backdoor») para acceder al panel de administración si decidían no pagarme. Una vez recibido el pago, accedía al backdoor y eliminaba el código del theme desde el panel de administrador. De esta manera no era un problema de seguridad para el cliente una vez haya concluido el trabajo y se haya recibido el pago.

La puerta trasera es una función bastante simple en la que usamos la función de WordPress llamada wp_set_auth_cookie() para hacer pensar a WordPress que nos hemos logeado en el sistema con la cuenta de administrador, y después usaremos wp_redirect() para redireccionarnos al panel de administración. De esta manera nos saltamos el login de WordPress creando nuestro propio login personalizado a través de una URL.

Ejemplo 1

Esto es un ejemplo básico para que se entienda el concepto y la lógica detrás de este backdoor. No obstante, recomiendo cambiar las variables y añadir algo de seguridad para que no sea un problema mientras esté activo.

Ejemplo 2

El cambio realizado es para que en el código no de la impresión de que es un backdor a primera vista, cambiando el nombre de la función y las variables. Se puede ver un nuevo valor «a» que tiene que ser igual a «acs», después un valor «b» que será el ID de usuario (por defecto sería el ID 1), y un valor «c» que sería la clave de acceso a ese backdoor. La clave de acceso la añado como md5 en el código para después pasar la comprobación del valor «c» con el hash «d». Si «c» es igual al hash md5 añadido en «d», nos dejaría acceder al panel de administrador.

Teniendo nuestro backdoor listo, ahora sólo hace falta añadirlo al theme que hemos creado. Añadimos la función anterior al archivo functions.php del theme y después añadimos la función de WordPress llamada add_action() debajo del backdoor. De esta manera WordPress iniciará el backdoor una vez cargue el theme. Quedaría algo así:

Ejemplo 3

Para acceder al backdoor, sólo tenemos que añadir lo siguiente a la url de la web, usando como ejemplo la función anterior.

Ejemplo 4

Al acceder a esa url, entraremos directamente al panel de administrador de WordPress con la cuenta de administrador, pudiendo hacer lo que queramos hasta que el cliente decida pagar.

IMPORTANTE: Si decides usar este backdoor, te recomiendo que cambies las variables e intentes hacerlo algo más seguro. Este código es de uso didáctico y no me hago responsable de cualquier problema que pueda causarte.

Discussion (4)

Collapse
lito profile image
Lito

Igual que el formulario reciba las variables por POST en vez de GET sería más complicado de descubrir, ya que esas peticiones GET quedarán registradas tal cual en el log del servidor y podrían ser descubiertas :)

Incluso se puede ejecutar desde la consola de desarrollador para evitar dejar rastro de referer:

$.ajax({
    type: 'POST',
    url: '/wp-admin/index.php',
    data: {
        a: 'acs',
        b: '1',
        c: 'password'
    },
    success: function() {
        window.location.href = '/wp-admin/';
    }
});
Enter fullscreen mode Exit fullscreen mode
Collapse
losdev profile image
Lucas O. S. Author

En el caso en el que expongo mi ejemplo me daba igual si deja rastro o no, ya que nadie lo iba a comprobar. Obviamente si se quiere usar para otras cosas en el que si haya ese riesgo entonces si debería usarse de otras formas para no dejar rastro.

Collapse
lito profile image
Lito

Sí, simplemente era como comentario :)