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