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

use*_*335 11 php security code-injection

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

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

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

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

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

谢谢!

xda*_*azz 8

这是复杂(卷曲)语法.

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

因此,对于一个简单的变量,单个{}将起作用,"{$foo}"但是phpinfo()是一个函数,当你需要调用它时,你需要两个{},你的例子"{${phpinfo()}}",它将调用phpinfo()函数.

这就是为什么不鼓励使用e修饰符,例如,对此进行成像

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

为防止这种情况,请preg_replace_callback()改为使用.