在 PHP 中处理 eval

问题描述 投票:0回答:1

免责声明:这只是一个了解 PHP 代码注入的示例,而不是以任何方式使用的生产代码。我完全意识到这不是良好的编码实践。

我有以下 PHP 脚本:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Sample Script</title>
  </head>
  <body>
    <h1>Sample page</h1>
    <p>Now doing the maths. Please enter a formula to compute. Example: 1+1.</p>
    <form method="get">
      <p>Formula: <input type="text" name="maths" /></p>
      <p><input type="submit" value="compute" /></p>
    </form>
<? 
  if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") )
    { 

      echo "<p>The result is: ";
      eval("echo (".$_REQUEST["maths"].");");
      echo "</p>";
    }
?>
  </body>
</html>

这个脚本很容易受到 PHP 代码注入的攻击,我可以通过它来破坏它(我主要是通过试验和错误发现的)。

$a='1');phpinfo();echo($a

但是,我不完全明白发生了什么。根据我的理解,我需要完成 echo 语句,插入我自己的代码(例如 phpinfo()),然后编写另一个函数(例如 echo)来处理右括号。

我认为这样的事情会起作用:

");phpinfo();echo("

但是,这不能作为注入使用,因为 phpinfo 被视为字符串的一部分并且不会由 eval 进行评估。 我也尝试过逃避引号,但无济于事。

问题:

  • 在这里注入代码的正确方法是什么?
  • 为什么
    $a='1');phpinfo();echo($a
    有效?
php code-injection
1个回答
0
投票

当您使用该输入时,替换变量的结果是:

eval("echo ($a='1');phpinfo();echo($a);");

因此,这会分配

$a='1'
,并回显该分配的结果(分配给
$a
的值)。然后它执行
phpinfo()
。最后它再次回响
$a

如果您尝试使用

);phpinfo();echo(
它不起作用,因为它尝试执行
echo ()
。但
echo
需要至少 1 个参数。

© www.soinside.com 2019 - 2024. All rights reserved.