auto_prepend_file y auto_append_file

auto_prepend_file y auto_append_file son dos configuraciones de PHP que permiten básicamente hacer que un fichero específico se incluya al inicio (auto_prepend_file) o final (auto_append_file) de cada ejecución.

Son dos directivas que hace años se usaban bastante pero con la arquitectura moderna de los programas ya no son necesarios (trabajando por medio de includes, requires o Composer).

No obstante siguen teniendo su cabida, un ejemplo es el plugin de seguridad de Wordpress, Wordfence el cual usa auto_prepend_file para añadir un fichero que hace de firewall, al ser el primer código que se ejecuta en cualquier acceso a Wordpress, permite realizar diferentes análisis en la petición y poder filtrarla en caso de ser sospechosa antes de que afecte a la web.

La seguridad es el caso ejemplo que vamos a poner con esta directiva, un caso habitual es el de una web hackeada, se desinfecta, reinstala y al poco tiempo vuelve a suceder, existe una vía de entrada pero no se localiza.

Los registros muestran las peticiones vía POST que lo causan, no obstante en webs como Wordpress todas pasan por el fichero index.php por lo que no se conoce que plugin es vulnerable dado que los registros no almacenan el contenido de estas peticiones.

Usando auto_prepend_file podemos añadir un fichero para que se ejecute en cada acceso y con un pequeño código en dicho fichero, guardar en un registro el valor de las peticiones al completo para disponer de información detallada.

Paso a paso

Creamos un fichero php en public_html llamado log.php con el contenido:

<?php

$currentLink = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$currentDateTime = date("Y-m-d h:i:sa");
$postData = file_get_contents('php://input');
file_put_contents('/home/CPANEL_USUARIO/post_log.txt', $currentDateTime . ' - '.  $currentLink . PHP_EOL . $postData, FILE_APPEND);

Debemos modificar CPANEL_USUARIO por nuestro usuario de cPanel.

Este script lee la dirección a la que accede el usuario, y la guarda en el fichero post_log.txt junto al contenido enviado vía POST y la fecha y hora.

Tras esto en el fichero .htaccess de public_html añadimos justo al inicio:

php_value auto_prepend_file '/home/CPANEL_USUARIO/public_html/log.php'

Nuevamente cambiamos el usuario de cPanel por el correspondiente.

Y listo, el registro post_log.txt guardará todas las peticiones que podremos usar para depurar el problema.

Importante desactivar esta función una vez terminemos de analizar la causa, ejecutar un fichero en cada petición y guardar estos datos penalizará en el rendimiento y generará un fichero .txt que puede llegar a ocupar varios Gigabytes si se mantiene activo en el tiempo.