2012-09-28 34 views
11

我希望有人能为我回答这个问题,因为我已经相当好奇了很长一段时间,似乎还没有能够获得答案。 但是,我确定这里有人能够做到,因为这里有一些非常聪明的人。

现在,问题。 我将以远程命令执行漏洞为例。

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

要利用此攻击者只会输入{${phpinfo()}}例如。 我的问题如下:

  1. 哪些括号{}以及为什么它看起来像一个 变量?
  2. 它是否有某种名称?我不相信这是一个可变的功能,因为它们不同,不是吗?

谢谢!

+1

哦,花括号不是目前列表中的一部分:[参考 - 这是什么符号在PHP中的意思?](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol -mean功能于PHP) – hakre

回答

8

这是Complex (curly) syntax

功能,方法调用,静态类变量和类常量,因为PHP 5 内{$}工作。但是,访问的值将为 ,该值被解释为定义字符串 的范围内的变量的名称。 使用单个大括号({})将不起作用访问 函数或方法的返回值或类 常量或静态类变量的值。

所以,一个简单的变量,单{}会的工作,像"{$foo}",但phpinfo()是一种功能,当你需要调用它,你需要两个{},你的例子"{${phpinfo()}}",将调用phpinfo()功能。

这就是为什么e修改为气馁,例如,成像这个

{${eval($_GET['php_code'])}},这给攻击者执行任意PHP代码的能力,因此让他几乎完全访问您的服务器。

为防止出现这种情况,请改用preg_replace_callback()