我希望有人可以为我解答这个问题,因为我已经相当长时间地对此感到好奇,但似乎无法获得答案。 但是,我相信这里有人可以,因为这里有一些非常聪明的人。
现在,问题。 我将使用远程命令执行漏洞作为示例。
<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?>
为了利用这一点,攻击者只需输入{${phpinfo()}}
即可。
我的问题如下:
{}
是什么?为什么它看起来像?
变量?谢谢!
答案 0 :(得分:8)
函数,方法调用,静态类变量和类常量 自PHP 5以来{$}工作。但是,访问的值将是 解释为字符串范围内变量的名称 被定义为。 使用单个花括号({})无效进行访问 函数或方法的返回值或类的值 常量或静态类变量。
因此,对于一个简单的变量,单个{}
将起作用,如"{$foo}"
,但phpinfo()
是一个函数,当您需要调用它时,您需要两个{}
},您的示例"{${phpinfo()}}"
,它将调用phpinfo()
函数。
这就是e
修饰符 气馁 的原因,例如,对此进行成像
{${eval($_GET['php_code'])}}
,它使攻击者能够执行任意PHP代码,因此几乎可以完全访问您的服务器。
要防止这种情况发生,请改用preg_replace_callback()
。
答案 1 :(得分:2)
它称为“复杂(卷曲)语法” 希望这个链接可以帮到你: