Se utiliza un shell (y se ejecuta por primera vez) cuando se produce un inicio de sesión interactivo para este ID de usuario. Poner un valor como bin / false o / usr / sbin / nologin termina esta sesión y, esencialmente, cierra la sesión del usuario.
Muchos servicios / daemons del sistema no utilizan inicios de sesión interactivos y otros procesos los inician. Sin embargo, se les asigna un ID de usuario y un ID de grupo para dirigir los permisos bajo los cuales se ejecutan los procesos.
Ejecutar un shell a través de procesos como shell_exec()
, system()
o execve()
significa "ejecutar un shell bajo este UID / GID". No se está produciendo un proceso de inicio de sesión, por lo que no se lee el shell requerido (/ bin / ...).
¿Por qué sigue ocurriendo?
Porque los humanos son perezosos. Inyección de comandos Es una mala práctica, pero a menudo es una forma rápida y sucia de hacer las cosas (hacer ping a un sistema, realizar operaciones de archivos, ...). Los desarrolladores saben cómo hacerlo utilizando el shell, así que usa ese conocimiento para realizar lo mismo. Piensa en (sí, código PHP muy desordenado, ...):
$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 simplemente
shell_exec("cat input/file.txt | grep ".$_GET["pattern"]." > output/file.txt");
En esencia, hace lo mismo, pero la segunda es más fácil y más rápida.