Actualmente estoy auditando un complemento y tengo la siguiente situación (simplificada para propósitos de ejemplo):
<?php
$post_id = false;
$absolute_path = "/var/www/html/wordpress/cache";
$extension = ".min.css";
$filename = $_GET['filename']; // I have complete control over the $filename variable
$absolute_path = $absolute_path . "/{$post_id}/{$filename}-[0-9]*{$extension}";
$files = glob($absolute_path);
foreach($files as $file) {
unlink($file);
}
?>
El punto es que quiero aprovechar esta situación para eliminar archivos arbitrarios en el sistema, lo que podría llevar a la ejecución remota de código. El problema es que controlo $filename
, pero algo se agregará más adelante.
glob()
es una función en PHP que usa la coincidencia de patrones para encontrar archivos y directorios. glob
usa los comodines del sistema.
Cuando expandes la variable $absolute_path
, este es el resultado:
/var/www/html/wordpress/cache//I-HAVE-CONTROL-OVER-THIS-PART-[0-9]*.min.css
Mi objetivo es obtener el siguiente resultado: que glob()
devuelva la ruta a wp-config.php
( /var/www/html/wordpress/cache/../../wp-config.php
)
Para lograr esto, tendría que conseguir que glob
"ignore" todo lo que viene después de la parte que controlo o algún otro bypass. ¿Hay alguna manera de hacer esto?
Ya intenté depurar glob()
en sí mismo, pero no conozco más.