代码之家  ›  专栏  ›  技术社区  ›  Fang

在PHP中处理eval

  •  1
  • Fang  · 技术社区  · 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 工作
    2 回复  |  直到 1 年前
        1
  •  0
  •   Barmar    1 年前

    使用该输入时,替换变量的结果为:

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

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

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

    因此,要在此处注入代码,必须确保输入以在 echo ( ,并且它必须以以前有效的东西结束 ); 。将要插入的附加代码放在这两个部分之间。