Bash comodines - Manipular globos para eliminar archivos arbitrarios

1

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.

    
pregunta Simon Scannell 20.05.2018 - 14:33
fuente

1 respuesta

2

Pensé en la posibilidad de que pegar un byte NUL ( glob() ) a la ruta causaría que 7.0.27 ignorara la parte después del NUL. Así es exactamente cómo funcionan las cadenas C y los nombres de archivo se pasan a, por ejemplo, Sistema de llamadas como cadenas C.

Pero eso no parece suceder: en mi sistema (PHP glob() de Debian), tanto unlink() como glob() exigen una cadena sin bytes NUL, y se produce un error si se da una. Y cualquier otro carácter sería válido en los nombres de archivo, por lo que %code% no tendría razón para descartar el resto de la ruta.

El posible problema con los NUL se menciona con un ejemplo en el manual en línea, por lo que es posible que alguna versión anterior de PHP haya sido vulnerable. Problemas relacionados con los bytes nulos :

  

Dado que PHP usa las funciones C subyacentes para las operaciones relacionadas con el sistema de archivos, puede manejar bytes nulos de una manera bastante inesperada. Como los bytes nulos denotan el final de una cadena en C, las cadenas que los contienen no se considerarán por completo, sino hasta que se produzca un byte nulo.

    
respondido por el ilkkachu 20.05.2018 - 17:07
fuente

Lea otras preguntas en las etiquetas