Una shell viene usata (e prima eseguita) quando avviene un login interattivo per questo user-id. Inserire un valore come bin / false o / usr / sbin / nologin termina questa sessione e in pratica disconnette l'utente.
Molti servizi / demoni di sistema non utilizzano accessi interattivi e sono avviati da altri processi, tuttavia sono assegnati un ID utente e un id di gruppo, per dirigere le autorizzazioni in esecuzione sui propri processi.
Eseguire una shell attraverso processi come shell_exec()
, system()
o execve()
significa quasi "eseguire una shell con questo UID / GID". Non si verifica alcun processo di accesso, quindi la shell richiesta (/ bin / ...) non viene letta.
Perché succede ancora?
Perché gli umani sono pigri. Iniezione di comando È una cattiva pratica, ma spesso un modo rapido e sporco per fare le cose (eseguire il ping di un sistema, eseguire operazioni sui file, ...). Gli sviluppatori sanno come farlo usando la shell, quindi usa quella conoscenza per eseguire lo stesso. Pensa (sì, codice PHP molto disordinato, ...):
$pattern = $_GET["pattern"];
$fin = fopen('/path/to/your/input/file.txt', 'r');
$fout = fopen('/path/to/your/output/file.txt', 'w');
while (!feof($fin)) {
$line = fgets($fin, 4096);
if (preg_match($pattern, $line)) {
fwrite($fout, $line);
}
}
fclose($fin);
fclose($fout);
O semplicemente
shell_exec("cat input/file.txt | grep ".$_GET["pattern"]." > output/file.txt");
Fa lo stesso in sostanza, ma il secondo è più facile e veloce.