11

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

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

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

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

  1. 大括号是做什么用的{},为什么它看起来像一个变量?
  2. 它有某种名称吗?我不相信这是一个变量函数,因为它们是不同的,不是吗?

谢谢!

4

2 回答 2

8

这是复杂(卷曲)语法

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

所以,对于一个简单的变量, single{}可以工作,就像"{$foo}",但是phpinfo()是一个函数,当你需要调用它时,你需要两个{},你的例子"{${phpinfo()}}",它将调用phpinfo()函数。

这就是不鼓励e使用修饰符的原因,例如,想象这个

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

为了防止这种情况,请preg_replace_callback()改用。

于 2012-09-28T09:00:07.960 回答
2

它称为“复杂(卷曲)语法”希望此链接对您有所帮助:

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

于 2012-09-28T08:56:23.943 回答