什么是{$​​ {phpinfo()}}? (远程命令执行相关)

时间:2012-09-28 08:44:16

标签: php security code-injection

我希望有人可以为我解答这个问题,因为我已经相当长时间地对此感到好奇,但似乎无法获得答案。 但是,我相信这里有人可以,因为这里有一些非常聪明的人。

现在,问题。 我将使用远程命令执行漏洞作为示例。

<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?>

为了利用这一点,攻击者只需输入{${phpinfo()}}即可。 我的问题如下:

  1. 大括号{}是什么?为什么它看起来像? 变量?
  2. 它有某种名字吗?我不相信它是一个可变函数,因为它们不同,不是吗?
  3. 谢谢!

2 个答案:

答案 0 :(得分:8)

这是Complex (curly) syntax

  

函数,方法调用,静态类变量和类常量    自PHP 5以来{$}工作。但是,访问的值将是   解释为字符串范围内变量的名称   被定义为。 使用单个花括号({})无效进行访问   函数或方法的返回值或类的值   常量或静态类变量。

因此,对于一个简单的变量,单个{}将起作用,如"{$foo}",但phpinfo()是一个函数,当您需要调用它时,您需要两个{} },您的示例"{${phpinfo()}}",它将调用phpinfo()函数。

这就是e修饰符 气馁 的原因,例如,对此进行成像

{${eval($_GET['php_code'])}},它使攻击者能够执行任意PHP代码,因此几乎可以完全访问您的服务器。

要防止这种情况发生,请改用preg_replace_callback()

答案 1 :(得分:2)

它称为“复杂(卷曲)语法” 希望这个链接可以帮到你:

http://php.net/manual/en/language.types.string.php