我希望有人能为我回答这个问题,因为我已经对此相当好奇了很长一段时间了,似乎还没有得到答案。然而,我相信这里的人一定能做到,因为这里有一些非常聪明的人。
现在说到问题上。我将使用远程命令执行漏洞作为示例。
<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?>要利用此漏洞,攻击者只需输入{${phpinfo()}}即可。我的问题如下:
{}用于什么?为什么它看起来像一个变量?谢谢!
发布于 2012-09-28 09:00:07
我是Complex (curly) syntax。
函数、方法调用、静态类变量和自PHP5以来{$}工作中的类常量。但是,所访问的值将被解释为定义字符串的作用域中变量的名称。使用单个大括号({})的不适用于访问函数或方法的返回值或类常量或静态类变量的值的。
因此,对于一个简单的变量,单个{}可以工作,就像"{$foo}"一样,但是phpinfo()是一个函数,当您需要调用它时,您需要两个{},这是示例"{${phpinfo()}}",它将调用phpinfo()函数。
这就是为什么discouraged,是e修饰符的原因--例如,对它进行成像
{${eval($_GET['php_code'])}},它使攻击者能够执行任意的PHP代码,因此几乎可以完全访问您的服务器。
要防止出现这种情况,请使用preg_replace_callback()。
发布于 2012-09-28 08:56:23
它称为“复杂(卷曲)语法”,希望这个链接能帮助您:
http://php.net/manual/en/language.types.string.php
https://stackoverflow.com/questions/12636586
复制相似问题