追踪shell命令的来源

在我们的一个服务器的apache错误日志(/ usr / local / apache / logs / error_log)中,我们看到一个经常运行的shell命令,它会抛出一个错误,如下所示:

sh: list_price: command not found 

list_price是我们在超过50个网站的电子商务系统中使用的字段,当然没有可疑的。 问题是我们不知道如何传递给shell – 我们已经检查了exec()和system()的所有事件,我们不知道这是如何传递的。 有没有什么办法可以更容易地发现这个来源是什么,因为没有什么比上面提到的更有意义的输出。 仅供参考,在运行CentOS 5的服务器上,所涉及的站点都是PHP

反引号(`)在PHP中有特殊的含义。 他们是执行操作员 (听起来很不对劲)。 当在string之外用作文本分隔符时,它在它们之间执行命令。 对于以下示例:

 $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`; 

但忘了引号,导致2件事:

  • PHP没有给你一个语法错误,因为它是有效的语法。
  • 你得到上面的失败的shell命令。

search您的代码库中的任何list_price参考,并确保它在单引号或引号之间。

您是否在list_price附近使用反引号 ,而不引用它们? 这可能是你的问题。

你必须俯视一些东西,没有冒犯的意思。 也许你可以尝试创buildlist_price shell脚本,以便它可以写一些日志文件,以及如何和何时执行?