phpinfo 有imagick php artisan 没有_代码审计之PHP可变变量

PHP可变变量指的一个变量的变量名可以动态地设置和使用,是PHP语言的一种特性,这个特性让我们在操作变量的时候更加灵活方便,但是同时也带来一些安全问题,我们在挖掘到代码执行漏洞的时候就经常需要用到可变变量来执行代码。

我们先用一段代码来理解什么是可变变量,代码如下:

<?php
    $a='seay';
    $$a='123';
    echo $seay;
?>

在这段代码中,我们并没有直接定义$seay变量,但是我们来看看最终的输出$seay的结果是多少,如图所示

127257815928fddff21914834ef2cd95.png

从截图中可以看到,输出变量$seay的值为“123”,这个123是在$$a赋值的,这时候$a被赋值了"seay",而$$a就相当于$'seay'。

部分PHP应用在写配置文件或者使用preg_replace()函数第二个参数赋值变量时,会用到双引号(")来代表string类型给变量赋值,在PHP语言中,单引号和双引号是有区别的,单引号代表纯字符串,而双引号则是会解析中间的变量,所以当使用双引号时会存在代码执行漏洞,我们来看一个测试,代码如下:

<?php
    $a="${@phpinfo()}";
?>

当运行这段代码时,phpinfo()函数会成功执行,输出内容如图所示

fb1171b16d0fce32b28277960066c05e.png

这里有一个地方需要注意,代码${@phpinfo()}中的“@”符号是必须存在的,不然就无法执行,但是除了“@”符号还有其他的写法也一样可以,只要不影响PHP规范均可执行,举例如下:

  • 花括号内第一个字符为空格:
$a = "${ phpinfo()}";
  • 花括号内第一个字符为TAB:
$a = "${      phpinfo()}";
  • 花括号内第一个字符为注释符:
$a = "${/**/phpinfo()}";
  • 花括号内第一个字符为回车换行符:
$a = "${
phpinfo()}";
  • 花括号内第一个字符为加号(+):
$a = "${+phpinfo()}";
  • 花括号内第一个字符为减号(-):
$a = "${-phpinfo()}";
  • 花括号内第一个字符为感叹号(!):
$a = "${!phpinfo()}";

除了这些之外还有一些如~、等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值