追踪 shell 命令的来源

追踪 shell 命令的来源

在我们的一台服务器的 apache 错误日志(/usr/local/apache/logs/error_log)中,我们看到一个 shell 命令经常运行,但却抛出了错误,它看起来像这样:

sh: list_price: command not found

list_price 是我们在 50 多个网站的电子商务系统中使用的字段,当然没有什么可疑之处。问题是我们不知道它是如何传递给 shell 的 - 我们检查了所有出现的 exec() 和 system(),但就是看不出它是如何传递的。有没有办法让我们更容易地检测出这个的来源,因为没有比我上面所说的更有意义的输出。仅供参考,这是在运行 CentOS 5 的服务器上,有问题的网站都是 PHP。

答案1

反引号 (`) 在 PHP 中有特殊含义。它们是执行操作符(听起来很残酷,不是吗)。当在字符串外部用作文本分隔符时,它会执行它们之间的命令。例如:

$commandResult = `ls -l`;
echo $commandResult; // Will output a directory listing of the current directory

要停止该行为,您只需将其放在单引号(')或引号(“)之间:

$commandResult = '`ls -l`';
echo $commandResult; // Will output `ls -l`;

现在,您可能做了类似的事情:(下面的惰性代码,对于 SQL 注入不安全,但仅仅是一个示例)。

$query = 'SELECT * FROM sometable ORDER BY ' . `list_price`;

但忘记加上引号,导致两件事:

  • PHP 没有给您语法错误,因为它是有效的语法。
  • 您将获得上述失败的 shell 命令。

在您的代码库中搜索任何对 list_price 的引用,并确保它位于单引号或引号之间。

答案2

你正在用吗反引号围绕 list_price 而没有引用它们?这可能是您的问题。

答案3

您肯定忽略了某些东西,无意冒犯。也许您可以尝试创建 list_price shell 脚本,以便它可以写入一些日志文件,记录执行方式和时间?

相关内容