问题 什么是{$​​ {phpinfo()}}? (远程命令执行相关)


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

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

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

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

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

谢谢!


2060
2017-09-28 08:44


起源

哦,花括号到目前为止不是列表的一部分: 参考 - 这个符号在PHP中意味着什么? - hakre


答案:


这是 复杂(卷曲)语法

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

所以,对于一个简单的变量,单一 {} 会工作,像 "{$foo}"但是 phpinfo() 是一个功能,当你需要调用它时,你需要两个 {},这是你的榜样 "{${phpinfo()}}",这会打电话 phpinfo() 功能。

这就是为什么 e 修饰语是 灰心例如,成像这个

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

为防止这种情况,请使用 preg_replace_callback() 代替。


8
2017-09-28 09:00





它称为“复杂(卷曲)语法” 希望这个链接可以帮助你:

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


2
2017-09-28 08:56