本来想写篇长点的文档的,后来想想这个东西已经被各路牛人实战得无比纯熟了,所以我就只简单的说一下这个东西。

记得我刚接触PHP安全的时候,问几位大牛怎么入门,他们总是和我说去看PHP手册吧,安全就是基础。

没错,我要说的东西在PHP手册里就有非常详细的说明:.net/manual/zh/language.variables.variable.php">http://php.net/manual/zh/language.variables.variable.php,所以强烈要求看了手册后再接着往下看!

可变变量是PHP一个非常方便的特性,手册里已经说了,可变变量的意思就是一个变量的变量名可以动态的设置!

那么变量的变量名可以动态设置会产生什么安全问题呢?下面来看看:

<?php
$a = 'phpinfo';
$a();
?>

这段代码很容易理解,变量的类型是字符型phpinfo,变量动态加上了(),于是变量变成了phpinfo函数动态执行了!

 

按照同样的原理我们引用手册中可变变量的例子:

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

$a()这个动态函数放入动态变量,当然我这个说法有点不专业,还是可变变量,我们会发现phpinfo函数还是执行了!

 

看过手册还有我给出的这个例子的话,大家一定觉得这个一点都不神奇,这就是PHP的语法特性,然后我们把这个东西再进化缩成一行:

<?php

$a = "${${phpinfo()}}";

?>

这是一个2个嵌套的可变变量,我们只是按照上面一个例子将可变变量的内容自己填写进去了,实际上就是把某个函数赋给某个变量,所以phpinfo函数最终执行了,也就化成了各种漏洞和webshell的原型!

 

看到这里大家应该知道了,为什么当初大牛们要我去看PHP手册吧,然而本文到这里就结束了么,咱还漏了一点,大牛说了安全就是基础,咱其实还没把这个东西搞清楚,为什么前面例子的变量是用的单引号,而后面的最终的例子用的是双引号,如果你想到了这个问题,我觉得你做安全肯定非常有潜力,以后保不准就是一大牛!

 

PHP中单引号和双引号的区别还是和变量有关,来看下面的例子:

<?php
$a = 'phpinfo()';
echo $a; //输出phpinfo()字符串
echo '$a'; //输出$a字符串
echo "$a"; //输出phpinfo()字符串
?>
双引号里的内容会再经过PHP的语法解析变量,而单引号里的内容就直接定性为字符串了!

 

所以本文到这里就真正结束了,于是大家应该也都明白了,当初牛人为什么和我说多看PHP手册和安全就是基础的深意。

转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/1903.html