执行从数组构建的字符串时,PHP 的 eval() 函数是否容易受到代码注入的影响?

信息安全 php 开发 注射 代码审查 代码执行
2021-09-09 10:05:32

我正在尝试了解有关 PHP eval() 开发的更多信息,并且遇到了这种情况:

<?php

$test = array();
$test[0] = "command0 ";
$test[1] = $_GET["cmd1"];
$test[2] = "command2 ";
$test[3] = "command3 ";

$params = "";
for ($i = 0; $i < count($test); $i++) {
        $params .= "\$test[$i]";
}

echo $params;
echo "<br>";

$cmd = "echo \"" . $params . "\";";
echo $cmd;
echo "<br>";

eval($cmd);
?>

我尝试将双引号和反斜杠的几种组合注入 $_GET 参数,但没有成功突破 $cmd 字符串。

除了 XSS 漏洞之外,这个代码片段是否容易受到攻击?这可以被滥用于 PHP 代码注入吗?

2个回答

不,这不容易受到 PHP 代码注入的影响。

传递给的字符串eval()根本不受用户控制。$_GET["cmd1"]从源到接收器没有路径eval()

  • 的论据eval()$cmd
  • $cmd由固定的字符串和 组装而成$params
  • $params是从一个固定的字符串和 累加的$i
  • $i是一个迭代变量,它取决于数组的(固定)长度$text

也就是说,通过 eval 传递生成的数组肯定不是一种好的风格,而且你显然没有清理输出,这使得代码容易受到 XSS 的攻击。

您在此处评估的代码实际上是完全固定的,因此此处无法进行 PHP 代码注入。

得到eval编辑的代码总是:

echo "$test[0]$test[1]$test[2]$test[3]";

它将这些变量作为字符串数据引用,这是安全的(针对 XSS 除外)。