8.9 PHP 可变变量
PHP 可变变量指的一个变量的变量名可以动态地设置和使用,是 PHP 语言的一种特性,这个特性让我们在操作变量的时候更加灵活方便,但是同时也带来一些安全问题,我们在挖掘到代码执行漏洞的时候就经常需要用到可变变量来执行代码。
我们先用一段代码来理解什么是可变变量,代码如下:
<?php $a='seay' ; $$a='123' ; echo $seay ;? >
在这段代码中,我们并没有直接定义$seay 变量,但是我们来看看最终的输出$seay 的结果是多少,如图 8-13 所示。
图 8-13
从截图中可以看到,输出变量$seay 的值为“123”,这个 123 是在$$a 赋值的,这时候$a 被赋值了"seay",而$$a 就相当于$'seay'。
部分 PHP 应用在写配置文件或者使用 preg_replace() 函数第二个参数赋值变量时,会用到双引号(")来代表 string 类型给变量赋值,在 PHP 语言中,单引号和双引号是有区别的,单引号代表纯字符串,而双引号则是会解析中间的变量,所以当使用双引号时会存在代码执行漏洞,我们来看一个测试,代码如下:
<?php $a="${@phpinfo () }" ;? >
当运行这段代码时,phpinfo() 函数会成功执行,输出内容如图 8-14 所示。
图 8-14
这里有一个地方需要注意,代码${@phpinfo()}中的“@”符号是必须存在的,不然就无法执行,但是除了“@”符号还有其他的写法也一样可以,只要不影响 PHP 规范均可执行,举例如下:
1)花括号内第一个字符为空格:
$a = "${ phpinfo () }" ;
2)花括号内第一个字符为 TAB:
$a = "${ phpinfo () }" ;
3)花括号内第一个字符为注释符:
$a = "${/**/phpinfo () }" ;
4)花括号内第一个字符为回车换行符:
$a = "${ phpinfo () }" ;
5)花括号内第一个字符为加号(+):
$a = "${+phpinfo () }" ;
6)花括号内第一个字符为减号(-):
$a = "${-phpinfo () }" ;
7)花括号内第一个字符为感叹号(!):
$a = "${ ! phpinfo () }" ;
除了这些之外还有一些如~、\等。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论