追踪shell命令的来源

rob*_*lls 1 php shell bash centos

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

sh: list_price: command not found
Run Code Online (Sandbox Code Playgroud)

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

And*_*ore 7

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

$commandResult = `ls -l`;
echo $commandResult; // Will output a directory listing of the current directory
Run Code Online (Sandbox Code Playgroud)

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

$commandResult = '`ls -l`';
echo $commandResult; // Will output `ls -l`;
Run Code Online (Sandbox Code Playgroud)

现在,你可能做了这样的事情:(下面的懒惰代码,对 sql 注入不安全,但只是一个例子)。

$query = 'SELECT * FROM sometable ORDER BY ' . `list_price`;
Run Code Online (Sandbox Code Playgroud)

但是忘记在它周围加上引号,导致两件事:

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

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