Quanto può fare / ottenere un utente malintenzionato in PHP con l'esecuzione di una funzione?

4

Sto raccogliendo idee per illustrare un caso che ho visto una volta in cui un attaccante in pratica poteva arrivare a una situazione semplificata come segue (non scherzando):

<?php
    $fcall = $_GET['fcall'];
    $fcall();
?>

phpinfo() è il primo ad iniziare con.

    
posta Anders 25.05.2016 - 06:42
fonte

2 risposte

2

Utilizzo di funzioni PHP integrate

Con solo queste due righe, penso che sia improbabile che tu possa fare molto più di phpinfo, perché non sembra possibile passare argomenti alla funzione, il che riduce drasticamente le tue opzioni.

Sembra che ci sia una certa confusione nei commenti e in altre risposte, quindi per essere chiari: i valori di $_GET sono considerati come stringhe, non come codice PHP. Ciò significa che nessuna delle opzioni fornite - funzioni anonime, esecuzione di codice arbitrario, utilizzando "echo hello"->system , utilizzando exec('rm -r /') - funzionerà.

Non puoi nemmeno perdere altre informazioni oltre a phpinfo - ad es. get_current_user -, in quanto il risultato della chiamata non viene echeggiato.

Potrebbero esserci alcuni casi oscuri che potrebbero essere considerati vulnerabilità. Ad esempio, con determinate impostazioni SSRF / DOS tramite ingres_connect potrebbe essere possibile (sebbene inverosimile).

Utilizzo del codice circostante

Oltre alla perdita di phpinfo, ciò significherebbe che è necessario sfruttare il codice circostante. Alcune possibilità potrebbero essere:

  • DOS tramite una chiamata di funzione molto costosa
  • Ignora autenticazione
  • Filtro bypass
  • ...

Fondamentalmente, il codice ti dà il controllo sul flusso di controllo dell'applicazione, ed è quello che devi sfruttare.

Questo non è limitato alle sole funzioni incluse. Dalla versione 5.4.0, puoi anche chiamare i metodi di qualsiasi classe inclusa:

fcall[]=MyClass&fcall[]=myFunction

Ma ancora una volta, non puoi creare nuovi oggetti tramite questo codice:

$_GET['fcall'] = array(new MyClass, "myFunction");
$fcall = $_GET['fcall'];
$fcall();

Il problema è lo stesso di prima: $_GET è trattato come stringa, rendendolo non funzionante non appena il valore viene effettivamente passato al server invece di codificato.

    
risposta data 25.05.2016 - 11:36
fonte
0

La risposta corretta è; dipende molto dalla tua base di codice .

Ciò consentirebbe tutti i tipi di difetti logici. Mentre spero tu non stia scrivendo applicazioni bancarie in php, immagina se lo hai fatto e un utente malintenzionato potrebbe chiamare ripetutamente approveLoan() o una funzione simile.

Che cosa succederebbe se l'utente malintenzionato potesse chiamare validateAdmin() per impostare un flag admin nella sessione.

O chiama qualcosa come imageConvert() che chiama in modo insicuro exec(convert $_POST['filename']....) ma non è sfruttabile a causa della convalida dell'input in upload.php.

La valutazione dei dati forniti dall'utente utilizzando eval() o direttamente in una funzione è generalmente una cattiva pratica di sicurezza.

    
risposta data 30.05.2016 - 04:27
fonte

Leggi altre domande sui tag