PHP可变变量指的一个变量的变量名可以动态地设置和使用,是PHP语言的一种特性,这个特性让我们在操作变量的时候更加灵活方便,但是同时也带来一些安全问题,我们在挖掘到代码执行漏洞的时候就经常需要用到可变变量来执行代码。
我们先用一段代码来理解什么是可变变量,代码如下:
<?php
$a='seay';
$$a='123';
echo $seay;
?>
在这段代码中,我们并没有直接定义$seay变量,但是我们来看看最终的输出$seay的结果是多少,如图所示
从截图中可以看到,输出变量$seay的值为“123”,这个123是在$$a赋值的,这时候$a被赋值了"seay",而$$a就相当于$'seay'。
部分PHP应用在写配置文件或者使用preg_replace()函数第二个参数赋值变量时,会用到双引号(")来代表string类型给变量赋值,在PHP语言中,单引号和双引号是有区别的,单引号代表纯字符串,而双引号则是会解析中间的变量,所以当使用双引号时会存在代码执行漏洞,我们来看一个测试,代码如下:
<?php
$a="${@phpinfo()}";
?>
当运行这段代码时,phpinfo()函数会成功执行,输出内容如图所示
这里有一个地方需要注意,代码${@phpinfo()}中的“@”符号是必须存在的,不然就无法执行,但是除了“@”符号还有其他的写法也一样可以,只要不影响PHP规范均可执行,举例如下:
- 花括号内第一个字符为空格:
$a = "${ phpinfo()}";
- 花括号内第一个字符为TAB:
$a = "${ phpinfo()}";
- 花括号内第一个字符为注释符:
$a = "${/**/phpinfo()}";
- 花括号内第一个字符为回车换行符:
$a = "${
phpinfo()}";
- 花括号内第一个字符为加号(+):
$a = "${+phpinfo()}";
- 花括号内第一个字符为减号(-):
$a = "${-phpinfo()}";
- 花括号内第一个字符为感叹号(!):
$a = "${!phpinfo()}";
除了这些之外还有一些如~、等。